跳转到内容

服务管理层

lite3_sdk_service 是一个基于 UDP 的远程控制服务,负责管理 lite3_transfer 节点的启停和配置。

Terminal window
# ros2 node info /lite3_sdk_service
/lite3_sdk_service
Service Clients:
/EMERGENCY_STOP: drdds/srv/StdSrvInt32
/SDK_MODE: drdds/srv/StdSrvInt32

服务监听 UDP 端口 12122,支持以下命令:

on # 启动 lite3_transfer
off # 停止 lite3_transfer

响应:success 或 failure

<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;
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。

优雅停止分为三步:

  1. 调用 /SDK_MODE 服务发送命令 0,退出 SDK 模式(等待 2s 超时)
  2. 向子进程组发送 SIGINT
  3. 等待 2s,若未退出则发送 SIGKILL 强制终止
命令动作
on调用 StartNode()
off调用 StopNode()
estop调用 SendEmergencyStop()
数字调用 SetPublishRate(rate)
其他返回 invalid
Terminal window
cd ~/sdk_service/src/lite3_sdk_service
chmod +x setup_service.sh
./setup_service.sh

可选参数:

Terminal window
./setup_service.sh -r foxy -d 0
  • -r <distro>:ROS2 发行版,默认 foxy
  • -d <domain>:ROS_DOMAIN_ID,默认 0

脚本执行流程:

  1. 环境检查(ROS2、colcon、源包)
  2. colcon build --packages-up-to lite3_sdk_service
  3. 创建 /etc/systemd/system/lite3_sdk_service.service
  4. systemctl enable 和 systemctl restart
Terminal window
cd ~/sdk_service
source /opt/ros/foxy/setup.bash
colcon build --packages-up-to lite3_sdk_service
# 测试运行
source install/setup.bash
ros2 run lite3_sdk_service sdk_service
[Unit]
Description=Lite3 SDK Control Service
After=network.target
[Service]
Type=simple
User=ysc
Environment=ROS_DOMAIN_ID=0
ExecStart=/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.target
Terminal window
sudo systemctl daemon-reload
sudo systemctl enable lite3_sdk_service
sudo systemctl start lite3_sdk_service
sudo systemctl status lite3_sdk_service

lite3_transfer 不是独立的 systemd 服务,而是由 lite3_sdk_service 按需启停:

  • lite3_sdk_service 开机自启
  • 收到 on 命令时 fork 启动 lite3_transfer
  • 收到 off 命令时先优雅退出 SDK 模式,再 SIGINT/SIGKILL

通过 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