尝试使用dronekit-python(实际机器)


介绍

此页为

让我们制作一个无人机操作系统

这是

的一页。
如果要查看整体,请返回上一页。

总览

在上一篇文章中,使用Dronekit-Python,
模拟中与无人机的通信和连接已完成。

接下来,尝试连接飞行控制器。
首先尝试USB,然后再进行遥测连接。

准备的事情

  • 上次使用的Linux PC
    (安装了dronekit的Raspberry Pi也可能)

  • 飞行控制器:Pixhawk系列
    如果还连接了GPS和电源模块,则更好的

我也在APM 2.8上尝试过。
我还没有尝试过Pixhack 1 2或Pixhawk4 3,但我认为可以。
pixhawks.png

Navio和Navio2 4不是USB或串行连接,因此
Connection_strings将更改。

您现在要尝试荔枝 5吗?

  • 固件:ArduPilot系列
    可以使用直升飞机(Ardu Copter)或流动站(Ardu Rover)。
    我认为PX4系列还可以,但是我还没有尝试过。

  • USB电缆:Micro USB电缆
    通常使用什么设置Pixhawk都没有关系。

  • 遥测设备:一种连接到Telem 1或2的设备
    您可以使用通常使用的遥测设备。

示例:
Eames制造:无线遥测单元2.4GHz发射机/接收机套件
Https://store.shopping.yahoo.co.jp/elab-store/ld013.html

?DJI制造:Datalink 900 PRO
Https://www.dji.com/jp/datalink-pro/info
*请将波特率更改为115200bps。

?DIY:用XBee S2C等自己制作。
示例:XBee S2C(购买2个单位)
https://www.switch-science.com/catalog/list/786/

PC侧板:XBee USB适配器修订版2
Https://www.switch-science.com/catalog/3495/
无人机侧板:XBee 5V接口适配器
https://www.switch-science.com/catalog/1216/

?非法:可以从Amazon等购买的433MHz或915MHz遥测设备。
Https://www.amazon.co.jp/dp/B01A8E8XWO
*如果您购买的是国外制造的Pixhawk,则可能会随附,但是
该频率在日本是非法的,不应使用。
除了3DR制造的原始3DR广播之外,
复印产品无法连接?有很多麻烦,例如通信即将断开,所以
我很害怕,不想使用它。遥测被切断。 .. ..

提前准备

对于USB连接和遥测连接,请使用串行端口。
具体来说,在Linux中,它是一个叫做" / dev / tty nachara"的家伙。

示例:
?/ Dev / ttyACM0
通过USB连接APM或Pixhawk时,它将变为ACM。与Arduino相同。
?/ Dev / ttyUSB0
如果是FTDI或SiLabs的USB串行转换IC,则将是USB。遥测在这里。

用于连接调制解调器的串行端口,因此
访问权限归拨出组所有。 (您拨打)

假设当前登录到Ubuntu Linux的用户
让我们也参加daialout。它与-a相加。

添加拨出访问权限

1
$sudo usermod -a -G dialout ログインユーザ名

键入

sudo chmod a+rw /dev/ttyなんちゃら
您可以授予所有人读/写权限,但
如果拔下USB设备,它将恢复为其原始状态。
chmod只是一个临时措施。
添加拨出组更加容易。

这项工作与在Linux上开发Arduino时的工作相同。

尝试使用USB连接

中,就像使用Mission Planner或QGround Control一样,
让我们通过USB将其连接到PC进行尝试。

程式

这是在dronekit-sitl中使用的hello_jp.py稍作修改的程序。

connection_string是" / dev / ttyACM0,115200"。
使用USB时,这是115200bps的高速。

复制以下内容或
或者,右键单击此处,然后选择[另存为]。

hello_usb.py

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#!usr/bin/env python
# -*- coding: utf-8 -*-
print( "dronekitスタート" )    # 開始メッセージ

# 必要なライブラリをインポート
from dronekit import connect    # フライトコントローラやシミュレータへ接続するのがdronekit内にあるconnect
import time                     # ウェイト関数time.sleepを使うために必要

# 接続文字列の作成
connection_string = "/dev/ttyACM0,115200"       # USB接続だとttyACM、ボーレートは115.2k

# フライトコントローラ(FC)へ接続
print( "FCへ接続: %s" % (connection_string) )    # 接続設定文字列を表示
vehicle = connect(connection_string, wait_ready=True)    # 接続

#Ctrl+cが押されるまでループ
try:
    while True:
        # vehicleオブジェクト内のステータスを表示
        print("--------------------------" )
        print(" GPS: %s" % vehicle.gps_0 )          # GPSがないとゼロのまま
        print(" Battery: %s" % vehicle.battery )    # パワーモジュールがないとゼロのまま
        print(" Last Heartbeat: %s" % vehicle.last_heartbeat )
        print(" Is Armable?: %s" % vehicle.is_armable )     # ARM可能か?
        print(" System status: %s" % vehicle.system_status.state )
        print(" Mode: %s" % vehicle.mode.name )

        time.sleep(1)

except( KeyboardInterrupt, SystemExit):    # Ctrl+cが押されたら離脱
    print( "SIGINTを検知" )

# フライトコントローラとの接続を閉じる
vehicle.close()


print("終了.")    # 終了メッセージ

程序执行

执行

文件。

1
$python hello_usb.py

执行结果

重复执行示例的结果,直到按Ctrl c按下以下显示为止。

执行结果

1
2
3
4
5
6
7
--------------------------
 GPS: GPSInfo:fix=1,num_sat=0
 Battery: Battery:voltage=0.0,current=None,level=None
 Last Heartbeat: 0.674198211
 Is Armable?: False
 System status: STANDBY
 Mode: STABILIZE

如果未启用GPS或电源模块,则该数字将为零。
另外,如果各种校准(加速度和罗盘)未完成,
Is Armable?:也保持为False。

在需要GPS的飞行模式中,GPS Fix也是Armable的要求。

尝试使用遥测连接

接下来,从飞行控制器和断开USB电缆的连接。
让我们尝试使用遥测连接。
telemetry.png

飞行控制器的电源应由电源模块提供。
如果要通过USB提供5V电压,请为手机使用移动电池。

显示信息(下行侧)

以前的USB连接是什么?
唯一的区别是,connection_string现在是" / dev / ttyACM0,57600"。

右键单击此处,然后选择[另存为]。

通信速度取决于遥测设备的性能。基本上是57600bps。
*使用DJI Datalink 900 Pro时,请将其设置为115200bps。
用Mission Planner的完整参数列表/树重写。

hello_telem.py

1
2
3
4
5
6
省略

# 接続文字列の作成
connection_string = "/dev/ttyUSB0,57600"       # テレメトリ接続だとttyUSB、ボーレートは57.6k

省略

执行。

1
$python hello_telem.py

我能够通过遥测连接到dronekit。

飞行模式更改(上行链路侧)

仅获取数据并不有趣,所以让我们做点新的事情。
通过键盘输入更改飞行模式

如何获取键盘输入

首先,如何在Python中进行键盘输入,
如果使用普通输入功能,程序将停止等待输入。
(阻止功能)

kbhit用C语言编写的功能,
Arduino中的Serial.available函数
我想要一个监视功能。

在下面的链接中有一个库可以做到这一点,所以
将其另存为kbhit.py
http://code.activestate.com/recipes/572182-how-to-implement-kbhit-on-linux/

如果将此kbhit.py放在与编写的程序(.py)所在的文件夹相同的位置,
该功能将可用。

我也会放在这里。

让我们暂时检查一下操作。

1
$python kbhit.py

当您执行

时,一个句点将显示在屏幕上。
如果输入任何键(不允许使用Ctrl和Shift等功能键),则程序将结束。

省略和说明

kbhit.py的用法,以便满足以下三个条件。

(1)导入kbhit.py

1
from kbhit import *

(2)在程序的开头(导入后)写这两行

1
2
atexit.register(set_normal_term)
set_curses_term()

(3)检查循环中是否有按键输入(与C语言编写相同)

1
2
if kbhit():     # 何かキーが押されるのを待つ
    key = getch()   # 1文字取得

如果您掌握

kbhit.py,则不仅是dronekit,而且是
使用python进行机器人编程的开发效率将得到提高。

例如,

?用于前进,后退和转弯之类的运动命令
?用于调整,例如参数更改
数据管理,例如保存和加载

可以考虑

等。

根据击键

更改飞行模式

现在,让我们使用kbhit.py与dronekit链接。

复制以下内容或
或者,右键单击此处,然后选择[另存为]。

change_mode.py

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
#!usr/bin/env python
# -*- coding: utf-8 -*-
print( "dronekitスタート" )    # 開始メッセージ

# 必要なライブラリをインポート
from kbhit import *                 # kbhitを使うために必要(同じフォルダにkbhit.pyを置くこと)
from dronekit import connect        # connectを使いたいのでインポート
from dronekit import VehicleMode    # VehicleModeも使いたいのでインポート
import time                         # ウェイト関数time.sleepを使うために必要

# kbhit()を使うための「おまじない」を最初に2つ書く
atexit.register(set_normal_term)
set_curses_term()

# 接続文字列の作成
connection_string = "/dev/ttyUSB0,57600"       # テレメトリ接続だとttyUSB、ボーレートは57.6k

# フライトコントローラ(FC)へ接続
print( "FCへ接続: %s" % (connection_string) )    # 接続設定文字列を表示
vehicle = connect(connection_string, wait_ready=True)    # 接続

#Ctrl+cが押されるまでループ
try:
    while True:
        if kbhit():     # 何かキーが押されるのを待つ
            key = getch()   # 1文字取得

            # keyの中身に応じて分岐
            if  key=='s':               # stabilize
                mode = 'STABILIZE'
            elif key=='a':              # Alt Hold
                mode = 'ALT_HOLD'
            elif key=='p':              # PosHold
                mode = 'POSHOLD'
            elif key=='l':              # loiter
                mode = 'LOITER'
            elif key=='g':              # guided
                mode = 'GUIDED'
            elif key=='t':              # auto
                mode = 'AUTO'
            elif key=='r':              # RTL
                mode = 'RTL'
            elif key=='d':              # land
                mode = 'LAND'

            vehicle.mode = VehicleMode( mode )  # フライトモードの変更を指示

        # ここはif文と同じインデントなので,キーに関係なく1秒に1回実行される
        # 現在のフライトモードを表示
        print("--------------------------" )
        print(" Mode: %s" % vehicle.mode.name )

        time.sleep(1)

except( KeyboardInterrupt, SystemExit):    # Ctrl+cが押されたら離脱
    print( "SIGINTを検知" )

# フライトコントローラとの接続を閉じる
vehicle.close()

print("終了.")    # 終了メッセージ

执行

文件。

1
$python change_mode.py

执行结果

您可以看到飞行模式已更改为与

键相对应。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
--------------------------
 Mode: STABILIZE
--------------------------
 Mode: STABILIZE
--------------------------
 Mode: STABILIZE
--------------------------
 Mode: ALT_HOLD
--------------------------
 Mode: ALT_HOLD
--------------------------
 Mode: ALT_HOLD
--------------------------
 Mode: LOITER
--------------------------
 Mode: LOITER
--------------------------
 Mode: POSHOLD
--------------------------
 Mode: POSHOLD

节目说明

取决于key = getch(),所采用的键控代码
我只是传递了飞行模式字符串。

编写飞行模式的字符串以根据程序进行切换。
使用" ALT_HOLD"容易出错。
它被称为AltHold,但始终必须使用'_'下划线。
(我不需要PosHold)

结论

这次,我使用dronekit向实际的飞行控制器发送了命令。

老实说,仅此一点一点都不有趣。
最有趣的是移动它。

下次,进行ARM /撤防,起飞和着陆,航路点移动等。
我想解释一下无人机的实际操作。

移动实际的机器有些危险,因此我将再次返回sitl。

  • CUAV页面https://store.cuav.net/index.php?

  • CUAV页面https://cuav.taobao.com/?

  • Holybro页面https://shop.holybro.com/pixhawk-4_p1089.html?

  • Emlid页面https://emlid.com/navio/?

  • 无人机页面https://dronee.aero/pages/lychee?