跳转到内容

FAQ

为什么原始代码中发送指令被注释掉了?

Section titled “为什么原始代码中发送指令被注释掉了?”

为确保安全。开发者必须先确认 SDK 与机器人通讯正常、控制指令正确后,才能取消注释 send_cmd->SendCmd(robot_joint_cmd)。

如何判断 SDK 是否收到了机器人数据?

Section titled “如何判断 SDK 是否收到了机器人数据?”
  • 观察终端是否打印 No data from the robot was received!!!!!!
  • 取消注释 cout << robot_data->imu.acc_x << endl;,查看是否有 IMU 数据输出
  • 注册回调函数,检查 is_message_updated_ 是否被置为 true

超过 50ms 未发送有效指令,底层控制器将拿回控制权。需重新调用 send_cmd->ControlGet(SDK) 获取控制权,并调用 send_cmd->RobotStateInit() 重新初始化。

使用 ARM 编译:

Terminal window
cmake .. -DBUILD_PLATFORM=arm
make -j

将生成的 Lite_motion 可执行文件和 libdeeprobotics_legged_sdk_aarch64.so 一起拷贝到运动主机上运行。

如何切换位置控制和力矩控制?

Section titled “如何切换位置控制和力矩控制?”

在 motionexample.cpp 的 SwingToAngle 函数中,修改 if(true) 为 if(false) 即可切换到力矩控制模式。

因为 main.cpp 当前默认选择的是:

RemoteCommandType::kRetroidGamepad

把 main.cpp 中的 RemoteCommandType::kRetroidGamepad 改为 RemoteCommandType::kKeyBoard。

手柄数据由 lite3_transfer 中的 RetroidGamepadPublisher 通过 UDP 端口 12121 接收并发布到 /GAMEPAD_DATA。确保 lite3_transfer 已启动且手柄已连接。

因为 CMakeLists.txt 里 BUILD_PLATFORM 会决定 onnxruntime 目录和工具链:

set(BUILD_PLATFORM "x86" CACHE STRING "Target platform (x86 or arm)")

为什么要区分 /JOINTS_CMD 和 /JOINTS_DATA?

Section titled “为什么要区分 /JOINTS_CMD 和 /JOINTS_DATA?”

/JOINTS_CMD 是控制输出,/JOINTS_DATA 是机器人反馈。仿真节点和控制节点用这两个话题做闭环。

lite3_transfer 和 lite3_sdk_service 是什么关系?

Section titled “lite3_transfer 和 lite3_sdk_service 是什么关系?”

lite3_sdk_service 是管理层,通过 UDP 远程控制 lite3_transfer(硬件层)的启停和频率。lite3_transfer 不单独注册为 systemd 服务,由 lite3_sdk_service 按需启停。

  • 确保 lite3_transfer 已在运行
  • 检查 /EMERGENCY_STOP 服务是否存在:ros2 service list | grep EMERGENCY_STOP
  • 确认 /EMERGENCY_STOP_SIGNAL 有活跃订阅者(即 Lite3_sdk_deploy 已调用 InitEmergencyStopListener())
  • 通过 Retroid 手柄 App 界面调节
  • 或通过 UDP 命令:echo "50" | nc -u 127.0.0.1 12122
Terminal window
sudo lsof -i:12122
sudo kill <pid>

检查 minSdkVersion 是否满足要求(最低 24)。

确认手柄已配对,且支持 HID 协议。