🛠️ PND Adam U 部署 SDK
用于 PND 半身机器人的开发套件,支持从源码构建到真机控制的全流程操作。
🏗️ 从源代码构建
环境要求
- 操作系统:Ubuntu 22.04(暂不支持 Mac/Windows)
- 网络配置:开发机与机器人 NUC 需在同一局域网
构建流程
# 登录机器人 NUC
ssh pnd-humanoid@192.168.41.xx
# 克隆代码库
cd ~/Documents/
git clone https://github.com/pndbotics/pnd_adam_u_deploy
# 编译项目(生成 build/bin/log 目录)
cd pnd_adam_u_deploy
colcon build
🐢 真机部署流程
1. 启动机器人控制节点
注:终端打印
TRUE
表示节点就绪
2. 运行主程序
状态提示:显示
FSM start!
后进入控制就绪状态
Adam_u deploy sdk模块图
关节数据获取
1. 订阅 /joint_cmd
(下发指令)
消息字段说明
字段 | 维度 | 含义 |
---|---|---|
q_d |
25 | 关节期望位置 |
q_dot_d |
25 | 关节期望速度 |
tau_d |
25 | 关节期望力矩 |
hands_d |
12 | 手部期望位置 |
2. 订阅 /robot_state
(实际状态)
消息字段说明
字段 | 维度 | 含义 |
---|---|---|
q_a |
25 | 关节实际位置 |
q_dot_a |
25 | 关节实际速度 |
tau_a |
25 | 关节实际力矩 |
hands_a |
12 | 手部实际位置 |
维度映射说明
身体关节 (25维)
索引 | 关节名称 | 身体侧 |
---|---|---|
0-5 | 基座数据 (固定为0) | - |
6 | waistRoll |
躯干 |
7 | waistPitch |
躯干 |
8 | waistYaw |
躯干 |
9 | neckYaw |
颈部 |
10 | neckPitch |
颈部 |
11 | shoulderPitch |
左臂 |
12 | shoulderRoll |
左臂 |
13 | shoulderYaw |
左臂 |
14 | elbow_Left |
左臂 |
15 | wristYaw |
左臂 |
16 | wristPitch |
左臂 |
17 | wristRoll |
左臂 |
18 | shoulderPitch |
右臂 |
19 | shoulderRoll |
右臂 |
20 | shoulderYaw |
右臂 |
21 | elbow_Right |
右臂 |
22 | wristYaw |
右臂 |
23 | wristPitch |
右臂 |
24 | wristRoll |
右臂 |
手部数据 (12维)
索引范围 | 对应手部 |
---|---|
0-5 | 左手 |
6-11 | 右手 |
单手指关节映射
索引 | 手指部位 |
---|---|
1 | 小拇指 (Pinky) |
2 | 无名指 (Ring) |
3 | 中指 (Middle) |
4 | 食指 (Index) |
5 | 大拇指 (Thumb) |
6 | 大拇指侧向 (Thumb Lateral) |
🎮 手柄控制协议
按键功能映射
按键组合 | 功能说明 |
---|---|
按钮 A | 所有关节回零位 |
按钮 X | 切换 Ready 状态 |
按钮 B | 阻尼模式锁定当前位置 |
LB + RB 同时按 | 开关关节电源(程序启动中禁用) |
数据结构定义
#define XBOX_TYPE_BUTTON 0x01
#define XBOX_TYPE_AXIS 0x02
// 蓝牙映射
#define XBOX_BUTTON_A 0x00
#define XBOX_BUTTON_B 0x01
#define XBOX_BUTTON_X 0x03
#define XBOX_BUTTON_Y 0x04
#define XBOX_BUTTON_LB 0x06
#define XBOX_BUTTON_RB 0x07
#define XBOX_BUTTON_START 0x02
#define XBOX_BUTTON_BACK 0x05
#define XBOX_BUTTON_HOME 0x08
#define XBOX_BUTTON_LO 0x09 /* 左摇杆按钮 */
#define XBOX_BUTTON_RO 0x0a /* 右摇杆按钮 */
#define XBOX_BUTTON_ON 0x01
#define XBOX_BUTTON_OFF 0x00
#define XBOX_AXIS_LX 0x00 /* 左摇杆 X 轴 */
#define XBOX_AXIS_LY 0x01 /* 左摇杆 Y 轴 */
#define XBOX_AXIS_RX 0x02 /* 右摇杆 X 轴 */
#define XBOX_AXIS_RY 0x03 /* 右摇杆 Y 轴 */
#define XBOX_AXIS_LT 0x05
#define XBOX_AXIS_RT 0x04
#define XBOX_AXIS_XX 0x06 /* 方向键 X 轴 */
#define XBOX_AXIS_YY 0x07 /* 方向键 Y 轴 */
#define XBOX_AXIS_VAL_UP -32767
#define XBOX_AXIS_VAL_DOWN 32767
#define XBOX_AXIS_VAL_LEFT -32767
#define XBOX_AXIS_VAL_RIGHT 32767
#define XBOX_AXIS_VAL_MIN -32767
#define XBOX_AXIS_VAL_MAX 32767
#define XBOX_AXIS_VAL_MID 0x00https://gitlab.pndbotics.com/jacke.he/pndwiki/-/merge_requests/35
typedef struct xbox_map {
int time;
int a;
int b;
int x;
int y;
int lb;
int rb;
int start;
int back;
int home;
int lo;
int ro;
int lx;
int ly;
int rx;
int ry;
int lt;
int rt;
int xx;
int yy;
} xbox_map_t;
🔣Kp、Kd 参数说明
在 Isaac Gym 中
PD 控制器:
\(\tau=K_p*e_p+K_d*e_v\) (1)
- \(K_p\):PD 控制器刚度
- \(K_d\):PD 控制器阻尼
- \(e_p\):位置误差
- \(e_v\):速度误差
- \(\tau\):作用于末端的扭矩
在真实机器人执行器中
PID 控制器:
\(I=P_p*P_v*e_p+P_v*e_v\) (2)
\(\tau'=g*I*K_t=g*(P_p*P_v*K_t*e_p+P_v*K_t*e_v)\) (3)
- \(P_p\):位置控制环 PID 控制器比例参数
- \(P_v\):速度控制环 PID 控制器比例参数
- \(e_p\):位置误差
- \(e_v\):速度误差
- \(g\):末端与电机之间的齿轮比
- \(K_t\):扭矩常数,可通过实验获取
- \(I\):位置和速度控制环 PID 控制器输出的电流
- \(\tau'\):作用于末端的扭矩
为实现仿真到真实(sim to real),需满足
\[ \tau=\tau' \]
由此可得:
\(K_p=g*P_p*P_v*K_t\) (4)
\(K_d=g*P_v*K_t\) (5)
\(P_v=K_d/(K_t*g)\) (6)
\(P_p=K_p/K_d\) (7)