本专栏旨在通过对ROS的系统学习,掌握ROS底层基本分布式原理,并具有机器人建模和应用ROS进行实际项目的开发和调试的工程能力。
详情:《ROS从入门到精通》
定义一个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
前缀
终端输入下面命令,运行启动文件
roslaunch turtlebot3_gazebo multi_turtlebot3_empty_world.launch
可以看到在Gazebo
中产生了3个机器人
分别往三个话题/robotA/cmd_vel
、/robotB/cmd_vel
、/robotC/cmd_vel
发布数据,这里选择让机器人原地旋转
上面写的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
即可递归启动各个机器人,在实践中非常简洁、方便。
.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
本文的完整工程代码订阅后联系博主获取
更多精彩专栏: