【multimaster_fkie package】ROS多机通信配置

整个配置过程相当地痛苦,而且也很玄学,到目前为止,依然不清楚是哪一个步骤使得配置成功啦!

1. 功能包安装

sudo apt-get install ros-kinetic-multimaster-fkie

2. 实验配置

2.1. 固定IP地址

这一步是可有可无的,只要路由器能够保证,电脑关机重启后,能够分配到同一个IP地址便没有任何问题。如果目标对象是一些嵌入式设备,完全可以将其IP地址给固定下来,但是IP固定之后,貌似无法联网,目前该问题还不清楚如何解决。

# 具体设置可以在Ubuntu的有线连接进行设置,将IPV Settings的Method设置为Automatic(DHCP)
# 然后添加Address、Netmask、Gateway,点击保存即可
# 修改完网络设置,需要重启
  • Intel平台设置
Address:192.168.0.100
Netmask:255.255.255.0
Gateway:192.168.0.1
  • TX2平台设置
Address:192.168.0.101
Netmask:255.255.255.0
Gateway:192.168.0.1

2.2. 查看和设置主机名【hostname】

其实终端前方的文本为:usrname@hostname

# 查看hostname
$ hostname
# 修改hostname
$ sudo gedit /etc/hostname
# 修改完hostname需要重启才能生效

2.3. 修改/etc/hosts文件

sudo gedit /etc/hosts
# 修改完hosts文件后需要重启网络
sudo /etc/init.d/networking restart
  • Intel平台设置hostname:intel
127.0.0.1 localhost
127.0.1.1 intel
192.168.0.101 tegra
192.168.0.100 intel

# The following lines are desirable for IPv6 capable hosts
::1 ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
  • TX2平台设置hostname:tegra
127.0.0.1 localhost
127.0.1.1 tegra
192.168.0.101 tegra
192.168.0.100 intel

# The following lines are desirable for IPv6 capable hosts
::1 ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters

2.4. 修改.bashrc文件,设置ROS_MASTER_URI

sudo gedit .bashrc,在.bashrc文件末尾分别添加如下文本,同时需要重启终端才能生效

  • Intel平台设置hostname:intel
export ROS_MASTER_URI=http://192.168.0.100:11311
  • TX2平台设置hostname:tegra
export ROS_MASTER_URI=http://192.168.0.101:11311
# 有的项目提示,需要将其中一台电脑的端口修改为11312,没有测试过
export ROS_MASTER_URI=http://192.168.0.101:11312

2.5. 查看multicast是否开启和设置

# 多播组功能使用如下指令查看,如输出为0,则说明开启
# 一般是关闭的,输出为1
cat /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts
--------------------------------
# 暂时设置方法,重启电脑将失效
sudo sh -c "echo 0 >/proc/sys/net/ipv4/icmp_echo_ignore_broadcasts"
--------------------------------
# 永久设置方法
$ sudo gedit /etc/sysctl.conf
# 如果不存在,在文本末尾添加;如存在则将1更改为0
net.ipv4.icmp_echo_ignore_broadcasts=0
# 服务重启
$ sudo service procps restart

2.6. 网络配置是否成功

  • 测试多播组是否设置成功
# 说实话该指令没有理解,直接跳过
netstat -g
ping 224.0.0.1
  • 网络测试:互相ping和ssh连接测试
    测试SSH是由于该功能包是建立在SSH通信的基础上的
# Intel平台测试
# ping IP地址
ping 192.168.0.101
# ping hostname
ping tegra
# ssh username@IP_address,输入密码即可连接成功
ssh tegra@192.168.0.101
# TX2平台测试
# ping IP地址
ping 192.168.0.100
# ping hostname
ping intel
# ssh username@IP_address,输入密码即可连接成功
ssh intel@192.168.0.101

3. 实验指令

  • Intel平台: Ubuntu 16.04 64位版本 ROS-kinetic (先启动)
$ roscore
# 启动多播组发现节点,传递多播组参数【_mcast_group】
$ rosrun master_discovery_fkie master_discovery _mcast_group:=224.0.0.1
# 启动同步节点
$ rosrun master_sync_fkie master_sync
# 查看masters列表服务
$ rosservice call /master_discovery/list_masters
  • TX2平台: Ubuntu 16.04 arm版本 ROS-kinetic (后启动)
$ roscore
# 如果上面的IP地址更换,则这里可以设定端口
$ roscore -p 11312
# 启动多播组发现节点,传递多播组参数【_mcast_group】
$ rosrun master_discovery_fkie master_discovery _mcast_group:=224.0.0.1
# 启动同步节点
$ rosrun master_sync_fkie master_sync
# 查看masters列表服务
$ rosservice call /master_discovery/list_masters
  • 测试通信话题: Intel ==> TX2
# 在Intel上发布测试话题 /test1
$ rostopic pub -r 1 /test1 std_msgs/Int32 1
# 在TX2上输出话题信息 /test1
$ rostopic echo /test1
  • 测试通信话题: TX2 ==> Intel
# 在Intel上发布测试话题 /test2
$ rostopic pub -r 1 /test2 std_msgs/Int32 2
# 在TX2上输出话题信息 /test2
$ rostopic echo /test2

3.1. master_discovery_fkie节点的相关参数

# 输出更加详细的调试日志
rosrun master_discovery_fkie master_discovery _log_level:=DEBUG
# 设定多播组地址
rosrun master_discovery_fkie master_discovery _mcast_group:=224.0.0.1
# 设定多播组接收和发送端口
rosrun master_discovery_fkie master_discovery _mcast_port:=11512
# 设定RPC端口
rosrun master_discovery_fkie master_discovery _rpc_port:=11612
# 设定需要发现的机器人的IP地址
rosrun master_discovery_fkie master_discovery _robot_hosts:=[137.132.82.147]
rosrun master_discovery_fkie master_discovery _robot_hosts:=[hostname]
# 设定hostname检验无效
rosrun master_sync_fkie master_sync _check_host:=false
# 设定多播组发送无效
rosrun master_sync_fkie master_sync _send_mcast:=false
# 设定多播组接收无效
rosrun master_sync_fkie master_sync _listen_mcast:=false

# 根据netstat -g指令展示的多播组进行选择,也许是这个
rosrun master_discovery_fkie master_discovery _mcast_group:=224.0.0.251
# 在其中一台电脑设定节点名称,其中name前面有两单下划线【_ _】
rosrun master_discovery_fkie master_discovery __name:=master_discovery_ai

3.2. master_sync_fkie节点的相关参数

$ rosrun master_sync_fkie master_sync __name:=master_sync_ai
$ rosrun master_sync_fkie master_sync _check_host:=false

4. 注意事项

  • 多机通信之间的自定义消息一定要格式相同,不然无法实现有效通信
  • 借助roslaunch实现节点信息同步和参数文件配置设置
# 同步配置:sync_interface.sync
# For ignore/sync nodes, topics or services
# use follow declaration:
#{param name}:
#   - {ros name}
# or for selected hosts:
#   - {host name}:
#     - {ros name}
# you can use follow wildcard: '*'

# A filter list with patterns. If this pattern merges to a node, 
# topic or service it will not be synchronized.
do_not_sync: 

# The ignore_* lists will be processed first.
ignore_hosts:
sync_hosts:
ignore_nodes:
sync_nodes:
ignore_topics:
ignore_publishers:
ignore_subscribers:

# 同步话题
sync_topics: 
- /test

# 忽略服务
ignore_services:
  - /*get_loggers
  - /*set_logger_level
# 同步服务
sync_services:
# If sync_topics_on_demand is True the local subscribed and published topics
# are synchronized with remote even if they are not in the sync_* list.
sync_topics_on_demand: False
# The nodes which are running not at the same host as the ROS master are not
# synchronized by default. Use sync_remote_nodes to sync these nodes also.
sync_remote_nodes: False
# Performs resync after the host was offline: unregister and register again 
# to avoid connection losses to python topic. These does not suppot reconnection!
resync_on_reconnect: True
# A configurable period that controls how long the offline-online period [sec] 
# is before the resync kicks in.
resync_on_reconnect_timeout: 0
<!--multi_comm.launch-->
<?xml version="1.0"?>
<launch>
<node pkg="master_discovery_fkie" type="master_discovery" name="master_discovery">
    <param name="mcast" value="224.0.0.1"/>
  </node>

  <node pkg="master_sync_fkie" type="master_sync" name="master_sync" output="screen">
    <!-- 默认同步所有节点、话题、服务,添加文件路径参数可以制定同步 -->
    <!-- value必须以file:///开头,后面可以是单斜杠的 -->
    <param name="interface_url" value="file:///home/[usrname]/path_to_file/sync_interface.sync">
  </node>
</launch>
  • 重启电脑

说不上为啥,但是可能会有意想不到的结果

  • 重启网络服务
# 也许有好结果
sudo service network-manager restart
  • 重启SSH,出现Failed to start ssh.service: Unit ssh.service not found.
# node_manager提示:connect to host localhost port 22: Connection refused
# 重启SSH
$ sudo service ssh restart
>>> Failed to start ssh.service: Unit ssh.service not found.
# 安装SSH组件
$ sudo apt-get install ssh
# 卸载open-SSH组件
$ sudo apt-get remove openssh-client openssh-server
# 安装open-SSH组件
$ sudo apt-get install openssh-client openssh-server

# 查看相关组件
$ which ssh
$ which sshd
$ ssh localhost
# 远程连接:ssh username@IP_adrr
$ ssh nvidia@192.168.0.1
  • 注释.bashrc
要通过SSH使用ROS,在Ubuntu 16系统上,用户必须在其.bashrc文件中注释以下行
注释6-9行所在代码
  • 使用不同的节点名称启动对应节点
# 在其中一台电脑设定节点名称,其中name前面有两单下划线【_ _】
rosrun master_discovery_fkie master_discovery _mcast_group:=224.0.0.1 __name:=master_discovery_ai
rosrun master_sync_fkie master_sync __name:=master_sync_ai
  • node_manager是GUI调试界面

5. 错误备忘

  • 出现OSError:[Error 98] Address already in use
# 查找对应的进程的PID号
$ netstat -tunlp
# 结束当前进程,615为进程的PID号
$ kill -9 6135
  • 出现Master_discovery node appear not to running. Wait for topic with type 'MasterStateError while start RPC-XML server on port 11611: [Errno 98] Address already in use
sudo apt-get install ros-kinetic-multimaster-launch  
rosrun master_discovery_fkie master_discovery _send_mcast:=Ture  
  • 出现DeserializationError cannot deserialize: unknown error handler name ‘rosmsg‘
sudo apt-get install ros-kinetic-genpy
# 原因ros中的一些pkg的依赖pkg没有相对应的更新(虽然有但版本旧)
# 使用如下指令查看版本号
dpkg -l | grep genpy
  • rosdep update出现ERROR: unable to process source
reading in sources list data from /etc/ros/rosdep/sources.list.d
ERROR: unable to process source [https://raw.githubusercontent.com/ros/rosdistro/master/rosdep/osx-homebrew.yaml]:
    <urlopen error [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:590)> (https://raw.githubusercontent.com/ros/rosdistro/master/rosdep/osx-homebrew.yaml)
ERROR: unable to process source [https://raw.githubusercontent.com/ros/rosdistro/master/rosdep/base.yaml]:
    <urlopen error [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:590)> (https://raw.githubusercontent.com/ros/rosdistro/master/rosdep/base.yaml)
ERROR: unable to process source [https://raw.githubusercontent.com/ros/rosdistro/master/rosdep/python.yaml]:
    <urlopen error [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:590)> (https://raw.githubusercontent.com/ros/rosdistro/master/rosdep/python.yaml)
ERROR: unable to process source [https://raw.githubusercontent.com/ros/rosdistro/master/rosdep/ruby.yaml]:
    <urlopen error [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:590)> (https://raw.githubusercontent.com/ros/rosdistro/master/rosdep/ruby.yaml)
ERROR: unable to process source [https://raw.githubusercontent.com/ros/rosdistro/master/releases/fuerte.yaml]:
    Failed to download target platform data for gbpdistro:
    <urlopen error [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:590)>
Query rosdistro index https://raw.githubusercontent.com/ros/rosdistro/master/index-v4.yaml
ERROR: error loading sources list:
    <urlopen error <urlopen error [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:590)> (https://raw.githubusercontent.com/ros/rosdistro/master/index-v4.yaml)>
  • 系统设置没法点开
$ sudo apt-get install unity-control-center
# 需要重启,才能生效
  • 终端编辑框没有颜色提示
# 修改 ~/.bashrc,
# 将里面的force_color_prompt=yes前面的注释‘#’去掉
  • 防火墙阻挡
sudo apt-get install ufw
# 防火墙状态检查
sudo ufw status 
# 关闭防火墙
sudo ufw disable
# 激活防火墙
sudo ufw enable

参考链接

1. Yaoyu Hu博客:Multimaster ROS configuration and multimaster_fkie
2. Yaoyu Hu博客:使用测试程序
3. multimaster_fkie配置中文翻译
4. ROS官网教程
5. Gazebo官网教程
6. node_manager教程
7. multi-master ROS systems
8. 官方项目地址
9. 从源码安装ROS包
10. sudo rosdep init出错

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,793评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,567评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,342评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,825评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,814评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,680评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,033评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,687评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,175评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,668评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,775评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,419评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,020评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,978评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,206评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,092评论 2 351
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,510评论 2 343

推荐阅读更多精彩内容