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文件即可,有几个从机配置几个
xxxxxxxxxx
sudo vim ~/.bashrc
找到下面一行内容
xxxxxxxxxx
export ROS_MASTER_URI=http://IP:11311
此处的【IP】使用的是(虚拟机端)的IP。
xxxxxxxxxx
export ROS_MASTER_URI=http://192.168.2.106:11311
设置好IP后,最好刷新一下环境变量即可。
xxxxxxxxxx
source ~/.bashrc
安装
xxxxxxxxxx
sudo apt install ntp ntpdate
时间查看命令
xxxxxxxxxx
date -R
有网络的情况下,系统均会自动同步网络系统时间,无需设置。如果没有网络,机器人之间的时间不同的时候需要设置时间
有网络
自动同步网络时间的命令
xxxxxxxxxx
ntpd pool ntp.ubuntu.com
无网络
测试案例是使用两台机器人。
手动设置时间的命令
xxxxxxxxxx
sudo date -s "2020-01-1 01:01:01"
1)、服务器端(主机端)配置
打开【ntp.conf】文件
xxxxxxxxxx
sudo vim /etc/ntp.conf
在文件末尾加入
xxxxxxxxxx
restrict 192.168.2.0 mask 255.255.255.0 nomodify notrap
server 127.127.1.0 # local clock
fudge 127.127.1.0 stratum 10
第一行是为了能让192.168.2.xxx网段上的机器能和本机进行时间同步(具体看你的ip是不是192.168.2.xxx,如果不一样的话,改成你实际的格式) 第二行和第三行是为了让本机的硬件时间和本机的ntp服务进行时间同步
改好后,重启ntp服务
xxxxxxxxxx
sudo /etc/init.d/ntp restart
服务器端设置完成,下面开始客户端的设置
2)、客户端(从机端)配置
打开【ntp.conf】文件
xxxxxxxxxx
sudo vim /etc/ntp.conf
在文件末尾加入【server】+【IP】
xxxxxxxxxx
server 192.168.2.106
3)、时间同步
在【服务器端】,执行下面的代码查看【服务器端】的ntp服务是否在运行
xxxxxxxxxx
service ntp status
如果,没有启动,则重启ntp服务。
网络更新(所有设备均需要)
xxxxxxxxxx
sudo /etc/init.d/networking restart
时间同步
xxxxxxxxxx
sudo ntpdate 192.168.2.106
如果客户端的ntp也开启了,需要先关闭ntp服务,再执行时间同步。
xxxxxxxxxx
sudo /etc/init.d/ntp stop
以虚拟机是主机,2台机器人是从机为例。
虚拟机端
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
更多机器人以此类推。
方式一:一个手柄同时控制多个机器人
将手柄接收器链接虚拟机USB口,启动命令
xxxxxxxxxx
roslaunch 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为例)
xxxxxxxxxx
roslaunch yahboomcar_multi joy_each.launch ns:=robot1
节点查看
xxxxxxxxxx
rqt_graph
由图可以看出一个手柄同时控制多个机器人时,只需要有一个【joy_node】节点,接受手柄信号,针对不同的机器人设置不同的【yahboom_joy】节点用来控制对应的机器人。
由图可以看出一个手柄控制一个机器人时,对每个机器人单独设置,单独控制。