看了这篇还不会 ROS1多机通信 你打我


有个群里的同学拿着古月的书,问我怎么设置多机通讯,下面写一篇简单的配置

1 什么是ros

ROS是机器人操作系统(Robot Operating System)的英文缩写。ROS是用于编写机器人软件程序的一种具有高度灵活性的软件架构。它包含了大量工具软件、库代码和约定协议,旨在简化跨机器人平台创建复杂、鲁棒的机器人行为这一过程的难度与复杂度。ROS的原型源自斯坦福大学的STanford
Artificial Intelligence Robot (STAIR) 和 Personal Robotics (PR)项目。

2 多机通讯的 需要具备的知识

多机通讯主要是通过网络实现的,这个就是ros的核心通讯组件就是xmlrpc:

xml rpc是使用http协议做为传输协议的rpc机制,使用xml文本的方式传输命令和数据。一个rpc系统,必然包括2个部分:

  • 1.rpc client,用来向rpc server调用方法,并接收方法的返回数据;
  • 2.rpc server,用于响应rpc client的请求,执行方法,并回送方法执行结果。
    RPC是Remote Procedure Call的缩写,翻译成中文就是远程过程调用,是一种在本地的机器上调用远端机器上的一个过程(方法)的技术,这个过程也被大家称为“分布式计算”,是为了提高各个分立机器的“互操作性”而发明出来的技术。

① 基本网络知识

首先你要保证两个设备在网络上是通的,常用的办法是通过ping,目前测试不能跨网段,如果有同学实现了,请告知
在这里插入图片描述

② ROS的通讯机制

具体的实现可以看这篇官方文档:http://wiki.ros.org/cn/ROS/Technical%20Overview
在这里插入图片描述

  1. 启动rosmaster 节点,这个时候会拉起一个xmlrpcsever uri=http://localhost:11311/ 参考的是ROS_MASTER_URI
    在这里插入图片描述
  2. 启动参数服务器 Parameter Server,其实是上面master的一部分
  3. 启动节点,节点主要负责与其他节点的协商
    在这里插入图片描述
  4. topic sub 和pub 其实是通过xml去协商的,topic 都算是xmlrpc 的 client,协商的时候会带上本机地址,这个地址是从ROS_IP或者hostname 去获取的
  5. 协商完成之后就可以点对点的传输数据了

③ 设置 ROS_MASTER_URI 和 HOST_IP

  • ROS_MASTER_URI 是指定master 的uri的环境变量,默认是本机
  • HOST_IP 是指定主机的地址,默认的主机名其实是个域名,不指定具体ip的话,协商之后的传输建立会因dns解析到不地址而失败

④ ROS 环境变量

ros的环境变量主要是几个带ROS的环境变量

  1. ROS_ROOT=/opt/ros/kinetic/share/ros ros根目录
  2. ROS_PACKAGE_PATH=/home/utry/catkin_ws/src:/opt/ros/kinetic/share ros的包路径,通过这个找到包
  3. ROS_MASTER_URI=http://localhost:11311 master xmlrpc的uri
  4. ROS_PYTHON_VERSION=2 python版本2
  5. ROS_VERSION=1 ros的版本
  6. ROSLISP_PACKAGE_DIRECTORIES=/home/utry/catkin_ws/devel/share/common-lisp lisp包路径
  7. ROS_DISTRO=kinetic 发行版本
  8. ROS_IP=192.168.0.114 本机ip,别人通过此ip与自己建立连接,不管是主机还是从机都要设置
  9. ROS_ETC_DIR=/opt/ros/kinetic/etc/ros 配置路径

⑤ .bashrc 的作用

.bashrc 文件会在你每次打开一个新终端的时候执行一次,我们会将一些环境变量的操作加在后面
在这里插入图片描述

3 实现方式

做到以下几点就可以:

  1. 多台装有ros的机器处于同一局域网,能相互ping同
  2. 在确认是主机的设备上启动roscore,设置主机HOST_IP,命令export ROS_IP=本机ip,这个是为了让别人能连上自己
  3. 从机设置 ROS_MASTER_URI=http://主机ip:11311,命令是export ROS_MASTER_URI=http://主机ip:11311,可以把这个加到.bashrc最后一行去,至此,可以通过命令查看到主机和连接到主机的机器的相关节点状态了
  4. 从机设置ROS_IP=本机IP,命令是 export ROS_IP=本机ip
  5. 至此结束了,下面测试

4 测试多机通讯

① 设置环境,按照 上面操作来

我2台虚拟机,一个做主机,主机状态是这样的:
在这里插入图片描述

从机状态:
在这里插入图片描述

启动roscore 和 listener,我改了源码,打印可能有点乱
在这里插入图片描述

② 查看topic

在这里插入图片描述

③ talker listener 测试

listen 已经打开了,我这边ssh 到从机上去执行,方便查看
在这里插入图片描述

④ 小乌龟 (turtlesim)键盘控制

  • 主机启动小乌龟,从机控制,
    在这里插入图片描述

  • 反向控制,主机控制从机
    在这里插入图片描述

5 总结

如果出这个错误
在这里插入图片描述
就是ROS_IP 没有设置
在这里插入图片描述
这个错误就是没有启动roscore 或者没有设置 ROS_MASTER_URI
正好看这个的时候把源码熟悉了一边,抽时间出一波,ros源码的专栏

发布了79 篇原创文章 · 获赞 455 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/weixin_36628778/article/details/105201788
今日推荐