ROS Duckiebot与MATLAB Simulink通信异常:无法接收消息求助
解决Duckiebot(ROS)与MATLAB/Simulink收不到消息的问题
1. 修复/etc/hosts修改重启丢失的问题
Duckiebot默认采用只读根文件系统+overlay挂载,直接修改/etc/hosts会在重启后还原,正确操作:
- 临时挂载根文件系统为可写:
sudo mount -o remount,rw / - 编辑/etc/hosts,添加MATLAB主机的IP和主机名(示例:MATLAB主机IP为192.168.1.100,主机名matlab-pc):
192.168.1.100 matlab-pc - 保存后执行命令持久化修改:
sudo duckiebot-configure hostname persist sudo sync && sudo reboot - 重启后验证修改是否保留:
cat /etc/hosts
2. 确认ROS环境变量配置(两端都要检查)
机器人端(Duckiebot):
- 设置
ROS_IP指向机器人自身IP,ROS_MASTER_URI指向ROS Master(可选择机器人或MATLAB主机作为Master):# 临时生效 export ROS_IP=192.168.1.200 export ROS_MASTER_URI=http://192.168.1.200:11311 # 若MATLAB作为Master,改为: # export ROS_MASTER_URI=http://matlab-pc:11311 - 写入
~/.bashrc永久生效:echo "export ROS_IP=192.168.1.200" >> ~/.bashrc echo "export ROS_MASTER_URI=http://192.168.1.200:11311" >> ~/.bashrc source ~/.bashrc
MATLAB端:
- 在命令行设置与机器人端匹配的环境变量,初始化ROS节点:
setenv('ROS_IP','192.168.1.100'); setenv('ROS_MASTER_URI','http://192.168.1.200:11311'); rosinit; - 若MATLAB作为Master,需先执行
rosinit,再让机器人端指向MATLAB的ROS_MASTER_URI。
3. 验证基础ROS通信链路
- 机器人端发布测试话题:
rostopic pub /test_chatter std_msgs/String "data: 'hello from duckiebot'" -r 1 - MATLAB端测试订阅:
若能收到消息,说明基础通信正常,问题出在特定话题/消息类型;若收不到,继续排查。# 查看所有可访问话题 rostopic list # 订阅并打印消息 sub = rossubscriber('/test_chatter', @(msg)disp(msg.Data)); # 或直接echo话题 rostopic echo('/test_chatter')
4. 检查自定义消息兼容性
如果使用Duckiebot的自定义ROS消息,需在MATLAB中导入:
- 执行
rosgenmsg指向Duckiebot的消息包路径; - 按照提示将生成的路径添加到MATLAB路径并重启;
- 用
rosmsg list验证自定义消息是否已加载。
5. 防火墙与端口配置
- 关闭两端防火墙,或开放ROS相关端口:
- 开放ROS Master默认端口11311:
sudo ufw allow 11311/tcp - 固定ROS动态端口范围并开放(可选,避免端口随机问题):
机器人端添加到~/.bashrc:
MATLAB端设置环境变量:export ROS_PORT_SPACE=10000-10100
开放端口范围:setenv('ROS_PORT_SPACE','10000-10100');sudo ufw allow 10000:10100/tcp sudo ufw allow 10000:10100/udp
- 开放ROS Master默认端口11311:
6. Simulink特定配置检查
- 确保Simulink的ROS节点配置与MATLAB端一致:
ROS Master URI和Node Hostname/IP需匹配; - 检查Subscriber模块的话题名称、消息类型与机器人发布的完全一致;
- 使用
ROS Topic Selector确认能看到目标话题; - 确保模型中包含
ROS Init模块并正确初始化节点。
内容的提问来源于stack exchange,提问作者Marià
相关产品推荐
相关产品推荐

