基于gazebo的多飞行器仿真

本主题介绍如何使用 gazebo 和 sitl (仅限 linux) 模拟多架无人机/车辆。

如果您不需要 gazebo 或 ros 提供的功能, jmavsim的 Multi-车辆仿真更容易设置。

本文演示了一个示例设置, 该设置打开了 gazebo 客户端 界面, 在一个空旷的世界中显示了两个Iris无人机。 然后, 您可以使用 QGroundControl地面站 和MAVROS 控制多机, 其方式类似于您控制单机。

要求

编译和测试

若要编译示例设置, 请按照以下步骤操作:

  1. 克隆 px4固件代码, 然后编译 sitl 代码 cd Firmware_clone

    git submodule update --init --recursive
    DONT_RUN=1 make px4_sitl_default gazebo
    
  2. Source your environment:

    source Tools/setup_gazebo.bash $(pwd) $(pwd)/build/px4_sitl_default

    export ROS_PACKAGE_PATH=$ROS_PACKAGE_PATH:$(pwd):$(pwd)/Tools/sitl_gazebo
    
  3. 运行启动文件:

    roslaunch px4 multi_uav_mavros_sitl.launch

    您可以在上述 roslaunch 中指定 gui:=false, 以便在没有 ui 的情况下启动 gazebo。

本指南设置打开了 gazebo 客户端界面, 在一个空旷的世界中显示了两个Iris无人机。

然后, 您可以使用 QGroundControl地面站 和MAVROS 控制多机, 其方式类似于您控制单机。

  • QGroundControl 中有一个下拉菜单,你可以选择关注的飞行器。
  • MAVROS要求你在topic/servic路径之前包含合适的命名空间,(例如,你会用到/uav1/mavros/mission/push)。

发生了什么?

对每一个仿真的飞行器,有如下要求:

  • Gazebo model:在路径Firmware/Tools/sitl_gazebo/models/rotors_description/urdf/<model>_base.xacro下被定义成xacro 文件。看这里。 目前,模型 xacro文件设定以 base. xacro 结尾。 此模型应该有一个名为 mavlink_udp_port 的参数, 该参数定义了与 px4 节点通信的 udp 端口。 模型的 xacro 文件将用于生成包含您选择的 udp 端口的 urdf 模型。 若要定义 udp 端口,请在每个飞行器的启动文件中设置 mavlink_udp_port,请参阅例子here

    如果你在使用同一个飞行器模型,你不需要为每一个飞行器设置一个单独的xacro文件。 相同的 xacro 文件就可以了。

  • PX4 node: 这是 sitl px4 应用程序。它通过在Gazebo模型中定义的同一 udp 端口 (即 mavlink_udp_port)与模拟器 、gazebo 进行通信。 要在 px4 sitl 应用程序端设置 udp 端口, 您需要在启动文件中设置 SITL_UDP_PRT 参数, 以匹配前面讨论的 mavlink_udp_port, 请参阅 here。 启动文件中的开始文件路径由参数 vehicleID产生,参考这里。 开始文件中的每一个飞行器的MAV_SYS_ID参数都要与启动文件中的ID相匹配。参考这里。 这样能够帮助你确保启动文件和开始文件中的设置相同。

  • MAVROS node(可选): 如果要通过 ros 控制车辆, 可以在启动文件中运行一个单独的 mavros 节点, 请参阅 here, 以便连接到 px4 sitl 应用程序。 您需要在启动文件中一些特殊的端口上启动 mavlink 流, 请参阅 这里。 这些特殊端口需要与launch文件中为MAVROS节点设置的相符合。参考这里

启动文件 multi_uav_mavros_sitl.launch做了以下内容,

  • 在gazebo中加载一个世界

      <!-- 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)"/>
      </include>
    
  • 对于每个飞行器来说

    • 从 xacro 创建 urdf 模型, 加载gazebo模型并运行 px4 sitl 应用程序实例
        <!-- PX4 SITL and vehicle spawn -->
        <include file="$(find px4)/launch/single_vehicle_spawn.launch">
            <arg name="x" value="0"/>
            <arg name="y" value="0"/>
            <arg name="z" value="0"/>
            <arg name="R" value="0"/>
            <arg name="P" value="0"/>
            <arg name="Y" value="0"/>
            <arg name="vehicle" value="$(arg vehicle)"/>
            <arg name="rcS" value="$(find px4)/posix-configs/SITL/init/$(arg est)/$(arg vehicle)_$(arg ID)"/>
            <arg name="mavlink_tcp_port" value="4560"/>
            <arg name="ID" value="$(arg ID)"/>
        </include>
      
  • 运行mavros节点
      <!-- MAVROS -->
      <include file="$(find mavros)/launch/px4.launch">
          <arg name="fcu_url" value="$(arg fcu_url)"/>
          <arg name="gcs_url" value=""/>
          <arg name="tgt_system" value="$(arg ID)"/>
          <arg name="tgt_component" value="1"/>
      </include>
    

每个飞行器的完整块都包含在一组 <group> 标签中, 以区分飞行器的 ros 空间命名。

要在此模拟中添加第三个iris四旋翼, 需要考虑两个主要部分:

  • UAV3 添加到multi_uav_mavros_sitl.launch

    • 复制已经存在的四旋翼(UAV1 或者 UAV2)
    • ID 改为 3
    • 与gazebo的通信,选择一个不同的 mavlink_udp_port端口
    • MAVROS通信端口选择是通过在fcu_url 中修改两个端口号。
  • 创建一个开始文件,并按照如下方式修改:

    • 复制已存在的iris rcs启动文件,(iris_1iris_2) ,重命名为iris_3
    • MAV_SYS_ID 值改为3
    • SITL_UDP_PRT 的值与 mavlink_udp_port相一致。
    • 第一个mavlink start 端口和mavlink stream端口值设置为相同值,用于和QGC通信。
    • 第二个mavlink start 端口值应与启动文件 fcu_url 中的值一致。

      注意端口 srcdst是不同的

其他资源

results matching ""

    No results matching ""