模吧

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

1043查看 | 1回复

Linux下的Gazebo与jMAVSim仿真 来自知乎Bruce

[复制链接]
发表于 2022-10-17 19:48:12 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
目录
  • 1.使用虚拟机安装Ubuntu系统
  • 2.配置系统环境
  • 3.ROS/Gazebo安装
  • 4.仿真器的整体介绍
  • 5.Simulator MAVLink API
  • 6.默认的PX4 MAVLink UDP端口
  • 7.SITL仿真环境
  • 8.编译SITL仿真
  • 9.调整仿真的运行速度
  • 10.HITL仿真环境
  • 11.集成控制杆/手柄至系统
  • 12.摄像机仿真
  • 13.在远程服务器上运行仿真
1. 使用虚拟机安装Ubuntu系统
官方推荐使用Ubuntu LTS 18.04/Debian Linux,考虑到以后需要配合ROS使用,因此这个笔记只记录Ubuntu的配置方法,由于我使用的windows系统(曾经配置过win+linux双系统,但切来切去非常麻烦),因此重新使用了虚拟机(简称VM)去安装ubuntu18.04,教程如下:
  • VM采用的VMware(教程多,CSDN上一搜都是),先去VMware官网下载Windows版本的安装包,我下载的这个版本为Workstation 16 Pro for Windows。
  • 下载Ubuntu镜像文件,我下载的是18.04.5桌面64位版本的BT种子,再使用迅雷创建新的下载,获得iso文件。最终镜像文件长这样:
Linux下的Gazebo与jMAVSim仿真    来自知乎Bruce 无人机,仿真,模型,电机,模拟器 作者:15519743871 3670
3. 打开VMware,新建虚拟机,选择安装程序光盘映像文件(iso)(M),注意,正常情况下VMware会自动识别iso文件,点击下一步:
Linux下的Gazebo与jMAVSim仿真    来自知乎Bruce 无人机,仿真,模型,电机,模拟器 作者:15519743871 481
4. 全名可以随便写,用户名和密码就是接下来登录系统的账号(与root密码相同):
Linux下的Gazebo与jMAVSim仿真    来自知乎Bruce 无人机,仿真,模型,电机,模拟器 作者:15519743871 6044
5. 选择VM的名称,位置,磁盘容量,以及硬件:
Linux下的Gazebo与jMAVSim仿真    来自知乎Bruce 无人机,仿真,模型,电机,模拟器 作者:15519743871 8766 Linux下的Gazebo与jMAVSim仿真    来自知乎Bruce 无人机,仿真,模型,电机,模拟器 作者:15519743871 8098 Linux下的Gazebo与jMAVSim仿真    来自知乎Bruce 无人机,仿真,模型,电机,模拟器 作者:15519743871 7418 Linux下的Gazebo与jMAVSim仿真    来自知乎Bruce 无人机,仿真,模型,电机,模拟器 作者:15519743871 7395
根据自己的需求,自定义硬件完成后(其余我都是默认值),之后等待ubuntu安装完成即可。
6. 我完成的界面如下,但我的VMware tools并没有安装成功(安装VMware tools一栏是灰色的)。
Linux下的Gazebo与jMAVSim仿真    来自知乎Bruce 无人机,仿真,模型,电机,模拟器 作者:15519743871 2902
如果你不幸也是这个情况,则需要重新安装VMware tools,因为有些功能很好用,比如随VMware调整窗口大小,VM和主机间的复制、粘贴内容、拖拽文件等。首先需要关闭当前运行的VM,右击你的VM,找到设置 -> 移除所有的 CD/DVD 驱动器 -> 添加 -> CD/DVD驱动器(注意右侧,连接栏中应使用物理驱动) -> 确定 -> 退出 -> 打开VM -> 左上角点击Player(P) -> 管理 -> 可见安装VMware tools一栏可以点了 -> 点击安装。
接下来不出意外的话,Ubuntu桌面上就会有个光盘一样文件叫VMware tools。接下来打开terminal(ctrl+alt+t),按照下面的步骤(ref):
# 确定Linux有没有自动装载VMware Tools虚拟CD-ROM镜像mount# 如果装载了,应该能看到类似的语句/dev/cdrom on /mnt/cdrom type iso9660 (ro,nosuid,nodev)# 由于版本不同,也会存在装载点是/media/VMware Tools的情况,如果没有,则运行下面的代码mkdir /mnt/cdrom# 如果装载点是/media/VMware Tools,需要修改为mkdir /media/VMware Tools# 装载CD-ROM驱动,同理,装载点不同则需要修改代码mount /dev/cdrom /mnt/cdrom# 若装载了,直接解压# 装载完毕后解压安装包,我在解压时一直报错,后来是手动提取到桌面的tar zxpf /mnt/cdrom/VMwareTools-x.x.x-yyyy.tar.gz# x.x.x是产品版本号,yyyy是产品版本的构建号,一般镜像文件中只有一个压缩包# 解压后可以接触CD-ROM镜像文件的装载,如果Linux自动装载了,则无需执行下面的代码umount /dev/cdrom# 进入提取出的文件目录,并运行安装包cd vmware-tools-distribsudo ./vmware-install.pl
安装期间会需要配置一些初始设置,一般选择默认值即可。安装完毕重启,可以检查工具栏:
Linux下的Gazebo与jMAVSim仿真    来自知乎Bruce 无人机,仿真,模型,电机,模拟器 作者:15519743871 304
如果显示重新安装VMware Tools,则为安装成功,主机复制的东西也可以直接粘贴到Linux里了,nice。
2. 配置系统环境
为了方便安装,官方写了两个bash脚本:ubuntu.shubuntu_sim_ros_melodic.sh,前者是为了安装Gazebo 9,jMAVSim仿真器NuttX/Pixhawk工具,而后者是为了在Ubuntu上安装ROS(Melodic)和PX4。在Linux终端输入下面的命令:
git clone https://github.com/PX4/PX4-Autopilot.git --recursive
[可选方法] 国内访问github的资源实在是慢的出奇,而且经常连接中断,clone到一半就卡死不动了。我也被这个问题困扰了两天,所幸国内有gitee码云,可以从github导入仓库:
Linux下的Gazebo与jMAVSim仿真    来自知乎Bruce 无人机,仿真,模型,电机,模拟器 作者:15519743871 5879
直接输入要clone的url即可:
Linux下的Gazebo与jMAVSim仿真    来自知乎Bruce 无人机,仿真,模型,电机,模拟器 作者:15519743871 2301
导入之后,进入仓库,再git clone新的url,直接起飞:
Linux下的Gazebo与jMAVSim仿真    来自知乎Bruce 无人机,仿真,模型,电机,模拟器 作者:15519743871 3976
clone完成后:
# 进入clone下来的目录,并执行自动脚本cd PX4-Autopilot/bash ./Tools/setup/ubuntu.sh# 如果不想安装NuttX或仿真工具,则在上面的命令增加后缀,并运行:--no-nuttx --no-sim-tools# 安装过程中需要输入几次root密码,安装完成后,你可以检查NuttX是否安装:arm-none-eabi-gcc --version# 我显示了如下内容,说明安装成功了arm-none-eabi-gcc (GNU Arm Embedded Toolchain 9-2020-q2-update) 9.3.1 20200408 (release)Copyright (C) 2019 Free Software Foundation, Inc.This is free software; see the source for copying conditions.  There is NOwarranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
3. ROS/Gazebo安装
官方同样提供了脚本去自动安装,输入下面的代码获取:
wget https://raw.githubusercontent.com/PX4/Devguide/master/build_scripts/ubuntu_sim_ros_melodic.sh
但是国内似乎访问不了,我直连会报403connection refused的错,挂上学校的VPN之后可以访问,不过速度不快。下载完之后,运行脚本即可:
bash ubuntu_sim_ros_melodic.sh
注意,该脚本也只是执行了ROS Melodic下载的必要指令,如果有同学访问不了,可以参考ROS下载文档进行下载。最后可以通过命令来验证是否安装成功:
sudo rosdep initrosdep update
如果可以运行,如图,说明安装成功:(更多信息参考ROS Tutorials)
Linux下的Gazebo与jMAVSim仿真    来自知乎Bruce 无人机,仿真,模型,电机,模拟器 作者:15519743871 4930 4. 仿真器的整体介绍
仿真器允许PX4飞行代码在仿真世界中控制一个计算机建模的载具。PX4支持Software In the Loop(SITL)仿真,也就是飞行栈在电脑上运行。PX4也支持Hardware In the Loop(HITL)仿真,在真实的飞行控制板上使用仿真固件。Gazebo是官方推荐使用的仿真器,具有强大的3D仿真环境,适用于测试物体避障和计算机视觉。Gazebo和ROS(一种用于自动控制的工具集)一起也可被用作多载具仿真。
5. Simulator MAVLink API
所有的仿真器都使用Simulator MAVLink API与PX4进行通信。具体来说就是该API会定义一组MAVLink消息发送给PX4,这些消息承载了仿真世界的传感器数据,PX4根据即将应用于仿真器的飞行代码来返回电机和致动器的值。逻辑图如下:
Linux下的Gazebo与jMAVSim仿真    来自知乎Bruce 无人机,仿真,模型,电机,模拟器 作者:15519743871 8326
下表将描述几种常用的消息的名称和内容,对于所有的消息集,请参考这个链接
message方向参数描述
MAV_MODE:MAV_MODE_FLAG_HIL_ENABLED模拟时选择的模式flag,虽然所有电机/执行器都被卡停,但内部软件可以完全运行
HIL_ACTUATOR_CONTROLSPX4至仿真器PX4控制的输出(电机/执行器)
HIL_SENSOR仿真器至PX4在NED体框架内以SI单位来模拟惯性测量单元的读数
HIL_GPS仿真器至PX4模拟的GPS原始传感器数值
HIL_OPTICAL_FLOW仿真器至PX4流量传感器的模拟光流
HIL_STATE_QUATERNION仿真器至PX4该消息记录实际仿真无人机的位置,姿态,速度等数据,并与PX4的分析和调试估计进行比较,例如可以检查估计器在输入为含噪声的仿真传感器数据时的工作情况
HIL_RC_INPUTS_RAW仿真器至PX4收到无线电通信通道的原始值
6. 默认的PX4 MAVLink UDP端口
在非模拟情况中,PX4默认使用常规建立的UDP端口来和地面控制台(例如QGroundControl,以下简称QGC),外接的API(如MAVSDK, MAVROS)和模拟器API(如Gazebo)进行MAVLink通信。这些端口为:
  • UDP端口14540用作与外接API的通信
  • UDP端口14550用作与地面控制台的通信(GCS默认侦听此端口上的连接)
  • 仿真器的本地TCP端口4560用作与PX4通信,仿真器通过向这个端口广播数据来启动通信
注意,GCS和外接API设置在配置文件中,但仿真器广播端口是硬编码在Simulation MAVLink模块的。
7. SITL仿真环境
该系统的不同部分通过UDP连接,可以在同个电脑上,或者相同网络下的另一台电脑上运行。
Linux下的Gazebo与jMAVSim仿真    来自知乎Bruce 无人机,仿真,模型,电机,模拟器 作者:15519743871 4723
  • PX4使用仿真特定的模块来和仿真器的本地TCP端口4560连接。仿真器使用Simulator MAVLink API来和PX4交换信息
  • PX4使用常规的MAVLink模块来和监听14550端口的地面站连接,但外部开发者的API(如MAVSDK或者ROS)监听端口14540
  • Joystick/Gamepad硬件和QGC串联
8. 编译SITL仿真
简化的语法为:
make px4_sitl simulator[_vehicle-model]
其中simulator是gazebo,_vehicle-model是任意Gazebo支持的载具,见下图
Linux下的Gazebo与jMAVSim仿真    来自知乎Bruce 无人机,仿真,模型,电机,模拟器 作者:15519743871 8766
这里举几个编译的例子:
# 以平面开始Gazebomake px4_sitl gazebo_plane# 以虹膜和光流开始Gazebomake px4_sitl gazebo_iris_opt_flow# 以虹膜开始jMavSim (默认模型)make px4_sitl jmavsim
通过环境变量,我们还能进一步配置仿真:
  • PX4_ESTIMATOR: 该变量配置要用哪个估计器。默认值为ekf2,选项lpe已被弃用,但可以通过指令export PX4_ESTIMATOR=lpe来设置。
完整的make指令使用方法请参考'PX4 Make Build Targets'
9. 调整仿真的运行速度
当使用Gazebo时,SITL可以比真实时间运行地更快或更慢。使用环境变量PX4_SIM_SPEED_FACTOR来设置速度参数,例如:
# 以2倍真实时间的速度运行jMAVSimPX4_SIM_SPEED_FACTOR=2 make px4_sitl jmavsim# 以半倍真实时间的速度运行jMAVSimPX4_SIM_SPEED_FACTOR=0.5 make px4_sitl jmavsim# 应用该参数至当前会话中运行的所有SITLexport PX4_SIM_SPEED_FACTOR=2make px4_sitl jmavsim
注意,为了避免PX4监测到数据链路超时,应当正比于simulation rate增加参数COM_DL_LOSS_T的值。例如,若真实时间中COM_DL_LOSS_T是10,在10倍simulation rate时,应当增加至100。
9.1. 锁步(Lockstep)仿真(也可以叫同步仿真?大概)
PX4 SITL和仿真器都被设置为运行时锁步,这意味着PX4和仿真器会为了传感器和致动器消息互相等待,而不是以他们自己的速度运行。lockstep的步骤序列为:
  • 仿真器发送一个包含时间戳time_usec的传感器消息HIL_SENSOR来更新传感器状态和PX4的时间
  • PX4接受该消息并做一次状态估计,控制等的迭代。PX4最后发送一个致动器消息HIL_ACTUATOR_CONTROLS
  • 仿真器一直等待指导它接收到了致动器或电机的消息,然后它模拟物理并计算下一个发送到PX4的传感器消息
该过程是单向的,整个系统开始于仿真器发送包含时间的传感器消息,PX4在初始完毕并且响应一个致动器消息前都不会运行。
#如何关闭锁步仿真?
要在PX4里关闭锁步,在SITL board config中使用set(ENABLE_LOCKSTEP_SCHEDULER no)。要在jMAVSim中关闭锁步,在jmavsim_run.sh中移除-l。
9.2. 启动脚本
脚本被用来控制要使用的参数设置或者控制要启动的模块,它们被存放在ROMFS/px4fmu_common/init.d-posix目录下,文件rcS是主要入口点(main entry point)。更多信息请移步这个'System Startup'
9.3. 模拟失效保护(Failsafes)和传感器/硬件故障
SITL parameters也可以被用来仿真常见的传感器故障,包括低电量,GPS丢失,气压计,陀螺故障 ,增加的GPS噪音等等(例如SIM_GPS_BLOCK可以被设置成模拟GPS故障)。更多的Failsafes模拟可以参考'Simulate Failsafes'。通过模拟失效保护,我们可以更好地了解其在真实世界里的工作机制。
10. HITL仿真环境
PX4固件会在真实的硬件上运行,参考'Hardware in the Loop Simulation (HITL)'来获取更多信息,这里不做赘述。
11. 集成控制杆/手柄至系统
QGC桌面应用可以连接至一个带USB的控制杆或手柄,并且可以通过MAVLink发送它的移动命令和按的按钮至PX4。这在SITL和HITL仿真中都适用,而且该桌面应用允许用户直接控制仿真的载具。没有硬件也没关系,QGC还提供了内置虚拟摇杆。读者可以参照'控制杆设置'来启用它。
12. 相机仿真
PX4支持从Gazebo仿真环境捕捉静态图像和视频。用户可以通过指令开启流媒体视频,如在台风H480模型中:
make px4_sitl gazebo_typhoon_h480
使用Gazebo UI里的Video开关按钮,流媒体可以被暂停或者重新开始:
Linux下的Gazebo与jMAVSim仿真    来自知乎Bruce 无人机,仿真,模型,电机,模拟器 作者:15519743871 395
保存的Gazebo相机视频可以在QGC中查看,即打开Application Settings -> General,设置Video SourceUDP h.264 Video Stream,并且设置UDP Port5600
Linux下的Gazebo与jMAVSim仿真    来自知乎Bruce 无人机,仿真,模型,电机,模拟器 作者:15519743871 3519
视频效果图如下:
Linux下的Gazebo与jMAVSim仿真    来自知乎Bruce 无人机,仿真,模型,电机,模拟器 作者:15519743871 1033
该模拟的相机是一个Gazebo的插件,这个插件实现了MAVLink摄像机协议。和连接任意其他的MAVLink摄像机相同,PX4也是这么连接/集成上述相机的:
  • 对于MAVLink相机,为了配置其触发器驱动,TRIG_INTERFACE必须设为3。在该模式中,无论何时请求了一次图像捕捉,驱动都会发送一条CAMERA_TRIGGER消息。 更多相关信息请查看'摄像机触发器'
  • PX4必须在GCS和仿真器之间转发所有的摄像机命令。用户可以通过添加-fflag来启动MAVLink,并指定新连接的UDP端口:
mavlink start -u 14558 -o 14530 -r 4000 -f -m camera
需要注意的是,除了相机MAVLink消息,还有其他消息会被转发,但是相机会无视它认为不相关的消息。
13. 在远程服务器上运行仿真
在一台电脑上运行仿真,再在同一网络(或者另一有合适路由的网络)下的电脑进行访问是可以的。默认PX4不会路由UDP包至外部接口(避免向网络发送垃圾邮件,也避免不同仿真互相干扰),所以PX4在内部将通信路由到localhost。但还是有一些方法可以在外部接口获取UDP包的,如:
  • 启用MAV_BROADCAST,在本地网络广播心跳包,通过监听合适的端口(例如QGC监听14550),远程电脑可以连接到仿真器。
  • 使用MAVLink路由器,mavlink-router可以被用来路由从localhost到外部接口的包。要在一台跑着SITL的电脑(在UDP端口14550上发送MAVLink通信到localhost)和另一台跑着QGC的电脑(如地址10.73.41.30,该地址是官方文档给的例子),用户可以:
# 启动mavlink-routermavlink-routerd -e 10.73.41.30:14550 127.0.0.1:14550
再使用mavlink-router的conf文件:
[UdpEndpoint QGC]Mode = NormalAddress = 10.73.41.30Port = 14550[UdpEndpoint SIM]Mode = EavesdroppingAddress = 127.0.0.1Port = 14550
更多配置信息参考mavlink-router配置链接。
3. 为外部广播修改配置,通过使用-t选项并指定外部IP地址来让mavlink模块广播。在各种需要调用mavlink start指令的配置文件中,我们都需要加上这个操作,例如这个rcS官方配置文档
4. 使用SSH隧道,同理也可以使用VPN来提供外部接口的隧道。在localhost创建SSH隧道:
ssh -C -fR 14551:localhost:14551 remote.local
替换remote.local为远程电脑的名字。要通过SSH路由,UDP包需要被翻译成TCP包 。隧道的两边都可以使用netcat程序 -- 先转换UDP包到TCP包,再在另一端转换回UDP包。在执行netcat前,必须先运行QGC,在QGC端,运行以下命令:
mkfifo /tmp/tcp2udpnetcat -lvp 14551 < /tmp/tcp2udp | netcat -u localhost 14550 > /tmp/tcp2udp
在仿真器端,运行以下命令:
mkfifo /tmp/udp2tcpnetcat -lvup 14550 < /tmp/udp2tcp | netcat localhost 14551 > /tmp/udp2tcp
注意,端口号14550仅适用于连接到QGC或者另一个GCS,但对于其他的端点(如开发者API等),需要调整端口号。理论上来说,隧道可以无限地运行, 但遇到问题时,netcat可能需要重启。为了方便,官方提供了QGC_remote_connect.bash脚本来自动设置或运行上述指令,但必须先在远程服务器上运行仿真,并且保证你能够SSH到该服务器。

发表于 7 天前 | 显示全部楼层
感谢分享。实际情况下就是在linux安装了适用于mavlink协议的地面站与飞行器仿真。
主要是mavlink协议,出了好多年,是由3d-robotics公司主推,但是一直没有火起来,因为3dr野心太大,可是其他做飞控的公司/开源社区方案技术上也不弱于3dr,没有形成行业标准但是对DIY很有意义。希望长久。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

站长推荐上一条 /1 下一条

QQ|关于模吧|APP下载|广告报价|手机版|企业会员|商城入驻|联系我们|模吧 ( 黔ICP备2022002348号-1 )

© 2013-2020 Moz8.com 模吧,玩出精彩!