树莓派4如何与运行Gazebo的PC通信并获取其中的传感器话题数据
前置准备
PC端运行环境为Ubuntu 18.04 + ROS Melodic,树莓派优先安装匹配的Ubuntu 18.04系统与ROS Melodic版本,同版本ROS通信不存在兼容性问题,配置成本最低。如果树莓派无法安装ROS Melodic,可在PC端额外部署ros1_bridge用ROS2跨版本通信,不在本方案讨论范围内。
第一步:配置局域网连通环境
- 将PC和树莓派接入同一个有线/无线局域网,临时关闭两边防火墙避免端口拦截:两端分别执行
sudo ufw disable - 分别查询两台设备的局域网IP:PC和树莓派都执行
ip a,记下PC的IP为PC_IP,树莓派的IP为PI_IP - 测试连通性:PC端执行
ping PI_IP,树莓派端执行ping PC_IP,确认双向都能ping通无丢包后再进行后续配置,建议给两台设备配置静态局域网IP,避免后续IP变动导致通信中断。
第二步:配置ROS多机通信环境变量
本方案中roscore运行在PC端,两台设备的ROS_MASTER_URI都需要指向PC,同时各自配置自身IP为ROS_HOSTNAME避免域名解析失败。
PC端配置
- 编辑用户目录下的
.bashrc文件,末尾添加两行内容:
export ROS_MASTER_URI=http://PC_IP:11311 export ROS_HOSTNAME=PC_IP
- 执行
source ~/.bashrc让配置生效
树莓派端配置
- 编辑树莓派用户目录下的
.bashrc文件,末尾添加两行内容:
export ROS_MASTER_URI=http://PC_IP:11311 export ROS_HOSTNAME=PI_IP
- 执行
source ~/.bashrc让配置生效
注意替换上述配置中的PC_IP、PI_IP为你实际查询到的两台设备的局域网IP
第三步:基础通信功能验证
- PC端打开终端执行
roscore启动ROS主节点 - 新开一个PC终端,执行
rostopic pub /test_topic std_msgs/String "data: 'test'" -r 1循环发布测试话题 - 树莓派端打开终端,执行
rostopic list,能看到/test_topic就说明话题列表同步正常,再执行rostopic echo /test_topic,能持续收到PC端发布的字符串消息即代表基础通信配置成功。
第四步:UUV模拟器传感器数据获取
低带宽传感器数据获取
PC端正常启动Gazebo 9与UUV模拟器后,树莓派端执行rostopic list即可看到模拟器发布的所有传感器话题,包括IMU、深度计、声呐等小数据量话题,直接在树莓派的ROS节点中订阅对应话题即可拿到数据,和本地PC订阅没有差异。
摄像头流高带宽数据优化
原始摄像头raw话题数据量很大,直接传输容易出现卡顿、延迟高的问题,按以下步骤优化:
- 先在UUV模拟器的摄像头传感器配置文件中,降低
update_rate(帧率)、width、height(分辨率)参数到你实际需要的数值,减少原始数据量 - 树莓派端不要订阅原始
/xxx/image_raw话题,订阅模拟器自动发布的/xxx/image_raw/compressed压缩图像话题即可,带宽占用仅为原始图像的1/10左右,需要提前在树莓派安装压缩图像依赖:执行sudo apt install ros-melodic-compressed-image-transport - 树莓派端拿到压缩图像数据后,用
cv_bridge即可转成OpenCV格式进行后续处理。
常见问题排查
- 能ping通但看不到话题:检查两边的
ROS_MASTER_URI和ROS_HOSTNAME配置是否正确,是否已经执行source ~/.bashrc生效,防火墙是否关闭 - 能看到话题但收不到数据:检查两边
ROS_HOSTNAME是否配成了自身的IP,是否存在IP变动的情况 - 摄像头流卡顿:优先用压缩图像话题,不要订阅原始raw话题,必要时继续降低图像分辨率和帧率。
内容的提问来源于stack exchange,提问作者Bob9710
相关产品推荐
相关产品推荐

