2. 二次开发入门教程

  • Ardupilot开源无人机二次开发入门系列教程

    教程视频:https://mp.weixin.qq.com/mp/appmsgalbum?__biz=MzkyNzI1MDUyNw==&action=getalbum&album_id=2014808821755379715&scene=173&from_msgid=2247485616&from_itemidx=1&count=3&nolastread=1#wechat_redirect

  • 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。

    下载链接:https://www.videolan.org/

  • 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访问树莓派:

    1. 在PC端安装PuTTY,下载链接:https://the.earth.li/~sgtatham/putty/latest/w64/putty-64bit-0.75-installer.msi

    2. 启动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的过程,可参考以下链接有详细介绍:

    第一节:https://mp.weixin.qq.com/s/lNzoFQqN9q4wPaaZBy5fYg

    第二节:https://mp.weixin.qq.com/s/QXWT8NOLXToO6n0zwFZoRA

  • 1.运行连接示例

    使用Dronekit代码读取飞控当前状态,测试树莓派与飞控之间通讯是否正常:

    1.无人机连接电池,笔记本开启一个终端窗口;

    2.通过ssh命令,连接无人机上的树莓派;

    3.将路径切换到test文件夹:

    cd test
    

    4.运行connect.py脚本:

    python2 connect.py
    

    成功运行后,会显示如下信息:

    说明树莓派通过Dronekit读取到了目前飞控的数据:系统警报、固件版本、姿态数据、电池电量、解锁状态、当前飞行模式等等。这样就成功运行了第一个DroneKit-Python脚本。

    注意!

    如若出现连接异常超时警报,请检查物理连接(usb转TTL模块)是否连接好;或则打开connect.py程序查看连接端口是否为ttyUSB0;无人机通电后如果长时间没有使用串口,串口有可能关闭,无人机重新启动,再执行以上程序。
  1. 如果想查看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

    例子:/dronekit-python/examples

    论坛:https://github.com/dronekit/dronekit-python/issues

    Gitter: https://gitter.im/dronekit/dronekit-python

  • Z410树莓派无人机机器视觉入门系列教程

    https://mp.weixin.qq.com/s/g3utWpZIenJYKK7lpG5xKQ