服务管理层
lite3_sdk_service 是一个基于 UDP 的远程控制服务,负责管理 lite3_transfer 节点的启停和配置。
# ros2 node info /lite3_sdk_service/lite3_sdk_service Service Clients: /EMERGENCY_STOP: drdds/srv/StdSrvInt32 /SDK_MODE: drdds/srv/StdSrvInt32UDP 控制命令
Section titled “UDP 控制命令”服务监听 UDP 端口 12122,支持以下命令:
启动/停止 transfer 节点
Section titled “启动/停止 transfer 节点”on # 启动 lite3_transferoff # 停止 lite3_transfer响应:success 或 failure
设置发布频率
Section titled “设置发布频率”<number> # 如 50、100、200响应:success、failure 或 invalid
有效值:必须 > 0、<= 200,且为 200 的因数(如 1、2、4、5、8、10、20、25、40、50、100、125、200)
estop响应:success 或 failure
SdkService 是纯虚基类:
virtual void Initialize(rclcpp::Node::SharedPtr node) = 0;virtual bool StartNode() = 0;virtual bool StopNode() = 0;virtual bool SetPublishRate(int32_t rate) = 0;virtual std::string ProcessCommand(const std::string& cmd) = 0;virtual bool InitializeUdp(int port) = 0;virtual void RunUdpLoop() = 0;virtual void Cleanup() = 0;节点启动流程(StartNode)
Section titled “节点启动流程(StartNode)”lite3_pid_ = fork();if (lite3_pid_ == 0) { setpgid(0, 0); // 设置进程组 execlp("ros2", "ros2", "run", "lite3_transfer", "lite3_transfer", nullptr);}通过 fork() 创建子进程,子进程使用 execlp 执行 ros2 run lite3_transfer lite3_transfer。
节点停止流程(StopNode)
Section titled “节点停止流程(StopNode)”优雅停止分为三步:
- 调用
/SDK_MODE服务发送命令0,退出 SDK 模式(等待 2s 超时) - 向子进程组发送
SIGINT - 等待 2s,若未退出则发送
SIGKILL强制终止
| 命令 | 动作 |
|---|---|
on | 调用 StartNode() |
off | 调用 StopNode() |
estop | 调用 SendEmergencyStop() |
| 数字 | 调用 SetPublishRate(rate) |
| 其他 | 返回 invalid |
一键部署脚本
Section titled “一键部署脚本”cd ~/sdk_service/src/lite3_sdk_servicechmod +x setup_service.sh./setup_service.sh可选参数:
./setup_service.sh -r foxy -d 0-r <distro>:ROS2 发行版,默认foxy-d <domain>:ROS_DOMAIN_ID,默认0
脚本执行流程:
- 环境检查(ROS2、colcon、源包)
colcon build --packages-up-to lite3_sdk_service- 创建
/etc/systemd/system/lite3_sdk_service.service systemctl enable和systemctl restart
cd ~/sdk_servicesource /opt/ros/foxy/setup.bashcolcon build --packages-up-to lite3_sdk_service
# 测试运行source install/setup.bashros2 run lite3_sdk_service sdk_serviceSystemd 配置
Section titled “Systemd 配置”[Unit]Description=Lite3 SDK Control ServiceAfter=network.target
[Service]Type=simpleUser=yscEnvironment=ROS_DOMAIN_ID=0ExecStart=/bin/bash -lc 'source /opt/ros/foxy/setup.bash && \ source /home/ysc/sdk_service/install/setup.bash && \ exec ros2 run lite3_sdk_service sdk_service'Restart=on-failure
[Install]WantedBy=multi-user.targetsudo systemctl daemon-reloadsudo systemctl enable lite3_sdk_servicesudo systemctl start lite3_sdk_servicesudo systemctl status lite3_sdk_service节点生命周期管理
Section titled “节点生命周期管理”lite3_transfer 不是独立的 systemd 服务,而是由 lite3_sdk_service 按需启停:
lite3_sdk_service开机自启- 收到
on命令时 fork 启动lite3_transfer - 收到
off命令时先优雅退出 SDK 模式,再 SIGINT/SIGKILL
事件追踪(sdk_service_trace)
Section titled “事件追踪(sdk_service_trace)”通过 config/trace.yaml 配置文件控制开关:
enable: true # 总开关console: true # 控制台输出file: true # 文件输出sdk_service_trace: true # 服务层追踪开关log_dir: "" # 日志目录(默认 ~/ros2 debug log)日志文件按会话创建,路径格式为:
<log_dir>/<YYYYMMDD_HHMMSS>_<process_tag>_pid<PID>/SDK_SERVICE_EVENT_<stamp>.log