【PX4-AutoPilot教程-仿真环境架构】梳理PX4&Gazebo&MAVLink&MAVROS&ROS&ROS2之间的关系
梳理PX4&Gazebo&MAVLink&MAVROS&ROS&ROS2之间的关系
PX4与仿真器
在仿真器中可以让PX4代码来控制无人机飞行。仿真是在尝试现实世界中飞行之前测试PX4代码的一种快速、简单且安全的方法。当你还没有可以试验的飞行器时,这也是一个开始使用PX4代码飞行的好方法。
PX4支持的仿真器
仿真器 | 描述 | 支持的载具 |
---|---|---|
Gazebo | 强烈建议使用此仿真器。Gazebo取代了Gazebo Classic,具有更先进的渲染、物理和传感器模型。这是Ubuntu Linux 22.04提供的Gazebo的唯一版本。它具有功能强大的3D仿真环境,特别适用于测试对象避障和计算机视觉。支持多无人机仿真,通常伴随 ROS使用。 | 四旋翼、标准垂直起降固定翼、尾座事垂直起降固定翼、固定翼、四驱车、水下航行器 |
Gazebo Classic | 强烈建议使用此仿真器。一个强大的3D模拟环境,特别适合测试物体回避和计算机视觉。支持多无人机仿真,通常伴随ROS一起使用。 | 四旋翼、标准垂直起降固定翼、尾座事垂直起降固定翼、固定翼、四驱车、水下航行器 |
jMAVSim | 一个简单的多旋翼仿真器,允许您在模拟的世界中控制无人机飞行。它易于设置,可用于测试您的车辆是否可以起飞、飞行、着陆,并对各种故障条件(如GPS故障)做出适当响应。支持多无人机仿真。 | 四旋翼 |
FlightGear | 提供物理和视觉逼真模拟的仿真器。特别是,它可以模拟许多天气条件,包括雷暴、雪、雨和冰雹,还可以模拟热流和不同类型的大气流。支持多无人机仿真。 | 四旋翼、固定翼、四驱车 |
JSBSim | 提供高级飞行动力学模型的仿真器。这可以用于基于风洞数据对真实的飞行动力学进行建模。 | 四旋翼、固定翼 |
AirSim | 提供物理和视觉逼真模拟的跨平台仿真器。这个仿真器是资源密集型的,需要一台比这里描述的其他仿真器功能强大得多的计算机。 | 四旋翼、固定翼 |
Simulation-In-Hardware(SIH) | 硬件在环仿真HITL的一种替代方案,直接在硬件自动驾驶仪上提供硬实时仿真。该仿真器在C++中作为PX4模块直接在固件代码中实现 | 四旋翼、固定翼、尾座事垂直起降固定翼 |
PX4与除Gazebo之外的仿真器的连接
除了Gazebo之外的所有仿真器都使用仿真器的MAVLink API接口与PX4通信。此API接口定义了一组MAVLink消息,这些消息将来自模拟世界的传感器数据提供给PX4,并返回将应用于模拟无人机的飞行代码中的电机和执行器的值。下图显示了PX4与仿真器之间的消息流。
PX4的SITL软件在环仿真时,使用SimulatorMavlink.cpp处理这些消息。
代码位置:Firmware/src/modules/simulation/simulator_mavlink/SimulatorMavlink.cpp
PX4的HITL硬件在环仿真时,使用mavlink_receiver.cpp处理这些消息,将来自模拟器的传感器数据写入PX4 uORB话题。所有的电机和执行器都被禁用,但其他的应用程序(姿态估计、姿态控制等)正常运行。
代码位置:Firmware/src/modules/mavlink/mavlink_receiver.cpp
消息流的具体信息在下表中。
消息名称 | 传输方向 | 描述 |
---|---|---|
MAV_MODE:MAV_MODE_FLAG_HIL_ENABLED | 无 | 使用仿真时的模式标志。所有电机和执行器都被禁止,但其他的应用程序(姿态估计、姿态控制等)正常运行。 |
HIL_ACTUATOR_CONTROLS | PX4到仿真器 | PX4至电机、执行器的控制输出。 |
HIL_SENSOR | 仿真器到PX4 | NED坐标系下模拟IMU传感器数据,单位为国际单位制。 |
HIL_GPS | 仿真器到PX4 | 模拟的GPS数据。 |
HIL_OPTICAL_FLOW | 仿真器到PX4 | 模拟的光流传感器数据。 |
HIL_STATE_QUATERNION | 仿真器到PX4 | 包含无人机在仿真环境中的位置、姿态、速度等。可以将其记录下来,并与PX4的估计值进行比较,以进行分析和调试(例如,测试估计器对有传感器噪声的输入的工作情况)。 |
HIL_RC_INPUTS_RAW | 仿真器到PX4 | 接收到的RC通道的数据。 |
PX4与Gazebo仿真器的连接
PX4与Gazebo仿真器的连接直接使用Gazebo API接口,不需要使用MAVlink API接口。
PX4默认的MAVLink UDP端口
默认情况下,PX4使用固定的UDP端口与地面站(如QGroundControl)、机载电脑(如MAVSDK、MAVROS)和仿真器(如Gazebo)进行MAVLink通信。
PX4的UDP端口14550用于与地面站进行通信。地面站侦听此端口上的连接,QGroundControl默认侦听此端口。
PX4的UDP端口14540用于与Offboard模式板外电脑进行通信。Offboard模式板外电脑应侦听此端口上的连接。
仿真器的本地TCP端口4560用于与PX4通信。仿真器监听这个端口,PX4启动到这个端口的TCP连接。
这些端口的定义都是在PX4系统启动文件中定义的。
PX4 SITL软件在环仿真的架构
下图显示了使用MAVLink API接口的仿真器的典型SITL软件在环仿真的架构。
系统的不同部分通过UDP连接,可以在同一台计算机或同一局域网上的另一台计算机上运行。
PX4的UDP端口14540用于与Offboard模式板外电脑进行通信。
PX4的UDP端口14550用于与地面站进行通信。
PX4的TCP端口4560用于与仿真器的通信。
当使用make px4_sitl gazebo
、make px4_sitl gazebo-classic
、make px4_sitl jmavsim
等命令运行SITL软件在环仿真时,PX4和仿真器将在同一台计算机上启动,并且将自动配置上述端口。
可以配置其他MAVLink UDP连接,也可以在构建配置和初始化文件中修改模拟环境。
Gazebo仿真
PX4固件中有一个文件夹Firmware/Tools/sitl_gazebo存放Gazebo仿真相关文件。
Firmware/Tools/sitl_gazebo/src文件夹,存放核心插件。比如GPS、IMU的数据如何产生就是这里的代码负责的。Gazebo自身也会提供一些默认插件,或者第三方也会提供插件,如果要新增一个传感器,可以在这里找到相应的插件。
Firmware/Tools/sitl_gazebo/models文件夹,存放各种Gazebo模型文件。
Firmware/Tools/sitl_gazebo/worlds文件夹,存放各种Gazebo世界环境文件。
PX4启动仿真的launch文件
PX4固件用于启动仿真的launch文件在Firmware/launch文件夹中。
-
px4.launch:只加载PX4 SITL软件在环仿真的节点。
-
posix_sitl.launch:加载PX4 SITL软件在环仿真、打开Gazebo、使用spawn_model加载sdf格式的飞机模型。
-
mavros_posix_sitl.launch:加载PX4 SITL软件在环仿真、打开Gazebo、使用spawn_model加载sdf格式的飞机模型。启动MAVROS通信。相当于新建一个终端运行命令
roslaunch mavros px4.launch fcu_url:="udp://:14540@127.0.0.1:14557"
。 -
single_vehicle_spawn.launch:加载PX4 SITL软件在环仿真、打开Gazebo、使用spawn_model加载sdf格式的飞机模型。
-
multi_uav_mavros_sitl.launch:加载PX4 SITL软件在环仿真、打开Gazebo、使用spawn_model加载sdf格式的飞机模型。模型的生成方式调用了single_vehicle_spawn.launch中的格式,并传入不同的mavlink_udp_port和mavlink_tcp_port用于不同飞机mavlink连接。每架飞机的MAVROS传入不同的fcu_url和tgt_system参数,便于启动不同的MAVROS。
make px4_sitl gazebo
和roslaunch px4 posix_sitl.launch
基本是等效的。
观察posix_sitl.launch文件中的内容,可以看到调用Gazebo模型文件的代码<arg name="sdf" default="$(find mavlink_sitl_gazebo)/models/$(arg vehicle)/$(arg vehicle).sdf"/>
,调用Gazebo世界环境文件的代码<arg name="world" default="$(find mavlink_sitl_gazebo)/worlds/empty.world"/>
。
<?xml version="1.0"?>
<launch>
<!-- Posix SITL environment launch script -->
<!-- launches PX4 SITL, Gazebo environment, and spawns vehicle -->
<!-- vehicle pose -->
<arg name="x" default="0"/>
<arg name="y" default="0"/>
<arg name="z" default="0"/>
<arg name="R" default="0"/>
<arg name="P" default="0"/>
<arg name="Y" default="0"/>
<!-- vehicle model and world -->
<arg name="est" default="ekf2"/>
<arg name="vehicle" default="iris"/>
<arg name="world" default="$(find mavlink_sitl_gazebo)/worlds/empty.world"/>
<arg name="sdf" default="$(find mavlink_sitl_gazebo)/models/$(arg vehicle)/$(arg vehicle).sdf"/>
<env name="PX4_SIM_MODEL" value="$(arg vehicle)" />
<env name="PX4_ESTIMATOR" value="$(arg est)" />
<!-- gazebo configs -->
<arg name="gui" default="true"/>
<arg name="debug" default="false"/>
<arg name="verbose" default="false"/>
<arg name="paused" default="false"/>
<arg name="respawn_gazebo" default="false"/>
<!-- PX4 configs -->
<arg name="interactive" default="true"/>
<!-- PX4 SITL -->
<arg unless="$(arg interactive)" name="px4_command_arg1" value="-d"/>
<arg if="$(arg interactive)" name="px4_command_arg1" value=""/>
<node name="sitl" pkg="px4" type="px4" output="screen"
args="$(find px4)/build/px4_sitl_default/etc -s etc/init.d-posix/rcS $(arg px4_command_arg1)" required="true"/>
<!-- Gazebo sim -->
<include file="$(find gazebo_ros)/launch/empty_world.launch">
<arg name="gui" value="$(arg gui)"/>
<arg name="world_name" value="$(arg world)"/>
<arg name="debug" value="$(arg debug)"/>
<arg name="verbose" value="$(arg verbose)"/>
<arg name="paused" value="$(arg paused)"/>
<arg name="respawn_gazebo" value="$(arg respawn_gazebo)"/>
</include>
<!-- gazebo model -->
<node name="$(anon vehicle_spawn)" pkg="gazebo_ros" type="spawn_model" output="screen" args="-sdf -file $(arg sdf) -model $(arg vehicle) -x $(arg x) -y $(arg y) -z $(arg z) -R $(arg R) -P $(arg P) -Y $(arg Y)"/>
</launch>
ROS与PX4的关系
ROS是一个通用机器人库,可与PX4一起用于无人机应用程序开发。ROS得益于开发人员解决常见机器人问题的活跃生态系统,以及对其他为Linux编写的软件库的访问。例如,它已被用作PX4计算机视觉解决方案的一部分,包括避障和碰撞预防。
PX4支持ROS2和ROS1。
对于ROS2:PX4和ROS2通过PX4-ROS2桥接工具(PX4 v1.13之前是microRTPS,PX4 v1.13之后是micro XRCE-DDS)进行通信,该接口在PX4 uORB话题和ROS2 DDS话题/类型之间提供直接桥接。这有效地允许实时从ROS2工作流和节点直接访问PX4内部。
对于ROS1:PX4和ROS1通过MAVLink进行通信,使用MAVROS包将ROS主题桥接到MAVLink。
使用ROS1时,PX4需要先接受MAVLink消息,内部应用程序再根据消息内容更改PX4 uORB话题中的参数值,但ROS2通过PX4-ROS2桥接工具可以直接更改PX4 uORB话题中的参数值,省略了一个步骤,所以是官方推荐的。
参考资料:
更多推荐
所有评论(0)