跳转到内容

通信检查与问题排查

Motion SDK 采用 UDP 与机器狗进行通讯。

数据上报检查: 在 SDK 中打印 IMU 数据或关节数据,判断是否收到机器狗上报的数据。可取消 main.cpp 中的注释:

// cout << robot_data->imu.acc_x << endl;

指令下发检查: 运行 demo 后观察机器狗是否执行回零动作,若能回零则证明 SDK 可成功下发指令。

如果 SDK 未接收到机器狗上报的数据,可按以下步骤排查:

  1. 检查网段:确认开发主机与机器狗主机处于同一网段(在运动主机上运行 SDK 可跳过此步)

  2. 检查虚拟机网络:如使用虚拟机,建议改为桥接模式并手动设置 IP

  3. 抓包排查:在运动主机上执行抓包命令:

    • SDK 在运动主机内运行:sudo tcpdump -x port 43897 -i lo
    • 用户名 user,SDK 在开发主机,WiFi 连接:sudo tcpdump -x port 43897 -i p2p0
    • 用户名 user,SDK 在开发主机,网口连接:sudo tcpdump -x port 43897 -i eth1
    • 用户名 firefly:sudo tcpdump -x port 43897 -i eth0

抓包后等待 2 分钟,观察是否有数据上报。若无数据,用 top 命令检查 jy_exe 进程是否正常运行,必要时重启运动程序:

Terminal window
cd ~/jy_exe
sudo ./stop.sh
sudo ./restart.sh

SDK 底层通信基于自封装的 UDP Socket 层:

graph TB
A["Sender / Receiver"] --> B["UDPSocket"]
B --> C["BaseSocket"]
C --> D["Linux Socket API"]
E["UDPServer"] --> B
  • BaseSocket:Socket 基类,封装创建、关闭等基础操作
  • UDPSocket:实现 SendTo(无连接发送)、Send(连接后发送)、Receive/ReceiveFrom(接收)
  • UDPServer:继承 UDPSocket,增加 Bind 端口绑定和广播支持

command.h 定义了通信命令格式:

struct EthCommand {
uint32_t code; ///< 命令码
union {
uint32_t value; ///< 命令值
uint32_t paramters_size;///< 参数长度
};
struct {
uint32_t type : 8; ///< 消息类型(0=单值,1=多值)
uint32_t count : 24; ///< 消息序列号
};
};

lib/ 目录下提供两个平台的预编译动态库:

  • libdeeprobotics_legged_sdk_x86_64.so — x86 架构(开发上位机)
  • libdeeprobotics_legged_sdk_aarch64.so — ARM 架构(Lite3 机载主机)

编译时通过 -DBUILD_PLATFORM=x86 或 -DBUILD_PLATFORM=arm 选择对应平台库。

  1. 取消注释前务必确认通讯正常:在 main.cpp 中 send_cmd->SendCmd(robot_joint_cmd) 默认被注释,取消前需确认 SDK 能正常收发数据。

  2. 实验安全距离:使用 Lite3 执行算法和实验时,所有人员应与机器人保持至少 5 米距离。

  3. 悬挂调试:机器人应悬挂在调试架上,避免意外造成人员和设备损伤。

  4. 急停操作:需要靠近机器人时,必须使机器人处于急停状态或使用 sudo ./stop.sh 关闭运动程序。

  5. 运行前准备:运行程序前请将机器狗调整到准备姿势,以确保顺利回零。

  6. WiFi 延迟:WiFi 通讯受网络环境干扰产生的延迟波动,可能对 500Hz 以上控制频率的控制器产生影响。

  7. ARM 架构注意:Lite3 运动主机为 ARM 架构,若需在运动主机上运行自定义程序需注意交叉编译。