ROS多机器人控制(主从机配置)与launch递归启动

Posted Mr.Winter`

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ROS多机器人控制(主从机配置)与launch递归启动相关的知识,希望对你有一定的参考价值。

目录

0 专栏介绍

本专栏旨在通过对ROS的系统学习,掌握ROS底层基本分布式原理,并具有机器人建模和应用ROS进行实际项目的开发和调试的工程能力。

🚀详情:《ROS从入门到精通》

1 定义多机器人节点

定义一个multi_turtlebot3_empty_world.launch启动文件,其内容如下

<launch>
  <arg name="model" default="$(env TURTLEBOT3_MODEL)" doc="model type [burger, waffle, waffle_pi]"/>

  <arg name="robotA"  default="robotA"/>
  <arg name="robotB" default="robotB"/>
  <arg name="robotC"  default="robotC"/>

  <arg name="robotA_x_pos" default="-2.0"/>
  <arg name="robotA_y_pos" default="-1.0"/>
  <arg name="robotA_z_pos" default=" 0.0"/>
  <arg name="robotA_yaw"   default=" 1.57"/>

  <arg name="robotB_x_pos" default=" 2.0"/>
  <arg name="robotB_y_pos" default="-1.0"/>
  <arg name="robotB_z_pos" default=" 0.0"/>
  <arg name="robotB_yaw"   default=" 1.57"/>

  <arg name="robotC_x_pos" default=" 0.5"/>
  <arg name="robotC_y_pos" default=" 2.0"/>
  <arg name="robotC_z_pos" default=" 0.0"/>
  <arg name="robotC_yaw"   default=" 0.0"/>

  <include file="$(find gazebo_ros)/launch/empty_world.launch">
    <arg name="world_name" value="$(find turtlebot3_gazebo)/worlds/empty.world"/>
    <arg name="paused" value="false"/>
    <arg name="use_sim_time" value="true"/>
    <arg name="gui" value="true"/>
    <arg name="headless" value="false"/>
    <arg name="debug" value="false"/>
  </include>

  <group ns = "$(arg robotA)">
    <param name="robot_description" command="$(find xacro)/xacro --inorder $(find turtlebot3_description)/urdf/turtlebot3_$(arg model).urdf.xacro" />
    <node pkg="gazebo_ros" type="spawn_model" name="spawn_urdf" args="-urdf -model turtlebot3_$(arg robotA) -x $(arg robotA_x_pos) -y $(arg robotA_y_pos) -z $(arg robotA_z_pos) -Y $(arg robotA_yaw) -param robot_description" />
  </group>

  <group ns = "$(arg robotB)">
    <param name="robot_description" command="$(find xacro)/xacro --inorder $(find turtlebot3_description)/urdf/turtlebot3_$(arg model).urdf.xacro" />
    <node pkg="gazebo_ros" type="spawn_model" name="spawn_urdf" args="-urdf -model turtlebot3_$(arg robotB) -x $(arg robotB_x_pos) -y $(arg robotB_y_pos) -z $(arg robotB_z_pos) -Y $(arg robotB_yaw) -param robot_description" />
  </group>

  <group ns = "$(arg robotC)">
    <param name="robot_description" command="$(find xacro)/xacro --inorder $(find turtlebot3_description)/urdf/turtlebot3_$(arg model).urdf.xacro" />
    <node pkg="gazebo_ros" type="spawn_model" name="spawn_urdf" args="-urdf -model turtlebot3_$(arg robotC) -x $(arg robotC_x_pos) -y $(arg robotC_y_pos) -z $(arg robotC_z_pos) -Y $(arg robotC_yaw) -param robot_description" />
  </group>
</launch>

通过group分组命名空间ns的形式将同一个模型进行复制,实现多个机器人的效果,所有话题都将带有ns前缀

2 控制多机器人运动

终端输入下面命令,运行启动文件

roslaunch turtlebot3_gazebo multi_turtlebot3_empty_world.launch

可以看到在Gazebo中产生了3个机器人


所有单个机器人的话题都加上了命名空间为前缀


分别往三个话题/robotA/cmd_vel/robotB/cmd_vel/robotC/cmd_vel发布数据,这里选择让机器人原地旋转

3 launch文件多机递归启动

上面写的launch文件重复的代码太多,不够简洁,工程中可以采用一种递归启动的方法

  • 首先写好一套单机器人启动的launch文件

    <group ns = "$(arg robot_namespace)">
        <!-- 设置坐标变换命名空间 -->
        <param name="tf_prefix" value="$(arg robot_namespace)" />
        <!-- 添加机器人模型文件 -->
        <param name="robot_description" command="$(find xacro)/xacro --inorder $(find turtlebot3_description)/urdf/turtlebot3_$(arg model).urdf.xacro" />
        <!-- 发布机器人状态 -->
        <node pkg="robot_state_publisher" type="robot_state_publisher" name="robot_state_publisher" output="screen">
            <param name="publish_frequency" type="double" value="50.0" />
        </node>
        <node pkg="joint_state_publisher" type="joint_state_publisher" name="joint_state_publisher" output="screen">
            <param name="use_gui" value="true" />
        </node>
        <!-- 添加Gazebo模型 -->
        <node name="spawn_urdf" pkg="gazebo_ros" type="spawn_model" 
            args="-urdf -model $(arg robot_namespace) -x $(arg robot_x) -y $(arg robot_y) -z $(arg robot_z) -param robot_description" />
    </group>
    
  • 再配置递归启动文件

    <launch>
        <!-- 机器人数量 -->
        <arg name="robot_number" />
    
        <arg name="robot1_x_pos" default="-1.0"/>
        <arg name="robot1_y_pos" default="-5.4"/>
        <arg name="robot1_z_pos" default=" 0.0"/>
    
        <arg name="robot2_x_pos" default="0.0"/>
        <arg name="robot2_y_pos" default="-0.5"/>
        <arg name="robot2_z_pos" default=" 0.0"/>
    
        <include file="$(find multi_robots_ctrl)/launch/single_robot.launch">
            <arg name="robot_namespace" value="robot$(arg robot_number)"/>
            <arg name="robot_x" value="$(eval arg('robot' + str(arg('robot_number')) + '_x_pos'))" />
            <arg name="robot_y" value="$(eval arg('robot' + str(arg('robot_number')) + '_y_pos'))" />
            <arg name="robot_z" value="$(eval arg('robot' + str(arg('robot_number')) + '_z_pos'))" />
        </include>
    
        <include file="$(find multi_robots_ctrl)/launch/multi_robots_recurrence.launch"  if="$(eval arg('robot_number') > 1)" >
            <arg name="robot_number" value="$(eval arg('robot_number') - 1)" />
        </include>
    </launch>
    
  • 最后配置主启动文件

    <launch>
        <!-- 采用的机器人模型 -->
        <arg name="model" default="$(env TURTLEBOT3_MODEL)" doc="model type [burger, waffle, waffle_pi]"/>
        <!-- 机器人数量 -->
        <arg name="robot_number" default="1" />
    
        <!-- 加载自定义Gazebo地图 -->
        <include file="$(find gazebo_ros)/launch/empty_world.launch">
            <arg name="world_name" value="$(find turtlebot3_gazebo)/worlds/empty.world"/>
            <arg name="paused" value="false"/>
            <arg name="use_sim_time" value="true"/>
            <arg name="gui" value="true"/>
            <arg name="headless" value="false"/>
            <arg name="debug" value="false"/>
        </include>
    
        <!-- 启动机器人 -->
        <include file="$(find multi_robots_ctrl)/launch/multi_robots_recurrence.launch">
            <arg name="robot_number" value="$(arg robot_number)" />
        </include>
    </launch>
    

启动main.launch即可递归启动各个机器人,在实践中非常简洁、方便。

4 实际部署:主从机配置

  • 将主机、从机连接到同一局域网下,并查询各自ip地址
  • 主控平台.bashrc配置
    export ROS_HOSTNAME=主机IP
    export ROS_MASTER_URI=http://主机IP:11311
    export ROS_IP=主机IP
    
  • 从机.bashrc配置(多个机器人)
    export ROS_HOSTNAME=从机IP
    export ROS_MASTER_URI=http://主机IP:11311
    export ROS_IP=主机IP
    

本文的完整工程代码订阅后联系博主获取


🔥 更多精彩专栏


👇源码获取 · 技术交流 · 抱团学习 · 咨询分享 请联系👇

以上是关于ROS多机器人控制(主从机配置)与launch递归启动的主要内容,如果未能解决你的问题,请参考以下文章

[ros] --- 配置ros主从机

[ros] --- 配置ros主从机

[ros] --- 配置ros主从机

ROS1/2机器人多机网络通信配置-更新-2022

ROS 机器人技术 - 编写一个 launch 启动多个节点

ROS1/2机器人多机网络通信配置-更新-2022