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递归启动的主要内容,如果未能解决你的问题,请参考以下文章