1、多机手柄控制1.1、多机配置1.1.1、多机通讯设置1.1.2、多机时间同步1.2、使用1.2.1、开启机器人1.2.2、开启手柄控制1.3、手柄控制分析1.3.1、控制多个机器人1.3.2、控制一个机器人
在使用多机手柄控制时,首先需要确保机器人在同一局域网下,配置同一个【ROS_MASTER_URI】;多个机器人控制运动,只可以有一个主机。本节案例设置虚拟机为主机,其他机器人为从机,有几个从机都可以;当然也可以设置某一机器人为主机其他为从机。
查看虚拟机的IP
ifconfig

xxxxxxxxxx#树莓派5主控需要先进入docker,多执行此步骤#如果运行脚本进入docker失败,请参考ROS/07、Docker教程~/run_docker.sh接下来只需修改从机(Robot端)的.bashrc文件即可,有几个从机配置几个
xxxxxxxxxxsudo vim ~/.bashrc
找到下面一行内容
xxxxxxxxxxexport ROS_MASTER_URI=http://IP:11311
此处的【IP】使用的是(虚拟机端)的IP。
xxxxxxxxxxexport ROS_MASTER_URI=http://192.168.2.106:11311
设置好IP后,最好刷新一下环境变量即可。
xxxxxxxxxxsource ~/.bashrc
安装
xxxxxxxxxxsudo apt install ntp ntpdate
时间查看命令
xxxxxxxxxxdate -R
有网络的情况下,系统均会自动同步网络系统时间,无需设置。如果没有网络,机器人之间的时间不同的时候需要设置时间
有网络
自动同步网络时间的命令
xxxxxxxxxxntpd pool ntp.ubuntu.com
无网络
测试案例是使用两台机器人。
手动设置时间的命令
xxxxxxxxxxsudo date -s "2020-01-1 01:01:01"
1)、服务器端(主机端)配置
打开【ntp.conf】文件
xxxxxxxxxxsudo vim /etc/ntp.conf
在文件末尾加入
xxxxxxxxxxrestrict 192.168.2.0 mask 255.255.255.0 nomodify notrapserver 127.127.1.0 # local clockfudge 127.127.1.0 stratum 10第一行是为了能让192.168.2.xxx网段上的机器能和本机进行时间同步(具体看你的ip是不是192.168.2.xxx,如果不一样的话,改成你实际的格式) 第二行和第三行是为了让本机的硬件时间和本机的ntp服务进行时间同步
改好后,重启ntp服务
xxxxxxxxxxsudo /etc/init.d/ntp restart
服务器端设置完成,下面开始客户端的设置
2)、客户端(从机端)配置
打开【ntp.conf】文件
xxxxxxxxxxsudo vim /etc/ntp.conf
在文件末尾加入【server】+【IP】
xxxxxxxxxxserver 192.168.2.106
3)、时间同步
在【服务器端】,执行下面的代码查看【服务器端】的ntp服务是否在运行
xxxxxxxxxxservice ntp status

如果,没有启动,则重启ntp服务。
网络更新(所有设备均需要)
xxxxxxxxxxsudo /etc/init.d/networking restart
时间同步
xxxxxxxxxxsudo ntpdate 192.168.2.106
如果客户端的ntp也开启了,需要先关闭ntp服务,再执行时间同步。
xxxxxxxxxxsudo /etc/init.d/ntp stop
以虚拟机是主机,2台机器人是从机为例。
虚拟机端
xxxxxxxxxxroscore
启动命令(robot1端),为方便操作,本节以【mono + laser + yahboomcar】为例。
xxxxxxxxxxroslaunch yahboomcar_multi laser_bringup_multi.launch ns:=robot1 # laser + yahboomcarroslaunch yahboomcar_multi laser_usb_bringup_multi.launch ns:=robot1 # mono + laser + yahboomcarroslaunch yahboomcar_multi laser_astrapro_bringup_multi.launch ns:=robot1 # Astra + laser + yahboomcar启动命令(robot2端),为方便操作,本节以【mono + laser + yahboomcar】为例。
xxxxxxxxxxroslaunch yahboomcar_multi laser_bringup_multi.launch ns:=robot2 # laser + yahboomcarroslaunch yahboomcar_multi laser_usb_bringup_multi.launch ns:=robot2 # mono + laser + yahboomcarroslaunch yahboomcar_multi laser_astrapro_bringup_multi.launch ns:=robot2 # Astra + laser + yahboomcar更多机器人以此类推。
方式一:一个手柄同时控制多个机器人
将手柄接收器链接虚拟机USB口,启动命令
xxxxxxxxxxroslaunch yahboomcar_multi joy_multi.launch
注意:该【launch】文件,默认是三台机器人。
joy_multi.launch
xxxxxxxxxx<launch> <arg name="first_robot1" default="robot1"/> <arg name="second_robot2" default="robot2"/> <arg name="third_robot3" default="robot3"/> <param name="use_sim_time" value="false"/> <node name="joy_node" pkg="joy" type="joy_node" output="screen" respawn="false"/> <!-- ############################# first_robot1 ############################# --> <include file="$(find yahboomcar_multi)/launch/library/joy_base.launch"> <arg name="ns" default="$(arg first_robot1)"/> </include> <!-- ############################# second_robot2 ############################# --> <include file="$(find yahboomcar_multi)/launch/library/joy_base.launch"> <arg name="ns" default="$(arg second_robot2)"/> </include> <!-- ############################# third_robot3 ############################# --> <include file="$(find yahboomcar_multi)/launch/library/joy_base.launch"> <arg name="ns" default="$(arg third_robot3)"/> </include></launch>如果是2台机器人将第3台的部分注释掉即可,不注释掉也不会有影响;如果4台及以上,可依照前3台样本增加。
方式二:一个手柄单独控制1台机器人
<PI5 需要打开另一终端进入同一个docker容器内

将手柄接收器链接对应的机器人上,在对应的机器人端,启动命令(以robot1为例)
xxxxxxxxxxroslaunch yahboomcar_multi joy_each.launch ns:=robot1
节点查看
xxxxxxxxxxrqt_graph

由图可以看出一个手柄同时控制多个机器人时,只需要有一个【joy_node】节点,接受手柄信号,针对不同的机器人设置不同的【yahboom_joy】节点用来控制对应的机器人。

由图可以看出一个手柄控制一个机器人时,对每个机器人单独设置,单独控制。