Skip to content

🛠️ 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. 启动机器人控制节点

cd ~/Documents/adam_u_demo
sudo ./run_pndrobotros2.sh  # 新终端执行

节点启动成功

:终端打印 TRUE 表示节点就绪

2. 运行主程序

sudo ./run.sh  # 原终端执行

程序就绪状态

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


Adam_u deploy sdk模块图

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 基座数据 (固定为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)