智能机器人(04):通用网络配置

分布式特点的ROS对网络配置的要求主要四点:

1、只能有一台作为master,
2、所有节点node必须通过ROS_MASTER_URI配置为相同的master,
3、配对机器的所有端口必须具有完全的双向连接,
4、所有机器必须广播一个其他机器可以解析的机器名。

先设置三个环境变量,$ROS_MASTER_URI,$ROS_HOSTNAME,$ROS_IP :
ROS_MASTER_URI,整个ROS系统的主机IP+端口,启动roscore
ROS_HOSTNAME 和 ROS_IP设置ROS节点公网地址,两者互斥,ROS_HOSTNAME优先

常规可以这样设置:
export ROS_MASTER_URI=http://`hostname -I`:11311
export ROS_HOSTNAME=`hostname`
export ROS_IP=`hostname -I`
不带i的是主机名、带了i的输出主机地址(需要先设/etc/hosts)

再假设三台机器的应用场景:
一台笔记本作为robot的主机,master230 ,172.20.10.5;
一个台式机作为workstation的客户端,client501 ,172.20.10.3;
然后我们工作在远程的第三台笔记本上,client480,172.20.10.1.

1、edit  /etc/hosts file

To know the mapping of some hostnames to IP addresses before DNS can be referenced. This mapping is kept in the /etc/hosts file. In the absence of a name server, any network program on your system consults this file to determine the IP address that corresponds to a host name. For example in master’s netbook :

IPAddress—– Hostname—–Alias

127.0.0.1 localhost master230 .xxx.com

172.20.10.5 master230 master230.xxx.com

172.20.10.3 client501 client501.xxx.com

172.20.10.1 client480 client480.xxx.com

然后我们工作在远程的第三台笔记本上,client480,172.20.10.1。

don’t forget to restart your network for the changes to take effect:

$ /etc/init.d/networking restart

2、网络设置

首先,master230和client480的所有端口需要完整的双向连接。
1、自身ping
测试robot ,$ping master230
测试客户端 ,$ping client480
2、互相ping
测试robot ,$ping master230
测试客户端 ,$ping client480
3、netcat
只能自身ping通和相互ping通仅仅检查了相互之间的ICMP包正常,但这还是不够的,需要验证所有端口可用,完整地检查很困难,因为有65K个端口,可以使用netcat尝试
特定的端口测试。挑选大于1024的端口号:
(1)测试master230到client480, 启动netcat监听:
$netcat -l 1234
(2)在client480连接master230,
$netcat master230 1234
(3)互相聊一聊,正常。
(4)然后更换一个方向,正常。

3、多机互联

1、启动master
注意只能有一台作为master,这里选择master230作为master:
$roscore
$export ROS_MASTER_URI=http://p110:11311/
2、启动一个听者
$ssh hal
$export ROS_IP=p110.local
$export ROS_MASTER_URI=http://p110.local:11311
$rosrun rospy_tutorials listener.py
3、启动一个讲者
$ssh marvin
$export ROS_IP=dehao-B3.local
$export ROS_MASTER_URI=http://p110.local:11311
$rosrun rospy_tutorials talker.py
此时可以看到p110接收到来自dehao-B3的消息。
4、其实这是双向的,下一步互换:
把讲者和听者在两台机器之间互换,同样工作。
5、便利操作
如果长期这样使用,可以把上面的命令添加到.bashrc中。

在ROS节点node广播主题topic时,提供的是hostname:port组合也就是URI,有几种设置方法。
1、显式的设置名字
ROS_IP和ROS_HOSTNAME是设置ROS的node时候可选的环境变量,他们是互斥的,同时设置的话优先的是ROS_HOSTNAME,所以我们一般是设置ROS_HOSTNAME而不是设置ROS_IP。

4、时间同步

在坐标变换出现错误:TF complaining about extrapolation into the future时,首先要检查不同机器之间的时间矛盾:
$ntpdate -q other_computer_ip
必要的话安转chrony同一时间。

1. Check one machine against another machine:
$ ntpdate -q other_computer_ip or hostname
2. Install Chrony:
$ sudo apt-get install chrony
3. For instance computer c2 gets its time from computer c1 then add following line:
$ sudo /etc/chrony/chrony.conf
server c1 minpoll 0 maxpoll 5 maxdelay .05
4. That machine will then slowly move its time towards the server.
$ sudo /etc/init.d/chrony stop
$ ntpdate other_computer_ip
$ sudo /etc/init.d/chrony start
5. manually sync NTP
$ sudo ntpdate ntp.ubuntu.com

实际环境中:
需要把多个机器人rbt1、rbt2…和不同服务器server-vpn、server-web…和各个管理计算机pc1、pc2…配置在同一个虚拟专网里面,并配发不同的vpn证书已进行安全管理。
对于后台管理系统,需要通过ssl配发不同的证书进行安全管理。对于远程操操纵,更要配发证书进行安全管理。

智能机器人(02):系统功能

1. 自助定位导航机器人的功能

建图、定位、和导航:
gmapping – 负责建立地图
amcl – 确定在地图的位置
move_base – 导航

2. 自助定位导航机器人的控制

这张三种颜色的图:
白色代表已经实现而且是必需的
灰色代表已经实现的但是可选的
蓝色代表必需的,而且对硬件平台不独立的

中间的move_base这个大框包括: 全局地图,局部地图,全局路径,局部路径,还有恢复机制。
把move_base大框看作黑盒子,可以看到它要五个接口:
4个输入(”/tf”, “/odom”, “/map”,“/scan”)
1个输出(“cmd_vel”)

要使move_base大方框运行起来,就得构建好这4输入和1输出:
tf: 各个坐标系之间的转换关系。
odom: 根据各个轮速度推算出的航向信息,即机器人在odom坐标系的x,y坐标及航向角yaw。
map: 机器人在此地图中的目标位置。
scan: 传感器的信息用于定位。如果假定map坐标系和odom坐标系重合就不要scan了。
cmd_vel: 包含的是期望的机器人的前进速度和转向速度。

具体流程是:
move_base收到goal以后,通过基于actionlib的client向服务器发送此目标goal,actionlib服务器根据tf关系以及odom消息,不断feedback机器人状态给client, 规划和控制twist。

3. 自助定位导航机器人的架构

从低到高依次分为:
*1 motion driver
*2 base controller
*3 sensor sources
*4 gmapping+amcl
*5 move_base navi

*1 motion driver
这是最底层的电机驱动和反馈:
电机驱动: 硬件重要模块,不存在通用的电机驱动。
点击反馈:通过编码器将滚动圈数转化为距离,在ROS中edcoder就是 odometry
DSP活51单片机都可以满足要求。定时采样码盘值给base,同时对左右轮分别进行控速。

*2 base controller
base controller必须运行在robot自己的电脑上,负责两件事情:
第一是:在odom话题发布里程计数据,并可选的发布 odom -> base_link的tf转换。
第二是:在cmd_vel话题上发布控制线速度和角速度的大小。
这层的软件不需要关注硬件的差异,根据ROS接口写的程序换台robot依然可以运行。
给让其他节点订阅的odom,主要用航迹推演法将各个轮速度转化为机器人的x轴方向速度和机器人的旋转速度,然后发布。
由move_base规划输出的cmd_vel, 需要注意速度的平滑速度,给下位机执行。
要注意odom发布频率,涉及到costmap更新与坐标系的访问超时。

*3 sensor sources
单靠一个传感器可能是不够的,尤其是采用 kinect 之类只有小角度的景深设备。
这时候就需要用到多传感器融合的方法。多传感器融合定位、自定位是很重要的一部分,精度直接影响到建图导航的准确性。

*4 gmapping+amcl
通过laser或者rgbd完成地图的构建。一旦有了环境的地图,通过amcl实现robot的自主定位。
amcl定位模块作为move_base规划层的输入,模块间通讯方式实现了模块间的完全解耦。
所以导航规划层用什么定位方法,静态还是动态的地图,对于导航层内部几乎没有区别。

*5 move_base navi
在地图上指定一目标地点及到达时的robot位姿,通过自主规划路径到达。
机器人根据里程计的数据依靠move_base同时结合local和global代价地图去做路径规划,最终到达目标地点。
在机器人运动过程中,可以做到避障。在避障过程中,自动调整robot的移动速度。

NEXT:
智能机器人系统功能(01)
智能机器人运动驱动(03)
智能机器人基控制器(05)
智能机器人传感器源(07)
智能机器人自助定位(09)
智能机器人数据融合(11)
智能机器人自主导航(13)
智能机器人导航调试(15)
智能机器人任务调度(17)
智能机器人系统功能(19)