关于如何配置多机通讯和同步时间的问题,具体参考【多机手柄控制】这一节课;有网络的情况下直接同步网络系统时间,无需设置。
在使用多机手柄控制时,首先需要确保机器人在同一局域网下,配置同一个【ROS_MASTER_URI】;多个机器人控制运动,只可以有一个主机。本节案例设置虚拟机为主机,其他机器人为从机,有几个从机都可以;当然也可以设置某一机器人为主机其他为从机。
根据针对不同车型,只需在【.bashrc】中设置购买的车型即可,X1(普通四驱) X3(麦轮)X3plus(麦轮机械臂) R2(阿克曼差速) 等等,本节以X3为例
#树莓派5主控需要先进入docker,多执行此步骤
#如果运行脚本进入docker失败,请参考ROS/07、Docker教程
~/run_docker.sh
打开【.bashrc】文件
xxxxxxxxxx
sudo vim .bashrc
查找【ROBOT_TYPE】参数,修改相应的车型
xxxxxxxxxx
export ROBOT_TYPE=X3 # ROBOT_TYPE: X1 X3 X3plus R2 X7
以虚拟机是主机,3台机器人是从机为例;使用前必须有地图。
虚拟机端
xxxxxxxxxx
roscore
启动命令(robot1端),为方便操作,本节以【mono + laser + yahboomcar】为例。
xxxxxxxxxx
roslaunch yahboomcar_multi laser_bringup_multi.launch ns:=robot1 # laser + yahboomcar
roslaunch yahboomcar_multi laser_usb_bringup_multi.launch ns:=robot1 # mono + laser + yahboomcar
roslaunch yahboomcar_multi laser_astrapro_bringup_multi.launch ns:=robot1 # Astra + laser + yahboomcar
启动命令(robot2端),为方便操作,本节以【mono + laser + yahboomcar】为例。
xxxxxxxxxx
roslaunch yahboomcar_multi laser_bringup_multi.launch ns:=robot2 # laser + yahboomcar
roslaunch yahboomcar_multi laser_usb_bringup_multi.launch ns:=robot2 # mono + laser + yahboomcar
roslaunch yahboomcar_multi laser_astrapro_bringup_multi.launch ns:=robot2 # Astra + laser + yahboomcar
更多机器人以此类推。
手柄控制开启过程参考【多机手柄控制】这一节课。
虚拟机端
xxxxxxxxxx
roslaunch yahboomcar_multi yahboomcar_nav_multi.launch use_rviz:=true map:=my_map
【use_rviz】参数:是否打开rviz。
【map】参数:地图名,要加载的地图。
打开多机导航后密密麻麻的一团,每个机器人的位姿都不正确,首先要对每个机器人设置初始位姿。
提示:启动如果提示my_map错误
应该把.yaml文件终端内容路径更改正确
在工具栏(绿框)右键便弹出一个对话框(红框),如上图所示,在【2D Pose Estimate】处右键,然后选择【Tool Properties】,如下图,弹出一个对话框。
从上往下【2D Pose Estimate】和【2D Nav Goal】与【rviz】工具栏从左往右一一对应。设置红色箭头指向的话题名,这个方法快速便捷。
假如有4台及以上机器人,初始位姿和导航图标似乎不够,怎么办?
这个时候需要打开【navigation_multi.rviz】文件(使用哪个rviz就打开哪一个,以【navigation_multi.rviz】为例),找到下面的内容。这些内容和rviz工具栏的图标一一对应,如果想要增加哪一个图标就复制一个哪一个图标整段【Class】内容,一定不能少东西,并且格式要正确。
xxxxxxxxxx
Tools:
- Class: rviz/MoveCamera
- Class: rviz/Interact
Hide Inactive Objects: true
- Class: rviz/Select
- Class: rviz/SetInitialPose
Theta std deviation: 0.2617993950843811
Topic: robot1/initialpose
X std deviation: 0.5
Y std deviation: 0.5
- Class: rviz/SetGoal
Topic: robot1/move_base_simple/goal
- Class: rviz/SetInitialPose
Theta std deviation: 0.2617993950843811
Topic: robot2/initialpose
X std deviation: 0.5
Y std deviation: 0.5
- Class: rviz/SetGoal
Topic: robot2/move_base_simple/goal
- Class: rviz/SetInitialPose
Theta std deviation: 0.2617993950843811
Topic: robot3/initialpose
X std deviation: 0.5
Y std deviation: 0.5
- Class: rviz/SetGoal
Topic: robot3/move_base_simple/goal
- Class: rviz/Measure
机器人太多在地图上的信息特别复杂,这种情况下可以将左侧【Displays】显示项列表中机器人后面的对号勾掉,依次对每一个机器人进行位姿设置。设置后效果如下。设置完毕后即可导航。
使用【rviz】工具的【2D Pose Estimate】设置初始位姿,直到仿真中的小车的位置,与实际小车的位置一致。
点击【rviz】工具的【2D Nav Goal】,然后再地图上在没有障碍物的地方选择目标点,松开鼠标即开始导航,只能选择一个目标点,到达即停止。
xxxxxxxxxx
<launch>
<arg name="first_robot1" default="robot1"/>
<arg name="second_robot2" default="robot2"/>
<arg name="third_robot3" default="robot3"/>
<!-- 是否打开rviz || Whether to open rviz -->
<arg name="use_rviz" default="true"/>
<!-- 地图名 || Map name -->
<arg name="map" default="my_map"/>
<!-- 加载地图 || Load map -->
<node name="map_server" pkg="map_server" type="map_server" args="$(find yahboomcar_nav)/maps/$(arg map).yaml"/>
<node pkg="rviz" type="rviz" name="rviz" required="true"
args="-d $(find yahboomcar_multi)/rviz/navigation_multi.rviz" if="$(arg use_rviz)"/>
<!-- 多机手柄控制 || Multi machine handle control-->
<include file="$(find yahboomcar_multi)/launch/joy_multi.launch"/>
<!-- 手机app节点 || Mobile app node-->
<include file="$(find yahboomcar_nav)/launch/library/app.launch"/>
<!-- ############################# first_robot1 ############################# -->
<include file="$(find yahboomcar_multi)/launch/library/move_base_multi.launch">
<arg name="ns" value="$(arg first_robot1)"/>
</include>
<!-- ############################# second_robot2 ############################# -->
<include file="$(find yahboomcar_multi)/launch/library/move_base_multi.launch">
<arg name="ns" value="$(arg second_robot2)"/>
</include>
<!-- ############################# third_robot3 ############################# -->
<include file="$(find yahboomcar_multi)/launch/library/move_base_multi.launch">
<arg name="ns" value="$(arg third_robot3)"/>
</include>
</launch>
可以根据自身需求修改,如果4台及其以上机器人,仿照前3台的案例增加相关内容即可。
节点查看
xxxxxxxxxx
rqt_graph
节点图一大堆,看起来很复杂,其实很有条理性。对于每一个机器人的内部节点几乎都是一样,和单个机器人的导航也是相同的。这里需注意的是地图加载只需要加载一次就可以啦,不需要每一个机器人都去加载。同时我也开启了手柄控制的节点,一个手柄同时控制多个机器人,只需启动一次【joy_node】节点。
查看tf树
xxxxxxxxxx
rosrun rqt_tf_tree rqt_tf_tree
tf坐标系也是一大堆,需放大看。全局只有一个【map】,每一个【amcl】分别定位每一个机器人,再往下就和单个机器人导航一样啦。