🛠️ PND Adam U 部署 SDK
PND 半身机器人开发套件 支持从源码构建到仿真&真机控制的完整流程
🏗️ 从源代码构建
环境要求
- 操作系统:Ubuntu 22.04(暂不支持 Mac/Windows)
- 网络配置:真机运行时,需要 开发机 与 机器人 NUC 在同一局域网
🐢 Mujoco 部署流程
1. 环境准备
Mujoco 版本:3.2.0
2. 下载并启动 pnd_adam_u_mujoco
(仿真节点)
- 打开一个终端
git clone https://github.com/pndbotics/pnd_adam_u_mujoco.git && cd pnd_adam_u_mujoco
sudo ./run_pndrobotros2.sh mujoco
提示:终端打印
TRUE
表示节点就绪
针对手部操作的不同配置,请参考pnd_adam_u_mujoco中的README
3. 下载并运行 pnd_adam_u_deploy
(控制节点)
- 新打开一个终端
git clone https://github.com/pndbotics/pnd_adam_u_deploy && cd pnd_adam_u_deploy
colcon build && sudo ./run.sh
状态提示:显示
FSM start!
后进入控制就绪状态
4. 手柄控制
- 确保仿真和控制节点均已运行
- 手柄成功连接电脑
- 控制方法:进入仿真后,A → X → RB
🐢 真机部署流程
1. 启动机器人控制节点
打开一个终端
提示:终端打印
TRUE
表示节点就绪
2. 下载并运行 deploy
新打开一个终端
ssh pnd-humanoid@192.168.41.xx
git clone https://github.com/pndbotics/pnd_adam_u_deploy && cd pnd_adam_u_deploy
colcon build && sudo ./run.sh
状态提示:显示
FSM start!
后进入控制就绪状态
3. 手柄控制
- 确保控制节点运行
- 手柄成功连接机器人 NUC
- 控制方法:进入控制后,A → X → RB
📦 模块图
🔗 关节数据接口
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 | 基座数据 | 固定 |
6 | waistRoll |
躯干 |
7 | waistPitch |
躯干 |
8 | waistYaw |
躯干 |
9 | neckYaw |
颈部 |
10 | neckPitch |
颈部 |
11–17 | 左臂关节 | 左臂 |
18–24 | 右臂关节 | 右臂 |
手部数据(12 维)
索引范围 | 对应手 |
---|---|
0–5 | 左手 |
6–11 | 右手 |
单手关节映射
索引 | 部位 |
---|---|
1 | 小拇指 (Pinky) |
2 | 无名指 (Ring) |
3 | 中指 (Middle) |
4 | 食指 (Index) |
5 | 大拇指 (Thumb) |
6 | 大拇指侧向 (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_AXIS_LX 0x00
#define XBOX_AXIS_LY 0x01
#define XBOX_AXIS_RX 0x02
#define XBOX_AXIS_RY 0x03
#define XBOX_AXIS_LT 0x05
#define XBOX_AXIS_RT 0x04
#define XBOX_AXIS_XX 0x06
#define XBOX_AXIS_YY 0x07
// 值定义
#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 0x00
// 结构体
typedef struct xbox_map {
int time;
int a, b, x, y;
int lb, rb, start, back, home;
int lo, ro;
int lx, ly, rx, ry;
int lt, rt, xx, yy;
} xbox_map_t;
🔣 Kp / Kd 参数说明
在仿真 (Isaac Gym)
PD 控制器:
\(\tau = K_p e_p + K_d e_v\)
- $K_p$:刚度
- $K_d$:阻尼
- $e_p$:位置误差
- $e_v$:速度误差
在真实机器人执行器
PID 控制器:
\(I = P_p P_v e_p + P_v e_v\) \(\tau' = g I K_t = g(P_p P_v K_t e_p + P_v K_t e_v)\)
- $P_p$:位置环比例参数
- $P_v$:速度环比例参数
- $g$:齿轮比
- $K_t$:扭矩常数
Sim-to-Real 参数关系
满足 $ \tau = \tau' $ 时:
\(K_p = g P_p P_v K_t\) \(K_d = g P_v K_t\) \(P_v = \frac{K_d}{K_t g}\) \(P_p = \frac{K_p}{K_d}\)