本文参考链接:[入门教程] PX4-Gazebo仿真 - 知乎 (zhihu.com)
仿真首先分为软件在环仿真(SITL)和硬件在环仿真(HITL)。软件在环仿真一共是有jMAVSim、Gazebo、AirSim这三种。jMAVSim是一个轻量级的仿真器,目前只支持四旋翼仿真。AirSim我不太清楚,没有使用过,这里就不评价了。Gazebo是我们今天的主角,支持旋翼、固定翼、倾转、小车等,是所有仿真器里支持平台最多的,也能支持多个无人机的仿真。
如果用到px4_command及mavros包来进行offboard模式的测试,推荐使用Gazebo仿真。比如在机载电脑中修改了一些控制逻辑,打开Gazebo仿真,同时运行mavros及相应节点,将仿真的无人机切换至offboard模式,在Gazebo中测试修改的代码是否正确,十分好用!
Flight stack代表飞控即PX4,Simulator代表仿真器(如Gazebo)。所有仿真器与PX4的通讯都是通过MAVLink消息来进行的,SITL使用simulator模块中的simulator_mavlink.cpp来处理这些消息,而HITL是使用mavlink模块中的mavlink_receiver.cpp来处理这些消息。梳理一下这里的消息流向:
PX4到仿真器。PX4给仿真器只会发送一个HIL_ACTUATOR_CONTROLS的MAVLink消息,熟悉PX4的应该知道这个对应的uORB消息是actuator_outputs.msg,也就是姿态控制器最后的输出控制量。这里也就意味着,混控是在仿真器中进行的,仿真器中也包含电机的模型。
仿真器到PX4。仿真器的作用就是模拟真实飞行,即模拟计算出真实飞行时的传感器状态,包括GPS,IMU等,将这些信息发送给飞控后,再由飞控中的估计模块计算出飞机状态量。
外部到PX4。这里的外部就比如地面站QGC(可以外接遥控器),Mavros,Dronecode SDK等,这里也就可以模拟我们平时控制飞机的方式。
端口号:
PX4是使用UDP来进行这些消息通讯的。单个飞机仿真时,默认的UDP设置如下:
如果不涉及多个飞机的仿真,端口号默认都是设置好的,不需要修改及配置。如果是多个飞机的仿真,则需要配置每个飞机的端口号,不能重复,后续会详细介绍配置。
上述介绍适用所有的仿真器。
环境搭建我这里基本就是照搬+翻译PX4的开发手册了,如有疑惑,请留言或移步手册。还是和以前的看法一致,千万不要百度,里面的解答大部分都是带着你走歪路。
首先,你要成功搭建PX4固件开发环境,你要能成功编译PX4代码。(这一步都没成功,那就先搞好这一步)如果你在搭建PX4环境时,没有顺带装一下Gazebo,可能需要单独安装(打开终端输入gazebo可以检测你的电脑是否安装gazebo)。
下面的内容我将分成非ROS下的Gazebo仿真和ROS下的Gazebo仿真。个人是推荐后者的,如果你不使用ROS,也没必要上Gazebo仿真了。
可以发现,在PX4固件中有一个文件夹Firmware/Tools这里面就是包含了jMAVSim、Gazebo仿真等一系列代码。而Gazebo仿真对应的文件夹是sitl_gazebo,这其实是一个子库,即sitl_gazebo这个git仓库。
大致看看这个文件夹里都有些什么内容。
个人认为涉及到Gazebo仿真二次开发就是如上三个文件夹(如果你只是使用Gazebo仿真工具,这里你什么都不需要修改,因为已经完全搭建好了),分别对应修改模型、修改模型参数、修改世界。
除了上述的教程,在PX4开发手册中,还有一个属于Gazebo仿真的教程:ROS with Gazebo Simulation。这就是指导大家如何在ROS环境下,联合Mavros功能包进行仿真调试。我的固件按照这个教程一步一步走下来,没有任何问题。(PX4项目太大,各个部件分散,也不是商业项目,坑还是多~)
对于ROS、Mavros、Offboard模式还不清楚的小伙伴,先去补补相关概念,这里就不多做介绍了。
注意:第一步和第二步只需要做一次,设置成功后,每次直接执行第三步。但如果修改了PX4固件,那你需要重新执行第一步。
第一步:编译。
cd PX4-Autopilot
make px4_sitl_default gazebo
第二步:source。了解ros功能包应该知道这一步是为了让系统知道有这个功能包存在,相当于设置环境变量,这样终端执行的时候就不会报找不到功能包的错误。
source Tools/setup_gazebo.bash $(pwd) $(pwd)/build/px4_sitl_default
export ROS_PACKAGE_PATH=$ROS_PACKAGE_PATH:$(pwd):$(pwd)/Tools/sitl_gazebo
推荐大家手动source,打开终端输入gedit .bashrc。在弹出的txt文件最后一行,加入上述内容。值得注意的是,$(pwd)是要替换成对应的目录路径(PX4固件所在目录),我的路径是 /home/cgd/PX4-Autopilot(cgd是我的电脑名字,PX4-Autopilot是我存放固件的文件夹名字)。于是我的修改内容如下:
source /home/cgd/PX4-Autopilot/Tools/setup_gazebo.bash /home/cgd/PX4-Autopilot /home/cgd/PX4-Autopilot/build/px4_sitl_default
export ROS_PACKAGE_PATH=$ROS_PACKAGE_PATH:/home/cgd/PX4-Autopilot:/home/cgd/PX4-Autopilot/Tools/sitl_gazebo
每次打开新终端,如下图所示,这是正确的。
第三步:运行Gazebo仿真
roslaunch px4 posix_sitl.launch
因为会运行Gazebo,第一次启动会比较慢,耐心等待。启动成功后,会看到Gazebo中有一个iris无人机。这时你可以打开QGC地面站,地面站会默认连接这台飞机,你可以尝试利用地面站发送起飞指令测试。
ubuntu版QGC下载地址:Download and Install · QGroundControl User Guide
sudo usermod -a -G dialout $USER
sudo apt-get remove modemmanager -y
sudo apt install gstreamer1.0-plugins-bad gstreamer1.0-libav gstreamer1.0-gl -y
chmod +x ./QGroundControl.AppImage
./QGroundControl.AppImage
这个启动脚本位于Firmware/launch文件夹中,同时在此文件夹中,你还能看到其他类似的启动脚本。这里建议大家单独启动Mavros,而不是用它提供的另一个启动脚本同时启动(因为一个终端显示太多东西的话,报错你都看不到)。
第四步:运行Mavros
roslaunch mavros px4.launch fcu_url:="udp://:[email protected]:14557"
此处我建议Mavros功能包使用二进制安装,比较省事。可以看到这里启动mavros时配置了一些端口参数(端口匹配才能成功连接),后续我会在PX4仿真模块中找到与之对应的参数配置。
尝试读取飞空的IMU数据,打开终端,输入
rostopic echo /mavros/imu/data
当然,除去imu消息,还有很多其他消息,可以使用下面指令查看都有哪些消息。
rostopic list
在单个飞机仿真没问题之后,才能执行这一步。
roslaunch px4 multi_uav_mavros_sitl.launch
这是官方提供的多机仿真启动脚本,只提供了两架飞机,现在给出如何增加一台飞机的方法。
创建一个新的rcS启动文件: