TI5 SDK核心开发指南
1. 概述
本指南面向 TI5 机器人 SDK 开发者,整合以下两类能力:
关节与机器人本体控制(
robot_model_menu、motor_menu)外设控制(
PeripheralSDK,包含灵巧手、六维力、底盘等)
目标是提供一份统一入口文档,帮助你快速完成环境搭建、接口调用、示例运行与问题定位。
1.1 支持的平台
Linux x86(推荐 Ubuntu 22.04)
Linux ARM64(推荐 Ubuntu 22.04)
2. 快速开始
2.1 Ti5_SDK 安装与部署
硬件准备
CAN 设备(如 PEAK CAN、SocketCAN 适配器)
目标关节/电机模组
机器人本体(如 T140A / T170A / T170C / T170D,按测试需求)
外设(灵巧手、底盘、六维力传感器)
软件依赖
编译器:
gcc/g++(建议支持 C++17)构建工具:
cmake、makeCAN 相关:
libsocketcan-dev其他依赖:
libengin3-dev(按平台与工程要求安装)
一键安装示例(Debian/Ubuntu):
sudo apt update
sudo apt install -y build-essential cmake libsocketcan-dev libengin3-dev
CAN 驱动安装说明(Linux)
SocketCAN:确认内核已启用 CAN(或对应模块可加载);接口就绪后可用
ip link、candump等检查。PEAK:通常需安装厂商驱动包;就绪后结合板载指示灯、
lsmod、ip link综合判断。
下面以 PEAK Linux 驱动 为例(包名与版本以实际下载为准,如 peak-linux-driver-8.20.0)。部分平台(例如与 mttcan 等片上 CAN 控制器共存时)可能出现资源冲突,可按需先屏蔽冲突模块再安装 PEAK 驱动。
禁用与 PEAK 冲突的内核模块
若安装后模块无法加载,可尝试将 mttcan 加入黑名单(配置文件不存在时自行创建即可):
sudo vim /etc/modprobe.d/denylist-mttcan.conf
在文件末尾追加:
blacklist mttcan
更新 initramfs,重启后生效:
sudo update-initramfs -u
编译并安装 PEAK 驱动
tar -xvf peak-linux-driver-8.20.0.tar
cd peak-linux-driver-8.20.0
make netdev
sudo make install
sudo reboot
验证
完全重启后:红色常亮 多见于驱动已正确加载;快闪 多表示驱动未装好。可再执行:
lsmod | grep peak
若能看到 peak_* 等相关模块,通常表明驱动已加载。
故障排除与卸载
现象 |
建议 |
|---|---|
模块加载失败 |
确认已按需屏蔽冲突模块并重启;核对内核与驱动版本是否匹配 |
权限不足 |
安装与卸载步骤在需要处使用 |
编译报错 |
安装与当前内核一致的 |
在驱动源码目录卸载:
sudo make uninstall
2.2 编译与运行
交付物分两类,本节先说明如何区分与查阅:
本体控制标准 SDK:路径形如
Ti5SdkDemo/linux_x64、Ti5SdkDemo/linux_arm64.外设独立 SDK:路径为
Ti5SdkDemo/PeripheralSDK/,按设备拆分多个子工程(如hand_sdk、chassis_sdk、sri_can_sdk),各自独立CMakeLists.txt与示例.
项目结构
以下 本体控制标准包 以 Linux x64 预编译 SDK 为例,linux_arm64 等目录布局原则相同,差异主要在 runtime 内库文件后缀与 3rdparts 中部分平台二进制。
目录树概览
Ti5SdkDemo/linux_arm64/
├── CMakeLists.txt # 本包统一 CMake 入口:导入 Ti5RobotControl、编译示例/小工具
├── include/ # SDK 对外头文件(集成时主要依赖此目录)
│ ├── api/ # C API:关节/机器人等(如 MotorCtrlApi、RobotCtrlInstMng、灵巧手接口等)
│ └── basic/ # 错误码、连接参数、日志、JSON、定时器、平台类型等基础能力
├── runtime/ # 运行时二进制:Ti5RobotControl 动态库(.so)及辅助脚本
├── bin/ # 默认生成 motor_menu、robot_model_menu(构建后)
├── test/ # 随包示例与自测源码(非公开 API 的封装,仅演示用法)
│ ├── include/ # 示例内部头文件(cmd / comm / cpp)
│ ├── src/
│ │ ├── cpp/ # 交互菜单主程序及各机型 *\_Test 实现
│ │ └── comm/ # HumanoidBody、关节组、电机辅助、臂 IK 等封装
│ └── json/ # 示例 JSON(机型配置、轨迹等)及说明
├── 3rdparts/ # 示例链接的第三方依赖(头文件或源码)
│ ├── spdlog/ # 日志库
│ ├── json/ # nlohmann/json
│ └── tcan/ # CAN 接口头文件及各平台库路径(按目标平台选用)
└── build/ # 本地 CMake 构建目录(可选;通常不随发行包提交)
各目录说明
路径 |
作用 |
|---|---|
|
给集成方包含的头文件;业务代码通常只需 |
|
运行期动态库: |
|
当前默认编译产物: |
|
官方示例:演示如何调用 DLL 中 API. |
|
示例工程依赖,不替代 |
集成/SDK 分发时,除业务工程外,一般需要保留 include/ + runtime/;示例与构建缓存可按需裁剪。
构建方式
以下以 本体包 linux_arm64 为例。从包根目录(如 Ti5SdkDemo/linux_arm64)直接使用 CMakeLists.txt 进行构建,所有示例/工具目标一次生成:
cd Ti5SdkDemo/linux_arm64
cmake -B build -S .
cmake --build build -j "$(nproc)"
-j 为并行编译线程数;$(nproc) 自动取当前机器逻辑 CPU 数,也可改为固定值(如 -j 10)。
最终生成的可执行文件位于 bin/(motor_menu、robot_model_menu),runtime/ 存放运行所需依赖库。
运行方式
1. 环境初始化(首次部署或重新编译后必做)
运行前执行 scripts/init.sh:将 runtime/ 依赖库部署到系统库路径并执行 ldconfig,同时为 bin/ 下可执行文件授予 CAN 所需的 setcap 权限,便于普通用户运行(无需 root)。
cd <包根目录>/scripts
chmod +x init.sh
./init.sh
若目录布局与默认不一致,可传入包根路径:./init.sh /path/to/linux_arm64。
2. 运行示例程序
初始化完成后,在包根目录下进入 bin/ 启动交互菜单:
cd <包根目录>/bin
# 单电机联调(禁止用于整机)
./motor_menu
# 整机型号测试(T140A / T170A / T170C / T170D)
./robot_model_menu
若未执行 init.sh、或从本地 build/ 目录直接运行,需先指定动态库路径,例如:
export LD_LIBRARY_PATH=<包根目录>/runtime:${LD_LIBRARY_PATH}
cd <包根目录>/bin
./robot_model_menu
菜单项说明见下文 「可执行文件与脚本说明」。
1. 可执行文件与脚本说明
以下可执行文件由本包 CMakeLists.txt 构建,产物位于 bin/。
2. 环境初始化脚本
脚本名称: init.sh
备注
强烈提示: 每次重新编译都会在输出目录生成新的可执行文件(新 inode);对可执行文件设置的 setcap 等能力不会自动迁移到新文件上。若需在普通用户下访问 CAN 等能力,请在每次编译产物更新后重新执行 init.sh,以便为新二进制重新赋予权限。
推荐用法(理想情况):将 SDK 包按发布目录结构解压或放置到位后,通常只需赋予脚本可执行权限并无参运行
./init.sh即可完成库路径、权限等初始化;脚本会按规则自动查找bin/与runtime/(见下)。若目录布局特殊或需指定路径,再使用下文带参方式。作用概要:
检查本机是否具备 Eigen3、libsocketcan 等开发/运行前置(不满足时打印安装提示并退出)。
定位
bin/与runtime/:默认无参:优先使用
scripts/init.sh所在目录的bin/与runtime/(若缺则再尝试脚本上一级目录的bin/与runtime/)。也支持显式传参:传入包根目录(该目录下应有
bin/与runtime/),或传入显式bin_dir+runtime_dir。
使用
sudo将runtime/中列出的.so拷贝到系统库目录并执行ldconfig,保证动态链接器能找到Ti5RobotControl等依赖。使用
sudo setcap为motor_menu、robot_model_menu等可执行文件设置cap_net_admin,cap_net_raw,使普通用户态运行即可访问 CAN 相关能力(仍需已安装libcap2-bin等,脚本会检查setcap)。
用法示例:
chmod +x init.sh
# 1) 默认无参(最常用):理想情况下只需执行这一句;脚本会在 init.sh 所在目录的同级,
# 或再往上一级目录中查找 bin/ 与 runtime/
./init.sh
1. 底盘(chassis)安装与部署
内部目录:PeripheralSDK/chassis_sdk
1.1 依赖环境
建议系统:Ubuntu 22.04(ARM/x86 均可)
编译器:
gcc/g++(支持 C++17)构建工具:
cmake、make运行前置:准备好底盘接入端的
host与port,确保网络可达(示例运行时需要传入)。
1.2 通用编译步骤
以 chassis_sdk 为例:
cd <你的路径>/PeripheralSDK/chassis_sdk
mkdir -p build
cd build
cmake ..
make -j
1.3 运行方式
编译后可执行:
./build/chassis_sdk_demo <host> <port> <cmd> [value] [duration_ms]
cmd 含义:
forward:前进(value = vx)lateral:横移(value = vy)rotate:旋转(value = wz)stop:停车query:查询连接与最近一次速度指令
示例:
./build/chassis_sdk_demo 169.254.128.2 5480 forward 0.1 2000
./build/chassis_sdk_demo 169.254.128.2 5480 rotate 0.2 1500
./build/chassis_sdk_demo 169.254.128.2 5480 query
说明:更完整的控制封装与接口用法,请以 PeripheralSDK/外设控制开发指南.md 为准。
2. 灵巧手(hand)安装与部署
内部目录:PeripheralSDK/hand_sdk
2.1 串口与权限准备
准备串口设备路径(如
/dev/ttyACM0,以实际设备为准)确保当前用户具备串口访问权限(权限配置按你所用系统实际情况调整)
2.2 通用编译步骤
以 hand_sdk 为例:
cd <你的路径>/PeripheralSDK/hand_sdk
mkdir -p build
cd build
cmake ..
make -j
2.3 运行方式
编译后可执行:
./build/hand_sdk_demo <serial_port> [action_id]
action_id 含义:
0:STRAIGHT1:VICTORY2:OK3:HEART4:QUERY_POS(仅查询当前位置)
示例:
./build/hand_sdk_demo /dev/ttyACM0 1
./build/hand_sdk_demo /dev/ttyACM0 4
说明:更完整的控制封装与接口用法,请以 PeripheralSDK/外设控制开发指南.md 为准。
3. 六维力传感器(sri_can)安装与部署
内部目录:PeripheralSDK/sri_can_sdk
3.1 CAN 前置条件
建议系统:Ubuntu 22.04
sri_can_demo仅 Linux 构建目标:依赖 SocketCAN使用 CAN 接口时通常需要
root或具备cap_net_admin权限(与你系统的 CAN 权限策略一致即可)
3.2 通用编译步骤
以 sri_can_sdk 为例:
cd <你的路径>/PeripheralSDK/sri_can_sdk
mkdir -p build
cd build
cmake ..
make -j
说明:非 Linux 下该目录可能只生成头文件接口库,不会产出可执行 demo。
3.3 运行方式(示例)
编译后可执行(默认 CAN 名 vcan0,可用参数覆盖):
./build/sri_can_demo [can_interface]
示例:
./build/sri_can_demo can0
4. 关节控制 API
本章按能力域介绍核心接口,并补充 Ti5SdkDemo_linux_arm64/README-zh.md 中常用 CAN 指令映射,便于联调抓包时快速对照。详细参数与枚举以 MotorCtrlApi.h 为准。
4.1 日志初始化与输出开关(必填)
接口 |
功能 |
备注 |
|---|---|---|
|
初始化 SDK 日志系统 |
建议调用:日志输出依赖初始化。 |
|
设置 SDK 日志级别 |
用于运行期调整输出等级。 |
|
获取当前日志级别 |
返回当前 |
|
关闭 SDK 日志系统 |
建议调用且必须与 |
最小示例(对应 @include/api/MotorCtrlApi.h 中的日志接口):
Motor_LogInit(nullptr, /*async=*/1, MOTOR_LOG_INFO);
Motor_LogSetLevel(MOTOR_LOG_INFO);
// ... 调用 SDK 相关 API ...
Motor_LogShutdown();
如果没有启用日志,那么SDK将不会有任何的输出,建议启用日志,如果不需要输出使用OFF枚举关闭即可 补充说明:
logFile = nullptr表示仅控制台输出。async = 1为异步日志(更符合示例用法)。日志级别可用
MOTOR_LOG_INFO / MOTOR_LOG_DEBUG / ...。
4.2 关节控制 API
本节按调用阶段梳理 MotorCtrlApi.h 的关节控制接口,主要分为两类:
控制器生命周期与连接:创建控制实例、选择连接方式、必要时查询总线节点信息,最后断开并释放资源。
参数设置与常用码流:设置通信参数、设备阈值、运行模式与各环(电流/速度/位置)相关参数,配合你选择的 motion/运行计划生效。
建议的调用顺序是:Motor_CreateController -> 连接(Motor_ConnectCan 或 Motor_ConnectSocketCan)-> 参数设置 -> 运行/查询 -> Motor_RemoveController(结束时务必调用)。
控制器生命周期与连接
接口 |
功能 |
备注 |
|---|---|---|
|
创建电机控制实例 |
调用其他接口前必须先创建 |
|
通过 CAN 分析仪连接 |
适用于外置 CAN 设备 |
|
通过 SocketCAN 连接 |
适用于 Linux |
|
断开并释放实例 |
结束时务必调用 |
|
获取总线节点信息 |
排查总线设备是否在线 |
参数设置接口(含常用 CAN 码流)
接口 |
参数类型(示例) |
功能 |
CAN 码流示例 |
|---|---|---|---|
|
|
修改电机响应 CANID |
|
|
修改总线波特率 |
|
|
|
设置报文上传/掉线保护时间 |
|
|
|
|
设置线圈最大温度 |
|
|
设置驱动板最大温度 |
|
|
|
设置过压阈值(重启生效) |
|
|
|
设置低压阈值(重启生效) |
|
|
|
设置 NTC 类型 |
|
|
|
|
停止电机 |
|
|
电流模式 |
|
|
|
速度模式 |
|
|
|
位置模式 |
|
|
|
|
电流上下限 |
|
|
电流环 KP/KI |
|
|
|
|
加速度上下限 |
|
|
速度上下限 |
|
|
|
速度环 KP/KI |
|
|
|
|
位置软限位 |
|
|
位置环 KP/KD |
|
|
|
位置偏移 |
|
|
|
|
清错 |
|
|
恢复出厂 |
|
|
|
参数写入 Flash |
|
|
|
从 Flash 恢复 |
|
参数读取接口
接口 |
参数类型(示例) |
功能 |
CAN 码流示例 |
|---|---|---|---|
|
|
获取故障状态 |
|
|
获取母线电压 |
|
|
|
获取线圈温度 |
|
|
|
获取驱动板温度 |
|
|
|
获取软件版本 |
|
|
|
|
获取当前运行模式 |
|
|
|
获取当前电流 |
|
|
获取目标电流 |
|
|
|
获取电流/速度/位置 |
|
|
|
|
获取当前速度 |
|
|
获取目标速度 |
|
|
|
|
获取当前位置 |
|
|
获取目标位置 |
|
扩展控制与调试接口
接口 |
功能 |
使用场景 |
|---|---|---|
|
发送原始 CAN 数据 |
协议联调、透传验证 |
|
设置解码失败策略 |
丢弃/回调/裸上传 |
|
获取当前策略 |
排查异常帧处理逻辑 |
4.3 运动模式与运动控制 API
Motor_SetRunMode
参数 |
含义 |
|---|---|
|
控制实例 ID( |
|
运行模式,见下表 |
|
与 |
MotorRunModeEnum(节选,完整见头文件):
枚举值 |
说明 |
|---|---|
|
停止 |
|
电流模式 |
|
位置模式 |
|
周期同步位置/速度/转矩 |
Motor_GetRunMode
参数 |
含义 |
|---|---|
|
控制实例 ID |
发起查询;成功后通过 Motor_ReadRspMsg 读取 MotorGetParaRsp,其中 paraType = MOTOR_RUN_MODE_PARA。
Motor_SendCSP
参数 |
含义 |
|---|---|
|
控制实例 ID |
|
|
|
目标:位置(cnt)/ 电流(mA)/ 速度(0.01 Hz) |
周期性调用以设置目标并获取电流/速度/位置等反馈(与 CSP 运行方式一致)。
Motor_AngleToPositionCnt
参数 |
含义 |
|---|---|
|
|
|
减速比;双编时换算公式中不使用 |
|
|
|
外圈角度 |
|
输出:电机端位置计数( |
换算关系(与 MotorCtrlApi.h 注释一致):单编时 posCnt 与 angle * gearRatio * 65536 及 360° 或 2π 相关;双编时与 262144 及 360° 或 2π 相关。
Motor_PositionCntToAngle
参数 |
含义 |
|---|---|
|
单编 / 双编,同上 |
|
减速比;双编公式中不乘 |
|
电机端位置计数 |
|
输出角度单位:度或弧度 |
|
输出:外圈角度( |
Motor_MoveTargetAngle
参数 |
含义 |
|---|---|
|
控制实例 ID |
|
单编 / 双编 |
|
减速比 |
|
|
|
目标外圈角度 |
Motor_MoveDeltaAngle
参数 |
含义 |
|---|---|
|
控制实例 ID |
|
单编 / 双编 |
|
减速比 |
|
|
|
当前外圈角度 |
|
相对当前角度的增量 |
Motor_CntSpeedToOutputSpeed
参数 |
含义 |
|---|---|
|
电机端转速,单位 0.01 Hz(与 |
|
减速比 |
|
输出物理量单位: |
|
输出端转速( |
头文件给定换算:例如输出为 RPM 时 outputRpm = cntSpeed * 0.6 / gearRatio;度/s、弧度/s 见 MotorCtrlApi.h 注释。
Motor_OutputSpeedToCntSpeed
参数 |
含义 |
|---|---|
|
输出端转速(数值,单位由 |
|
减速比 |
|
与 |
|
输出:电机端转速(0.01 Hz, |
示例(目标角)
// 与 MotorCtrlApi.h 声明一致;ctrlId / gearRatio / encoderNum 按实机填写
int ctrlId = 0;
int gearRatio = 101;
int posCnt = 0;
Motor_AngleToPositionCnt(MOTOR_ENCODER_NUM_DUAL, gearRatio,
MOTOR_ANGLE_UNIT_DEG, 15.0, &posCnt);
Motor_MoveTargetAngle(ctrlId, MOTOR_ENCODER_NUM_DUAL, gearRatio,
MOTOR_ANGLE_UNIT_DEG, 15.0);
// 当前位置 cnt 需先 Motor_GetPositionLoopPara 发起查询,再通过 Motor_ReadRspMsg 取回后再调用 PositionCntToAngle
4.4 PT 模式控制
PT 实时控制使用 Motor_ConfigPTMode(初始化一次)+ Motor_SetPT(周期调用)。
Motor_ConfigPTMode
在运行前配置静态 PT 参数(通常初始化时调用一次);之后可用 Motor_SetPT 做周期控制。
参数 |
含义 |
|---|---|
|
控制实例 ID |
|
电流上下限(A) |
|
扭矩上下限(Nm) |
|
减速比 |
|
扭矩常数(Nm/A) |
|
KP/KD 最大值(量化用) |
Motor_SetPT
周期调用;必须先 Motor_ConfigPTMode。
参数 |
含义 |
|---|---|
|
控制实例 ID |
|
位置刚度系数 |
|
阻尼系数 |
|
目标位置(rad) |
|
目标速度(rad/s) |
|
前馈扭矩(Nm) |
Motor_GetForceKPDPara / Motor_SetForceKPDPara
接口 |
参数 |
含义 |
|---|---|---|
|
|
控制实例 ID |
|
|
|
|
|
控制实例 ID |
|
|
|
|
参数值 |
ForceKPDTypeEnum:
枚举 |
说明 |
|---|---|
|
KP |
|
KD |
|
KT |
|
KI |
|
KI 限幅 |
|
KP 最大值(设置接口常用) |
|
KD 最大值(设置接口常用) |
读取结果通过 Motor_ReadRspMsg 获取。
Motor_GetPTTIPara / Motor_SetPTTIPara
接口 |
参数 |
含义 |
|---|---|---|
|
|
控制实例 ID |
|
|
|
|
|
控制实例 ID |
|
|
|
|
参数值 |
PT_TITypeEnum:
枚举 |
说明 |
|---|---|
|
扭矩最大值 |
|
扭矩最小值 |
|
电流最大值 |
|
电流最小值 |
读取结果通过 Motor_ReadRspMsg 获取。
5. 外设控制 API
5.1 灵巧手
主要封装类:hand_sdk::HandController
接口说明
connectRs485(port, baud)setAllFingerAnglesDeg(angles, speed)start()stop()disconnect()getFingerAnglesDeg(out_angles_deg)
示例
编译:
cd PeripheralSDK/hand_sdk
mkdir -p build && cd build
cmake ..
make -j
运行动作示例(比耶):
cd PeripheralSDK/hand_sdk/build
./hand_sdk_demo /dev/ttyACM0 1
查询当前位置:
cd PeripheralSDK/hand_sdk/build
./hand_sdk_demo /dev/ttyACM0 4
action_id 建议说明:
0:STRAIGHT1:VICTORY2:OK3:HEART4:QUERY_POS(仅查询)
5.2 六维力
六维力建议直接基于 PeripheralSDK/sri_can_sdk 使用。该 SDK 为纯 C++(非 ROS2 依赖),基于 Linux SocketCAN。
接口说明
set_can(iface, bitrate):配置 CAN 接口与波特率(如can0,1000000)set_channel(cmd_id, data_ids):配置命令 ID 和 3 个数据帧 IDconnect()/disconnect():连接/断开 CANsend(cmd):发送命令(0x01单次、0x02连续、0x00停止)read(timeout):单次采样(内部发送0x01并接收解析 3 帧)recv(timeout):连续模式下接收并解析 3 帧connected():连接状态data():读取最新六维力数据
示例
sri_can_sdk::SriSensor s("id");
s.set_can("can0", 1000000);
s.set_channel(0x80, {0x291, 0x292, 0x293});
if (s.connect()) {
if (s.read(1.0)) {
auto& d = s.data();
printf("FX=%.2f FY=%.2f FZ=%.2f\n", d.fx, d.fy, d.fz);
}
s.send(sri_can_sdk::SriProtocol::CMD_START_CONTINUOUS);
while (s.recv(0.1)) {
auto& d = s.data();
// 使用 d.fx d.fy d.fz d.mx d.my d.mz
}
s.send(sri_can_sdk::SriProtocol::CMD_STOP_CONTINUOUS);
s.disconnect();
}
编译与可执行文件测试:
sri_can_demo 的参数是 CAN 接口名,例如 can4,不是 /sys/class/net/can4 这类路径。
CAN 接口配置(以 can4、1Mbps 为例):
sudo ip link set can4 down
sudo ip link set can4 type can bitrate 1000000
sudo ip link set can4 up
ip -details link show can4
运行示例:
cd PeripheralSDK/sri_can_sdk/build
./sri_can_demo can4
菜单测试顺序:
输入
1:连接输入
3:单次采样,检查FX/FY/FZ/MX/MY/MZ输入
4:流式采集,输入采集帧数(如200)输入
2:断开输入
0:退出
联调排查:
若提示“连接失败”,先检查
can4是否已up若提示“单次采样失败”,检查波特率、命令 ID、数据 ID 是否和设备一致
可使用
candump can4抓包确认是否有数据帧
5.3 底盘
主要封装类:ti5_chassis_sdk::ChassisController
接口说明
connect(host, port)sendVelocity(vx, vy, wz)sendVelocityFor(vx, vy, wz, duration_ms, period_ms)moveForward(vx)/moveLateral(vy)/rotate(wz)stop()isConnected()host()/port()getLastVelocity(vx, vy, wz)
示例
编译:
cd PeripheralSDK/chassis_sdk
mkdir -p build && cd build
cmake ..
make -j
前进 2 秒:
cd PeripheralSDK/chassis_sdk/build
./chassis_sdk_demo <host> <port> <cmd> [value] [duration_ms]
./chassis_sdk_demo 169.254.128.2 5480 forward 0.10 2000
原地旋转 1.5 秒:
cd PeripheralSDK/chassis_sdk/build
./chassis_sdk_demo 169.254.128.2 5480 rotate 0.20 1500
查询连接状态与最近一次速度命令:
cd PeripheralSDK/chassis_sdk/build
./chassis_sdk_demo 169.254.128.2 5480 query
6. 故障排除
6.1 编译失败
检查编译器版本与 C++ 标准是否满足要求
检查三方库是否安装(
libsocketcan-dev、libengin3-dev)清理后重编译:删除
build目录后执行cmake -B build -S . && cmake --build build -j "$(nproc)"
6.2 无法连接 CAN
检查 CAN 设备供电、线序与终端电阻
核对
deviceIndex、canIndex、baudRate是否与硬件一致检查驱动是否正确加载(PEAK/SocketCAN)
6.3 电机无响应或动作异常
先确认
appId与目标电机 ID 一致先执行清错与状态读取,确认无故障码再发控制指令
降低目标速度/电流/力矩,避免触发保护
6.4 整机运动异常
确认所选型号(T140A / T170A / T170C / T170D)与现场机器人一致
双臂末端解算失败时,检查
runtime/中运动学库是否与当前机型匹配双臂普通运动出现剧烈抖动时,勿使用
motor_menu;应通过robot_model_menu菜单 1 测试多关节/整机联调勿使用
motor_menu(无关节限位),应使用robot_model_menu
6.5 外设通信异常
灵巧手:确认串口路径、权限与波特率
底盘:确认 IP、端口与网络可达
六维力:确认协议帧格式、数据频率与坐标系定义
6.6 测试安全建议
程序选择:单轴/CAN 联调用
motor_menu;整机、双臂、头/腰/腿用robot_model_menu。切勿用motor_menu驱动多关节或整机。首次联调必须空载或低风险姿态
所有动作测试从低速低增益开始
出现异常立即执行
stop或断开使能,优先保证人机安全