在将 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
Logo

聚焦RDK与具身智能,汇集机器人开发教程、开源案例和技术交流

更多推荐