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

目录

  • 0 专栏介绍
  • 1 定义多机器人节点
  • 2 控制多机器人运动
  • 3 launch文件多机递归启动
  • 4 实际部署:主从机配置

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个机器人

ROS多机器人控制(主从机配置)与launch递归启动_第1张图片
所有单个机器人的话题都加上了命名空间为前缀

ROS多机器人控制(主从机配置)与launch递归启动_第2张图片
分别往三个话题/robotA/cmd_vel/robotB/cmd_vel/robotC/cmd_vel发布数据,这里选择让机器人原地旋转

ROS多机器人控制(主从机配置)与launch递归启动_第3张图片

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>
        
        <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" />
    
        
        <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从入门到精通》
  • 《机器人原理与技术》
  • 《机器学习强基计划》
  • 《计算机视觉教程》

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

你可能感兴趣的:(ROS从入门到精通,机器人,自动驾驶,人工智能,车载系统,ROS)