ROS多机通信

本文介绍如何在多台计算机之间配置ROS以实现节点间的通信,并通过listener和talker节点进行测试验证。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 ROS 电脑通信准备

    
    参考链接:http://wiki.ros.org/cn/ROS/Tutorials/MultipleMachines 主要介绍ROS节点在多机器上运行的配置


一、由于ROS底层是基于TCP/IP的,所以如果希望节点运行在不同的机器上,就需要设置好机器之间的网络连接。    

    
    1、查看网络配置:查看电脑的ip和主机名hostname 命令:ifconfig ; hostname

    注:只要在同一个局域网下就能进行通信。可以是同一个无线路由器下的两台电脑,也可以有其中一台电脑通过有线连接无线路由器,另一台连接其无线。

    2、修改/etc/hosts文件

        目的是将ip与两台电脑的hostname绑定,两台电脑之间通过hostname就可以找到对方。修改之后,ping ip和ping hostname都可以找到对方的信息。

        将本机ip和本机hostname都添加进/etc/hosts  两个之间是tab键,不是空格
        如: 192.168.0.50    sl-desktop
            
        将另外的机器的ip和对应的hostname添加进/etc/hosts
        如: 192.168.0.85    sl-thinkpad-x201i
        
        修改完之后,重启网络: sudo /etc/init.d/networking restart

        注:该文件下还有127开头的回环测试ip不用修改

二、实现电脑之间的通信

    3、两台电脑上装上chrony包,实现时间同步
        
        sudo apt-get install chrony
        
    配置方法参见:http://www.cnblogs.com/wzy5223/p/5345378.html

    4、在两台电脑上安装ssh服务器
        
        sudo apt-get install openssh-server

        ps aux| grep ssh 查看sshd守护进程是否启动
        如果没有启动,调用sudo /etc/init.d/ssh start启动他

    5、检查网络连通
        
        ping -c4 hostname #发送4个封装包

            sl@sl-desktop:~$ ping -c4 localhost
            PING localhost (127.0.0.1) 56(84) bytes of data.
            64 bytes from localhost (127.0.0.1): icmp_seq=1 ttl=64 time=0.034 ms
            64 bytes from localhost (127.0.0.1): icmp_seq=2 ttl=64 time=0.028 ms
            64 bytes from localhost (127.0.0.1): icmp_seq=3 ttl=64 time=0.029 ms
            64 bytes from localhost (127.0.0.1): icmp_seq=4 ttl=64 time=0.033 ms

            --- localhost ping statistics ---
            4 packets transmitted, 4 received, 0% packet loss, time 2997ms
            rtt min/avg/max/mdev = 0.028/0.031/0.034/0.002 ms


三、多机测试实验,采用listener和talker节点


    6. 两台电脑的连网情况
        192.168.0.50    sl-desktop
        192.168.0.85    sl-thinkpad-x201i
    配置文件:sl-desktop中 /etc/hosts
            127.0.0.1    localhost
            127.0.1.1    sl-desktop
            192.168.0.50    sl-desktop        #台式机的ip\thosts
            192.168.0.85    sl-thinkpad-x201i    #笔记本的ip\thosts
            # 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
        sl-thinkpad-x201i中 /etc/hosts
            127.0.0.1    localhost
            127.0.1.1    sl-thinkpad-x201i
            192.168.0.50    sl-desktop
            192.168.0.85    sl-thinkpad-x201i
            # 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    
    7.台式机连接到笔记本
        $ ssh sl@sl-thinkpad-x201i #输入密码,登陆进笔记本的系统

    8.在台式机sl-desktop端
        开启一个终端,输入roscore 启动主节点
    9.在笔记本sl-thinkpad-x201i端
        $export ROS_MASTER_URI=http://sl-desktop:11311   #使笔记本识别ROS主节点运行的机器IP:port
        $rosrun rospy_tutorials listener  #启动rospy_tutorials程序包的listener节点
    10.在台式机端sl-desktop
        开启一个终端,输入
        $rosrun m_pkg listener #也可以是ros系统自带的/roscpp_tutorials/listener 或/rospy_tutorials/listener
        开启另一个终端,输入
        $rosrun m_pkg talker  #也可以是ros系统自带的/roscpp_tutorials/talker 或/rospy_tutorials/talker
    
    此时,在台式机端的talker节点不断地发送消息:
        sl@sl-desktop:~/m_ros_ws$ rosrun roscpp_tutorials talker
        [ INFO] [1468647284.621422803]: hello world 0
        [ INFO] [1468647284.721507150]: hello world 1
        [ INFO] [1468647284.821481159]: hello world 2
        [ INFO] [1468647284.921490613]: hello world 3
        [ INFO] [1468647285.021490583]: hello world 4
        [ INFO] [1468647285.121480628]: hello world 5
        [ INFO] [1468647285.221478280]: hello world 6
        [ INFO] [1468647285.321491770]: hello world 7
        [ INFO] [1468647285.421494102]: hello world 8
        [ INFO] [1468647285.521490956]: hello world 9

        [ INFO] [1468647285.621495987]: hello world 10

    在台式机另一终端的m_pkg/listener节点收到消息:

        sl@sl-desktop:~$ rosrun m_pkg listener
        [ INFO] [1468647141.267843843]: I heard: [hello world 3]
        [ INFO] [1468647141.367775039]: I heard: [hello world 4]
        [ INFO] [1468647141.467773422]: I heard: [hello world 5]
        [ INFO] [1468647141.567728851]: I heard: [hello world 6]
        [ INFO] [1468647141.667776271]: I heard: [hello world 7]
        [ INFO] [1468647141.767750576]: I heard: [hello world 8]
        [ INFO] [1468647141.867797181]: I heard: [hello world 9]
        [ INFO] [1468647141.967771322]: I heard: [hello world 10]
        [ INFO] [1468647142.067683258]: I heard: [hello world 11]
        [ INFO] [1468647142.167728250]: I heard: [hello world 12]

    在笔记本的rospy_tutorials/listener节点也收到消息:
        sl@sl-thinkpad-x201i:~$ rosrun rospy_tutorials listener
        [INFO] [WallTime: 1468647594.039604] /listener_4656_1468647584896I heard hello world 12
        [INFO] [WallTime: 1468647594.139758] /listener_4656_1468647584896I heard hello world 13
        [INFO] [WallTime: 1468647594.239264] /listener_4656_1468647584896I heard hello world 14
        [INFO] [WallTime: 1468647594.339432] /listener_4656_1468647584896I heard hello world 15
        [INFO] [WallTime: 1468647594.441040] /listener_4656_1468647584896I heard hello world 16
        [INFO] [WallTime: 1468647594.543232] /listener_4656_1468647584896I heard hello world 17
        [INFO] [WallTime: 1468647594.639349] /listener_4656_1468647584896I heard hello world 18


    注意:这里在笔记本上的节点接收到消息有延迟,从12个开始的.


### ROS 多机通信配置与实现方法 #### 主从机网络设置 为了确保多台计算机能够相互通信,必须确认所有设备处于同一网段内。通过 `ifconfig` 命令可以查询各节点的 IP 地址[^1]。 #### 配置环境变量 针对每一台参与通信的机器(无论是作为主机还是从机),都需要修改其 `.bashrc` 文件来指定主节点的位置以及本机在网络中的身份标识。具体操作如下: - 设置ROS Master URI指向运行roscore服务的那一方; - 设定ROS HOSTNAME为当前电脑的实际IP地址; 例如,在一台充当主机的角色中,可能有如下配置: ```bash export ROS_MASTER_URI=http://192.168.1.66:11311 export ROS_HOSTNAME=192.168.1.66 ``` 而在另一些扮演从属地位的工作站,则应相应调整上述参数以匹配实际情况[^5]。 #### 启动核心组件服务 在选定为主控端的一侧启动ROS的核心进程——`roscore`,这一步骤对于整个系统的正常运作至关重要。之后可以根据需求加载特定的应用程序或模拟器,比如`turtlesim_node`用于展示基本功能[^4]。 #### 测试连接状态 一旦完成了以上准备工作,便可以在任意客户端尝试执行`rostopic list`指令,以此验证是否成功接入到了由Master管理的消息总线体系之中[^3]。 #### 实现复杂交互逻辑 当基础架构搭建完毕后,可以通过编程方式进一步扩展应用范围。例如创建自定义类如`Robot``MultiRobot`来进行更高级别的抽象处理,其中涉及到了多个实体间的信息交换机制的设计与实施[^2]。 ```python class Robot: def __init__(self, name): self.name = name def publish_message(self, topic_name, message_content): pass # 发布消息到指定主题 class MultiRobot: robots = [] @staticmethod def initialize_robots(): robot_names = ['robot1', 'robot2', 'robot3'] for name in robot_names: new_robot = Robot(name) MultiRobot.robots.append(new_robot) # 初始化并控制三台机器人实例 MultiRobot.initialize_robots() for r in MultiRobot.robots: print(f'Starting {r.name}') ```
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值