跳转至

🛠️ PND Adam U 部署 SDK

PND 半身机器人开发套件 支持从源码构建到仿真&真机控制的完整流程


🏗️ 从源代码构建

环境要求

  • 操作系统:Ubuntu 22.04(暂不支持 Mac/Windows)
  • 网络配置:真机运行时,需要 开发机机器人 NUC 在同一局域网

🐢 Mujoco 部署流程

1. 环境准备

Mujoco 版本:3.2.0


2. 下载并启动 pnd_adam_u_mujoco(仿真节点)

  1. 打开一个终端
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(控制节点)

  1. 新打开一个终端
git clone https://github.com/pndbotics/pnd_adam_u_deploy && cd pnd_adam_u_deploy
colcon build && sudo ./run.sh

状态提示:显示 FSM start! 后进入控制就绪状态


4. 手柄控制

  1. 确保仿真和控制节点均已运行
  2. 手柄成功连接电脑
  3. 控制方法:进入仿真后,A → X → RB mujocoSim_adam_u

🐢 真机部署流程

1. 启动机器人控制节点

打开一个终端

ssh pnd-humanoid@192.168.41.xx
cd ~/Documents/adam_u_demo
sudo ./run_pndrobotros2.sh

节点启动成功

提示:终端打印 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. 手柄控制

  1. 确保控制节点运行
  2. 手柄成功连接机器人 NUC
  3. 控制方法:进入控制后,A → X → RB

📦 模块图

Adam_u_deploy


🔗 关节数据接口

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}\)