2. 二次开发入门教程
-
Ardupilot开源无人机二次开发入门系列教程
-
Z410-4B单目版教程
Z410单目版在基础版配置上,扩展了树莓派4B机载电脑。目前该系统集成了数据遥测转发,高清视频回传,ROS,mavros,Dronekit-python等。我们需要先配置好网络,通过PC远程连接到树莓派,进而实现对无人机的操作。
-
树莓派能做什么,为什么要扩展树莓派?
树莓派是一款基于ARM的微型电脑主板,英文名:Raspberry Pi。是一款入门及的机载电脑。它能够通过串口连接使用 MAVLink 协议与飞控进行通信。这可用于执行额外的任务,例如:通过python、ROS编程实现对无人机的飞行控制;通过安装单目相机实现图像识别,由于存储图像的内存要求,单靠飞控根本无法完成这些任务。
-
如何对无人机的树莓派进行操作?
-
2.1 建立网络连接:
-
将电池插上BB响报警器,绑扎在底板上。无人机连接电池插口,即可启动。启动后先不要挪动无人机,等待飞控和树莓派启动系统,大概2分钟左右。系统启动后自动启动WIFI热点。
WIFI****名称:ACopter
密码:12345678
将笔记本WIFI连接到树莓派热点。
注意!
WIFI信号范围最大30米左右。 -
2.2 使用树莓派遥测转发功能,将无人机与地面站进行连接
-
树莓派集成了飞控数据遥测转发的功能,相当于一个路由器。这样我们可以通过WIFI网络远程连接飞控和PC端地面站软件。
演示视频:
注意!
如果不能通过UDP连接,请先关闭windows防火墙。 -
2.3 使用树莓派的图传功能,可实时回传视频到地面站
-
树莓派集成了高清图传回传功能,可以将USB摄像头拍摄的实时高清信号图像回传到PC端地面站软件、或则图像播放软件,如:VLC media player。
-
MP地面站软件显示高清视频需要先安装GStreamer。
下载链接及教程: https://pan.baidu.com/s/1AyvQNj2m4E4fMHS6JYnpJA
提取码:f7c3
-
安装好GStreamer以后,视频回传操作参考以下视频:
-
2.4 PC访问树莓派的3种方式:
-
方法1:windows系统下通过远程桌面访问树莓派:
1.打开windows远程桌面;
2.填入树莓派IP:10.42.0.10,点 连接;
3.在终端输入用户名:ubuntu,密码:123456abc;
4.确认后即可连接到树莓派桌面(注意:远程桌面连接占用带宽比较大,速度略有卡顿是正常的。
-
参考视频:
方法1优点:有桌面系统,直观可看。对初学者来说比较容易接受;
方法1缺点:远程桌面会占用很多资源,导致卡顿;
-
方法2:windows系统下通过PUTTY访问树莓派:
-
在PC端安装PuTTY,下载链接:https://the.earth.li/~sgtatham/putty/latest/w64/putty-64bit-0.75-installer.msi
-
启动PuTTY,填写树莓派IP:10.42.0.10,密码:123456abc
-
-
参考视频:
方法2优点:访问执行速度快,需要同时使用MP地面站和终端命令行比较方便;
方法2缺点:命令行显示,对初学者来说不直观;需要远程调用ubuntu系统下的窗口不能用这个方法。
-
方法3:ubuntu系统下远程访问树莓派:
1.笔记本打开一个终端,使用下面的命令修改笔记本上的hosts文件:
sudo vim /etc/hosts
将树莓派4b的IP地址(10.42.0.10)加入到hosts文件中,并保存退出。
参考视频:
关于vim编辑器的使用,可以参考以下教程的部分内容:
https://mp.weixin.qq.com/s/BEIZ9fa09WYrImbKcRT7NA
方法3优点:执行速度快,ubuntu系统下可以做更多的开发
方法3缺点:不能同时使用MP地面站
-
2.5 树莓派的关机操作
注意!
树莓派是机载电脑,突然断电有可能造成系统损坏无法开机。建议大家使用以下2种方式进行正常的关机操作。 -
方法1: 在命令行终端,输入关机命令
sudo halt
-
方法2:通过web管理界面关机
-
参考视频:
注意!
树莓派关机以后,等待大概1分钟左右,树莓派电源指示灯熄灭,再断开无人机电池。 -
2.6 使用Dronekit测试连接飞控并读取状态数据
-
Dronekit介绍:
Dronekit也叫DroneKit-Python,是一个用于控制无人机的Python库。有了它你就可以在机载电脑上通过Python编程实现对无人机的控制。它可以显着增强自动驾驶性能,为飞行器增加更多智能,以及执行计算密集或时间敏感的任务(例如,计算机视觉,路径规划或3D建模)。除了DroneKit-Python以外,还有DroneKit-Android以及DroneKit-Cloud的API供不同的开发者使用。API通过MAVLink与飞控通信。它提供对连接飞控的遥测,状态和参数信息的编程访问,并实现任务管理和对飞行器运动和操作的直接控制。
相比之下,Dronekit比搭建ros来控制无人机更容易上手一些。
对于Dronekit,PX4(原生固件)被支持的较少,目前不可以进行模式切换。而对Ardupilot(APM固件)支持的比较多,可调用的函数也比较多。
单目版机型我们已经在树莓派上安装好Dronekit,并且在根目录下有一个test文件夹,存放了几个演示示例,大家可以根据下面的教程操作。
-
如果想了解树莓派与pixhawk飞控具体如何连接,以及如何安装dronekit的过程,可参考以下链接有详细介绍:
-
1.运行连接示例
使用Dronekit代码读取飞控当前状态,测试树莓派与飞控之间通讯是否正常:
1.无人机连接电池,笔记本开启一个终端窗口;
2.通过ssh命令,连接无人机上的树莓派;
3.将路径切换到test文件夹:
cd test
4.运行connect.py脚本:
python2 connect.py
成功运行后,会显示如下信息:
说明树莓派通过Dronekit读取到了目前飞控的数据:系统警报、固件版本、姿态数据、电池电量、解锁状态、当前飞行模式等等。这样就成功运行了第一个DroneKit-Python脚本。
注意!
如若出现连接异常超时警报,请检查物理连接(usb转TTL模块)是否连接好;或则打开connect.py程序查看连接端口是否为ttyUSB0;无人机通电后如果长时间没有使用串口,串口有可能关闭,无人机重新启动,再执行以上程序。
-
如果想查看connect.py脚本,可通过vim编辑器查看,执行如下命令:
sudo vim connect.py
其中脚本注释如下:
-
飞控软件版本
print "Autopilot Firmware version:%s"% vehicle.version
-
全球定位信息(经纬度,高度相对于平均海平面)
print "Global Location:%s"% vehicle.location.global_frame
-
全球定位信息(经纬度,高度相对于home点)
print "Global Location (relative alttud):%s"%vehicle.location.global_relative_frame
-
相对home点的位置信息(向北、向东、向下);解锁之前返回None
print "Local Location:%s"%vehicle.location.local_frame
-
无人机朝向(欧拉角:roll,pitch,yaw,单位为rad,范围-π到+π)
print "Attitude:%s"% vehicle.attitude
-
三维速度(m/s)
print "Velocity:%s"% vehicle.velocity
-
GPS信息
print "GPS:%s"% vehicle.gps_0
-
地速(m/s)
print "Groundspeed:%s"% vehicle.groundspeed
-
空速(m/s)
print "Airspeed:%s"% vehicle.airspeed
-
云台信息(得到的为当前目标的roll, pitch, yaw,而非测量值。单位为度)
print "Gimbal status:%s"% vehicle.gimbal
-
电池信息
print "Battery:%s"% vehicle.battery
-
EKF(拓展卡曼滤波器)状态
print "EKF OK?:%S"% vehicle.ekf_ok
-
超声波或激光雷达传感器状态
print "Rangefinder:%s"% vehicle.rangefinder
-
无人机朝向(度)
print "Heading:%s"% vehicle.heading
-
是否可以解锁
print "Is Armable?:%s"% vehicle.is_armable
-
系统状态
print "System status:%s"% vehicle.system_status.state
-
当前飞行模式
print "Mode:%s"% vehicle.mode.name
-
解锁状态
print "Armed:%s"% vehicle.armed
-
2.7 启动SITL仿真环境并运行python示例
在test文件夹下我们有几个演示脚本,如果单纯的运行脚本新手没有直观的感受。我们可以结合无人机仿真环境,来学习脚本具体的执行过程。
前面笔记本上安装好ubuntu系统镜像,里面已经搭建好了Ardupilot开发环境。SITL仿真也就包含其中。
需要注意:DroneKit-SITL目前仅为Mac,Linux和Windows提供x86二进制文件。不能在树莓派这样的ARM平台上运行它。
我们执行的python脚本是在树莓派系统上,而 SITL仿真环境是搭建在笔记本系统上的。
-
1.树莓派端,进入test目录
cd test
-
2.编辑example2.py
sudo vim example2.py
将其中连接端口改为connection_string = '10.42.0.10:14550' 为树莓派IP端口。
脚本里面都配有详细注解,大家可根据注解来理解 dronekit的基本使用。
-
3.笔记本端,首先要进入需要仿真的多旋翼无人机的目录下:
cd ardupilot/Arducopter
第一次运行,需要执行下面的命令对仿真环境进行初始化
sim_vehicle.py -w
或则是仿真参数被改的乱七八糟的时候,也可用这个命令恢复初始参数。
启动完毕,使用 Ctrl+C 终止正在运行的sim_vehicle.py -w
-
4.接下来就可以启动模拟器了:
sim_vehicle.py --console --map
正常启动后,就会看到三个窗口:Terminal, Console, Map,这样最基本的软件在环仿真程序就运行起来了。
-
5.启动后通过output命令列出MAVProxy转发数据的接口,如下所示:
-
6.使用output add命令增加树莓派IP接口:
output add 10.42.0.10:14550
与example2.py代码中端口地址一致。
-
7.树莓派端执行:
运行example2.py代码
python2 example2.py
参考视频:
-
8.我们还可以将航点文件导入SITL进行演示,具体参考如下视频
-
2.8 SITL仿真结合MP地面站运行python示例
首先,将树莓派无人机接上电池,确保 ubuntu电脑,MP地面站电脑都连接到树莓派WIFI热点。
-
MP地面站电脑:
要在MP上显示仿真,遥测连接务必断开。因为遥测连接的是实际的飞控,做仿真需要连接仿真数据。
ubuntu笔记本端:
启动SITL仿真
cd ~/ardupilot/Arducopter sim_vehicle.py --console --map
使用output add命令,增加树莓派的IP:
output add 10.42.0.10:14550
再使用output add命令,增加MP地面站的IP,MP地面站IP地址在遥测页面查看:
output add 10.42.0.170:14551
-
树莓派端:
运行示例代码:
cd test python2 example2.py
以下视频演示SITL仿真如何结合MP地面站运行
SITL与MP地面站结合运行,那么我们可以直接在MP地面站的全部参数列表里,查找需要修改的参数进行修改。
有关SITL仿真的详细介绍,可查看以下链接:
https://ardupilot.org/dev/docs/using-sitl-for-ardupilot-testing.html
-
2.9 使用Python脚本控制无人机飞行
根据dronekit的官方示例,我们编写了几个简单的程序控制无人机飞行。
编写完以后先在SITL仿真环境下运行看看是否和预想的一致。没有问题后,再连接无人机实地飞行。
example5.py控制无人机起飞到3米高度,然后悬停5秒,再自动降落;
大家可根据我们提供的示例,结合自己的实际情况,编写控制程序。
-
Dronekit室外控制无人机起飞降落演示:
example4.py在室外空旷处,此脚本控制无人机起飞到3米高度,然后飞出一个2米*2米的正方形,再自动降落。
Dronekit室外控制无人机飞出一个正方形演示:
还有值得注意的是,python脚本中设置属性:
少数的属性变量可以被设置,通过设置这些属性变量,可以控制无人机的运行状态。可设置的属性变量如下:
vehicle.home_location vehicle.gimbal vehicle.airspeed vehicle.groundspeed vehicle.mode vehicle.armed vehicle.disarmed
-
设置示例:
1.锁定无人机:
vehicle.disarmed = False
2.切换到GUIDED模式:
vehicle.mode = VehicleMode("GUIDED")
3.设置航点模式下,无人机飞行的地速为3.2m/s(注意:读、写groundspeed的意义不同)
print "Param:%s"% vehicle.parameters['THR_MIN'] vehicle.groundspeed = 3.2
-
读取参数
参数以字典(dictionary)的形式,存储在vehicle.parameters变量中。具体参数的名称即为相应的键值(key)。
例如,在屏幕上显示THR_MIN参数(THR_MIN代表油门处于最低时的电机怠速,以PWM值表示):
print "Param:%s"% vehicle.parameters['THR_MIN']
-
显示全部参数:
print "\nPrint all parameters (iterate`vehicle.parameters`):" for key, value in vehicle.parameters.iteritems(): point " Key:%s Value:%s"%(key,value)
-
设置参数
使用读取参数类似的方法,即可设置参数:
vehicle.parameters['THR_MIN']=100
以上只是截取了部分使用较多的知识点进行介绍,完整的教程可以到官网查看。
-
关于dronekit的一些参考资料:
有关项目文档,请访问https://readthedocs.org/projects/dronekit-python/ 。这包括指南,示例和API参考资料。
示例源代码托管在Github上,作为/ dronekit-python / examples 的子文件夹。
DroneKit论坛 是寻求有关如何使用该库的技术支持的最佳场所。 也可以查看Gitter channel 。
说明文件:https://dronekit-python.readthedocs.io/en/latest/about/index.html
指南:https://dronekit-python.readthedocs.io/en/latest/guide/index.html
API参考:https://dronekit-python.readthedocs.io/en/latest/automodule.html
论坛:https://github.com/dronekit/dronekit-python/issues
Gitter: https://gitter.im/dronekit/dronekit-python
-
Z410树莓派无人机机器视觉入门系列教程