ROS2 使用 systemd 自启动时 Topic 接收异常?原因与解决方案
·
在将 ROS2 节点配置为系统开机自启动时,你是否遇到过这样的问题:
节点能正常启动,但无法接收到任何 Topic 数据,而手动运行
ros2 run ...却一切正常。
🔍 问题现象
- 使用
systemctl配置 ROS2 节点自启动 - 节点进程运行,但无法收到 Topic 数据
- 手动执行相同命令则通信正常
- 添加
sleep延迟后,通信恢复正常
🧩 根本原因
systemctl 服务在系统启动早期运行,而此时:
- 网络接口尚未完全就绪
- DDS 通信中间件(如 Fast-RTPS)未初始化完成
- 其他 ROS2 节点还未上线
ROS_DOMAIN_ID环境变量未正确加载
导致你的节点“过早启动”,无法发现其他节点或建立通信,从而 收不到 Topic。
✅ 解决方案
1. 延时启动
在你的启动脚本中添加延时, 比如在bash 脚本中添加
sleep 5
# 其他逻辑
xxx
2 通过network-online.target 让网络就绪后再启动
[Unit]
Description=My ROS2 Node
After=network-online.target
Wants=network-online.target
[Service]
User=ubuntu
Environment="ROS_DOMAIN_ID=0"
ExecStart=/usr/bin/ros2 run your_package your_node
[Install]
WantedBy=multi-user.target
更多推荐
所有评论(0)