两个或者多个ros之间的信息通信

两个或者多个ros之间的信息通信

  1. 【必做】

时间同步sudo apt-get install chrony

 

1、【问题:】

E: 无法获得锁 /var/lib/apt/lists/lock - open (11: 资源暂时不可用)

E: 无法对目录 /var/lib/apt/lists/ 加锁

解决:

sudo rm /var/lib/apt/lists/lock

2、【知识】

ROS分布式多机通信

ROS是一种分布式软件框架,节点之间通过松耦合的方式进行组合,在很多应用场景下,节点可以运行在不同的计算平台上,通过Topic、Service进行通信。但是“一山不容二虎”,ROS只允许存在一个Master,在多机系统中Master只能运行在一个机器上,其他机器需要通过 ssh 的方式和Master取得联系。所以在多级ROS系统中需要一些配置。

 

我们以两台虚拟计算机为例,介绍分布式多机通信的配置步骤,其中计算机wlzxzq作为主机运行Master,计算机bei作为从机运行节点。

 

  1. 通过ifconfig查看计算机ip

Master计算机wlzxzq:192.168.161.132

从机计算机bei:192.168.161.132

  1. 修改~/.bashrc文件

Master计算机wlzxzq:192.168.161.132

# Set ROS Kinetic【以下是3个工作空间】

source /opt/ros/kinetic/setup.bash

source ~/catkin_ws/devel/setup.bash

source ~/ros_tutorials/devel/setup.bash

 

# Set ROS alias command

alias cw='cd ~/catkin_ws'

alias cs='cd ~/catkin_ws/src'

alias cm='cd ~/catkin_ws && catkin_make'

 

# Set ROS Network

export ROS_HOSTNAME=192.168.161.132

#ros主机IP  如机器人

# export ROS_MASTER_URI=http://192.168.161.132:11311  可以放开注释

#PC IP

从机计算机bei:192.168.161.132

# Set ROS Network

export ROS_HOSTNAME=192.168.161.133

export ROS_MASTER_URI=http://192.168.161.132:11311

# Set ROS alias command

alias cw='cd ~/catkin_ws'

alias cs='cd ~/catkin_ws/src'

alias cm='cd ~/catkin_ws && catkin_make'

source /opt/ros/kinetic/setup.bash

source ~/catkin_ws/devel/setup.bash  

  1. 测试通信

A:Master计算机wlzxzq:192.168.161.132

B:从机计算机bei:192.168.161.132

重新打开terminor

A: ping 192.168.161.132

B: ping 192.168.161.133

正常通信。

在A中打开我们的roscore

在A中使用例程ros_tutorials下面的talk

rosrun roscpp_tutorial talk

在B中使用例程listen

rosrun roscpp_tutorial listen

  1. ssh通信

①Master: sudo apt-get install openssh-server

从机: sudo apt-get install openssh-client

开启服务: sudo service ssh start

修改配置:sudo gedit /etc/ssh/sshd_config

把配置文件中的"PermitRootLogin without-password"加一个"#"号注释掉,再增加一句"PermitRootLogin yes",保存文件,是为了允许root用户登录。 

 ssh bei@192.168.194.133

 sudo gedit /etc/hosts

 

  • 1
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ROS中,两个节点之间通信可以通过TCP连接来实现,可以通过ROS中的消息定义文件描述消息的结构,然后在节点代码中使用这些消息类型发送和接收消息。具体步骤如下: 1. 在ROS中创建消息定义文件,定义多种类型的消息,例如: ``` # Message definition for custom message type MyMsg1 int32 field1 string field2 # Message definition for custom message type MyMsg2 float64 field1 string field2 ``` 2. 在节点代码中引入这些消息类型,例如: ```python from my_package.msg import MyMsg1, MyMsg2 ``` 3. 在节点代码中创建TCP连接,指定要发送和接收的消息类型,例如: ```python import rospy import socket import struct rospy.init_node('tcp_node') # Set up TCP connection TCP_IP = 'localhost' TCP_PORT = 1234 BUFFER_SIZE = 1024 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.connect((TCP_IP, TCP_PORT)) # Send and receive messages msg1 = MyMsg1() msg1.field1 = 123 msg1.field2 = 'hello' msg2 = MyMsg2() msg2.field1 = 3.14 msg2.field2 = 'world' # Send message 1 data = struct.pack('<i', len(msg1.SerializeToString())) s.send(data) s.send(msg1.SerializeToString()) # Send message 2 data = struct.pack('<i', len(msg2.SerializeToString())) s.send(data) s.send(msg2.SerializeToString()) # Receive message data = s.recv(BUFFER_SIZE) msg = MyMsg1() msg.ParseFromString(data) print(msg.field1, msg.field2) # Close TCP connection s.close() ``` 在这个例子中,我们使用Python的socket库创建TCP连接,然后使用struct库将消息的序列化数据的长度附加到消息数据前面,以便接收方可以正确地解析消息。在发送消息时,我们使用msg.SerializeToString()将消息序列化为字符串,并使用socket.send()发送。在接收消息时,我们使用msg.ParseFromString()将消息字符串解析为消息对象。 这样就可以使用TCP连接在两个节点之间发送多种类型的消息了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值