【PX4-AutoPilot教程-仿真环境架构】梳理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系统启动文件中定义的。

System Startup

PX4 SITL软件在环仿真的架构

下图显示了使用MAVLink API接口的仿真器的典型SITL软件在环仿真的架构。

系统的不同部分通过UDP连接,可以在同一台计算机或同一局域网上的另一台计算机上运行。

PX4的UDP端口14540用于与Offboard模式板外电脑进行通信。

PX4的UDP端口14550用于与地面站进行通信。

PX4的TCP端口4560用于与仿真器的通信。

当使用make px4_sitl gazebomake px4_sitl gazebo-classicmake 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 gazeboroslaunch 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_***mand_arg1" value="-d"/>
    <arg     if="$(arg interactive)" name="px4_***mand_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_***mand_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话题中的参数值,省略了一个步骤,所以是官方推荐的。


参考资料:

PX4官方文档-仿真

PX4-Gazebo仿真学习笔记

PX4在GAZEBO仿真中加载iris模型问题

转载请说明出处内容投诉
CSS教程_站长资源网 » 【PX4-AutoPilot教程-仿真环境架构】梳理PX4&Gazebo&MAVLink&MAVROS&ROS&ROS2之间的关系

发表评论

欢迎 访客 发表评论

一个令你着迷的主题!

查看演示 官网购买