不花一分钱学 ardupilot 代码

背景介绍:
前不久 Sugar 被问到 dronekit-python 怎么通过 mavlink 连飞机。
为了给出个满意的回答,Sugar 认真用软件在环仿真研究了一翻。
几年前 Sugar 就接触过 ArduPilot 的 SITL,只是一直都有飞机玩没太重视这个软件在环仿真。
Sugar 清楚记得从前团队里第一个在 Windows 下跑通 SITL 的小伙儿叫姜国龙,做出来还给团队培训了一番。
通过这两天研究发现 SITL 现已非常强大,完全可以让人不花一分钱就可以学习 ardupilot 源码。
本文就介绍一下 Sugar 这两天尝试过的 4 种 SITL 方法。
本文第 1 个视频包含完整的开发流程演示,第 2 个视频是另外 3 种方法的演示。

SITL 的意义

一、数据
对于开发者来讲,改代码后采集数据进行分析是必须的。
对于工程师来讲,分析实际问题现象也要有一个正确的数据参照。
无论是初步测试还是数据对比,SITL 的仿真数据都有很大的参考价值。
二、节省成本
不论是时间成本还是金钱成本都是飞控开发必须投入的。
开发过的软件先走 SITL,不用装机、不用充电、不用拿到试飞场,一个命令就能测试,省时间。
如果代码有错或算法有误,实际飞行面临的就是炸机烧钱,而 SITL 虚拟飞机炸得起,还不用修无限换新,省金钱。

SITL 固件编译

1、编译 SITL 固件(配置)。

./waf configure --board=SITL

2、编译 SITL 固件(编译)。

./waf copter

dronekit-sitl

不通过 MavProxy 直接对飞控源码进行仿真。

此方法是 Sugar 第一个尝试的方法,也是 4 种方法中唯一的不通过 mavproxy 直接仿真飞控源码的方法。
优点:仿真通信效率高,自然支持自定义 mavlink 报文。
缺点:启动仿真后要手动修改影响仿真的参数(看文档似乎可以自动加载参数,但 Sugar 没有深入研究),仿真日志存在 tmp 目录下(比较随机)。
特点:操作过程与带 Wifi 数传的真机几乎一致(这一点说不上是优点还是缺点,所以称之为特点)。

1、启动仿真

dronekit-sitl /home/sugar/gitlab/ardupilot/build/sitl/bin/arducopter


2、通过 QGC 的 TCP 进行连接
视频链接

dronekit-sitl(通过 mavproxy)

优点:可以在 mavproxy 的 console 中用命令修改参数(不用在 QGC 里一个一个改),QGC 启动后自动连接(免去设置新连接的麻烦)。
缺点:由于借助 mavproxy 所以仿真的通信效率受到一定影响,仿真日志存在 tmp 目录下(比较随机)。

视频链接

1、启动仿真

dronekit-sitl /home/sugar/gitlab/ardupilot/build/sitl/bin/arducopter

2、启动 MavProxy

打开另一个终端。

mavproxy.py --master tcp:127.0.0.1:5760 --sitl 127.0.0.1:5501 --out 127.0.0.1:14550 --out 127.0.0.1:14551 --console

3、修改影响仿真的参数

param set ARMING_CHECK 0
param set RC3_MIN 1101
param set INS_ACCOFFS_X 0.1
param set FRAME_CLASS 1

4、打开 QGC

会自动连上。
查看通信状态的插件是 Sugar 自己加的 Mavlink 报文。

Gazebo 带 3D 模型仿真

飞行日志在 ardupilot/ArduCopter/logs/ 下保存。

优点:带 3D 模型显得很酷,仿真的日志文件在指定目录下(与实际 SD 卡里的一样,可以在一处保存多次仿真数据),QGC 启动后自动连接(免去设置新连接的麻烦)。
缺点:由于借助 mavproxy 所以仿真的通信效率受到一定影响,加载 3D 模型对电脑配置要高一点。

1、打开终端,用下面命令启动 Gazebo

gazebo --verbose worlds/iris_arducopter_runway.world


2、进入 ardupilot/ArduCopter 目录下,用下面命令启动仿真

../Tools/autotest/sim_vehicle.py -f gazebo-iris --console

3、启动 QGC 操控飞机。

ardupilot 官方基础仿真

飞行日志在 ardupilot/ArduCopter/logs/ 下保存。

优点:一个命令启动相当方便,仿真的日志文件在指定目录下(与实际 SD 卡里的一样,可以在一处保存多次仿真数据),QGC 启动后自动连接(免去设置新连接的麻烦)。
缺点:由于借助 mavproxy 所以仿真的通信效率受到一定影响。

1、进入 ardupilot/ArduCopter/ 目录下,运行如下命令:

../Tools/autotest/sim_vehicle.py --console

2、启动 QGC 操控飞机。

遇到过的困难

上面是在一切顺利的前提下给出的操作过程,Sugar 实际操作的过程中遇到了一些问题,这一节记录一下问题和解决办法。

一、自定义 mavlink 报文通不过 mavproxy
解决办法:要重新编译安装 pymavlink

参考链接:https://ardupilot.org/dev/docs/code-overview-adding-a-new-mavlink-message.html

sudo pip uninstall pymavlink
cd gitlab/ardupilot/modules/mavlink/pymavlink/
sudo python setup.py install --user

因为用 sudo 方式,当运行 mavproxy 时会遇到 pymavlink 版本错误 ,解决方法下面会说。

二、mavproxy 返回 pymavlink 版本问题,如下:

pkg_resources.DistributionNotFound: The 'pymavlink>=2.3.3' distribution was not found and is required by MAVProxy

解决办法:

sudo chown -R sugar:sugar .local/lib/python2.7/

必备软件

1、ardupilot 编译环境,出 SITL 固件。
2、带插件版 QGC 跟踪地面站与飞机的 mavlink 通信,显化控制过程,方便定位问题。
3、ArduPilotLog 对 SITL 数据进行图形化显示,简单脚本分析,以及 Matlab 数据库生成。
4、Matlab 对 SITL 数据进行综合分析。
5、其他的 dronekit-sitl、mavproxy、pymavlink 等官方文档都有说明。

公众号后台回复 apm 得到带插件 QGC 源码。
公众号后台回复 ardupilotlog 得到 Sugar 开源的 ArduPilotLog 软件(最新版永远在 github 上)。

PS

推文中的视频 Sugar 有在 b 站上发布,有 b 站帐号的读者可以到 b 站上看高清无广告版。
b 站链接的获得方法见公众号“关于我”页面。