[rotors] Simulation de drone multi-rotor (5) - Simulation multi-drone

【rotors】Simulation de drone multi-rotor (1) - Construire un environnement de simulation de rotors
【rotors】Simulation de drone multi-rotor (2) - définir la trajectoire de vol
【rotors】Simulation de drone multi-rotor (3) - SE3 Control
[rotors] multi - simulation de drone à rotor (quatre) - compensation des paramètres et contrôle PID
[rotors] simulation de drone multi-rotor (cinq) - simulation multi-drone

Le contenu de cet article fait référence au contenu de deux blogueurs : Reed
Liao

1. Introduction

Dans la section précédente , nous avons expliqué la compensation des paramètres et le contrôle PID, mais il s'agit d'un seul drone, cette section explique comment créer plusieurs simulations de drones.

2. Simulation de drone

Dans la simulation ROS et gazebo, il est très simple de créer plusieurs robots, il suffit de ctrl C + ctrl V, mais il convient de noter que les espaces de noms des différents robots doivent être différents, sinon des conflits se produiront.

Créé sous ~/UAV_rotors/src/rotors_simulator/rotors_gazebo/launchle dossier multiple_UAV.launch, le contenu est :

<launch>
  <arg name="mav_name" default="firefly"/>
  <arg name="world_name" default="basic"/>
  <arg name="enable_logging" default="false" />
  <arg name="enable_ground_truth" default="true" />
  <arg name="log_file" default="$(arg mav_name)" />

  <env name="GAZEBO_MODEL_PATH" value="${GAZEBO_MODEL_PATH}:$(find rotors_gazebo)/models"/>
  <env name="GAZEBO_RESOURCE_PATH" value="${GAZEBO_RESOURCE_PATH}:$(find rotors_gazebo)/models"/>
  <!-- 启动gazebo -->
  <include file="$(find gazebo_ros)/launch/empty_world.launch">
    <arg name="world_name" value="$(find rotors_gazebo)/worlds/$(arg world_name).world" />
    <!-- <arg name="debug" value="true"/> -->
    <arg name="paused" value="true"/>
    <!-- <arg name="gui" value="false"/> -->
    <!-- <arg name="verbose" value="true"/> -->
  </include>

  <!-- 修改ns -->
  <group ns="$(arg mav_name)_0">
    <!-- 导入无人机模型 -->
    <include file="$(find rotors_gazebo)/launch/spawn_mav.launch">
      <arg name="mav_name" value="$(arg mav_name)" />
      <arg name="model" value="$(find rotors_description)/urdf/mav_with_vi_sensor.gazebo" />
      <arg name="enable_logging" value="$(arg enable_logging)" />
      <arg name="enable_ground_truth" value="$(arg enable_ground_truth)" />
      <arg name="log_file" value="$(arg log_file)"/>
      <!-- 修改namespace -->
      <arg name="namespace" default="$(arg mav_name)_0"/>
    </include>
    <!-- 启动无人机控制节点 -->
    <node name="lee_position_controller_node" pkg="rotors_control" type="lee_position_controller_node" output="screen">
      <rosparam command="load" file="$(find rotors_gazebo)/resource/lee_controller_$(arg mav_name).yaml" />
      <rosparam command="load" file="$(find rotors_gazebo)/resource/$(arg mav_name).yaml" />
      <remap from="odometry" to="odometry_sensor1/odometry" />
    </node>
    <!-- 启动无人机轨迹控制命令节点 -->
    <node name="hovering_example" pkg="rotors_gazebo" type="hovering_example" output="screen"/>
    <!-- 启动仿真关节节点 -->
    <node name="robot_state_publisher" pkg="robot_state_publisher" type="robot_state_publisher" />
    <node name="joint_state_publisher" pkg="joint_state_publisher" type="joint_state_publisher" />
  </group>

  <group ns="$(arg mav_name)_1">
    <!-- 导入无人机模型 -->
    <include file="$(find rotors_gazebo)/launch/spawn_mav.launch">
      <arg name="mav_name" value="$(arg mav_name)" />
      <arg name="model" value="$(find rotors_description)/urdf/mav_with_vi_sensor.gazebo" />
      <arg name="enable_logging" value="$(arg enable_logging)" />
      <arg name="enable_ground_truth" value="$(arg enable_ground_truth)" />
      <arg name="log_file" value="$(arg log_file)"/>
        <!-- 无人机初始位置 -->
      <arg name="x" value="3.0"/>
      <arg name="y" value="3.0"/>
      <arg name="z" value="0.1"/>
      <arg name="namespace" default="$(arg mav_name)_1"/>
    </include>
    <!-- 启动无人机控制节点 -->
    <node name="lee_position_controller_node" pkg="rotors_control" type="lee_position_controller_node" output="screen">
      <rosparam command="load" file="$(find rotors_gazebo)/resource/lee_controller_$(arg mav_name).yaml" />
      <rosparam command="load" file="$(find rotors_gazebo)/resource/$(arg mav_name).yaml" />
      <remap from="odometry" to="odometry_sensor1/odometry" />
    </node>
    <!-- 启动无人机轨迹控制命令节点 -->
    <node name="hovering_example" pkg="rotors_gazebo" type="hovering_example" output="screen"/>
    <!-- 启动仿真关节节点 -->
    <node name="robot_state_publisher" pkg="robot_state_publisher" type="robot_state_publisher" />
    <node name="joint_state_publisher" pkg="joint_state_publisher" type="joint_state_publisher" />
  </group>

  <group ns="$(arg mav_name)_2">
    <!-- 导入无人机模型 -->
    <include file="$(find rotors_gazebo)/launch/spawn_mav.launch">
      <arg name="mav_name" value="$(arg mav_name)" />
      <arg name="model" value="$(find rotors_description)/urdf/mav_with_vi_sensor.gazebo" />
      <arg name="enable_logging" value="$(arg enable_logging)" />
      <arg name="enable_ground_truth" value="$(arg enable_ground_truth)" />
      <arg name="log_file" value="$(arg log_file)"/>
      <arg name="x" value="0.0"/>
      <arg name="y" value="3.0"/>
      <arg name="z" value="0.1"/>
      <arg name="namespace" default="$(arg mav_name)_2"/>
    </include>
    <!-- 启动无人机控制节点 -->
    <node name="lee_position_controller_node" pkg="rotors_control" type="lee_position_controller_node" output="screen">
      <rosparam command="load" file="$(find rotors_gazebo)/resource/lee_controller_$(arg mav_name).yaml" />
      <rosparam command="load" file="$(find rotors_gazebo)/resource/$(arg mav_name).yaml" />
      <remap from="odometry" to="odometry_sensor1/odometry" />
    </node>
    <!-- 启动无人机轨迹控制命令节点 -->
    <node name="hovering_example" pkg="rotors_gazebo" type="hovering_example" output="screen"/>
    <!-- 启动仿真关节节点 -->
    <node name="robot_state_publisher" pkg="robot_state_publisher" type="robot_state_publisher" />
    <node name="joint_state_publisher" pkg="joint_state_publisher" type="joint_state_publisher" />
  </group>

  <group ns="$(arg mav_name)_3">
    <!-- 导入无人机模型 -->
    <include file="$(find rotors_gazebo)/launch/spawn_mav.launch">
      <arg name="mav_name" value="$(arg mav_name)" />
      <arg name="model" value="$(find rotors_description)/urdf/mav_with_vi_sensor.gazebo" />
      <arg name="enable_logging" value="$(arg enable_logging)" />
      <arg name="enable_ground_truth" value="$(arg enable_ground_truth)" />
      <arg name="log_file" value="$(arg log_file)"/>
      <arg name="x" value="3.0"/>
      <arg name="y" value="0.0"/>
      <arg name="z" value="0.1"/>
      <arg name="namespace" default="$(arg mav_name)_3"/>
    </include>
    <!-- 启动无人机控制节点 -->
    <node name="lee_position_controller_node" pkg="rotors_control" type="lee_position_controller_node" output="screen">
      <rosparam command="load" file="$(find rotors_gazebo)/resource/lee_controller_$(arg mav_name).yaml" />
      <rosparam command="load" file="$(find rotors_gazebo)/resource/$(arg mav_name).yaml" />
      <remap from="odometry" to="odometry_sensor1/odometry" />
    </node>
    <!-- 启动无人机轨迹控制命令节点 -->
    <node name="hovering_example" pkg="rotors_gazebo" type="hovering_example" output="screen"/>
    <!-- 启动仿真关节节点 -->
    <node name="robot_state_publisher" pkg="robot_state_publisher" type="robot_state_publisher" />
    <node name="joint_state_publisher" pkg="joint_state_publisher" type="joint_state_publisher" />
  </group>
</launch>

Exécutez simplement :

roslaunch rotors_gazebo multiple_UAV.launch

insérez la description de l'image ici
Expliquez que chaque drone doit avoir son propre nœud de contrôle lee_position_controller_node, mais que le nœud de commande de contrôle de la trajectoire du drone hovering_example peut être partagé par tout le monde

Je suppose que tu aimes

Origine blog.csdn.net/caiqidong321/article/details/128766861
conseillé
Classement