Open Duck Mini V2 文档

搭建问题记录

目录

资料导航

硬件组装

电机配置

电机驱动板供电,并且 Type-C 连接电脑或树莓派。Windows 电脑可以使用 FT 上位机修改 ID。电机设置参考:舵机配置

关节和ID对应关系

这里的脚本 scripts/configure_motor.py 会设置电机的 ID,PID,和位置,新电机默认检测 ID 1,然后修改至输入 ID,如果电机之前已经配置好 ID,则需要注释行 io.change_id({current_id: int(args.id)})

注意,校准后的位置为中位,在 FT 上查看是 2048
参考后续用串口设置 2048 更安全。
切勿直接使用 FT 设置为 0,有个问题是到达 4095 需要绕一整圈。装配好后,肯定是无法做到的,会发生堵转。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
# 运行
# python scripts/configure_motor.py --port <COM port> --id <id>

kp = io.get_P_coefficient([current_id])
ki = io.get_I_coefficient([current_id])
kd = io.get_D_coefficient([current_id])
max_acceleration = io.get_maximum_acceleration([current_id])
acceleration = io.get_acceleration([current_id])
mode = io.get_mode([current_id])

# print(f"PID : {kp}, {ki}, {kd}")
# print(f"max_acceleration: {max_acceleration}")
# print(f"acceleration: {acceleration}")
# print(f"mode: {mode}")

io.set_lock({current_id: 0})
io.set_mode({current_id: 0})
io.set_maximum_acceleration({current_id: 0})
io.set_acceleration({current_id: 0})
io.set_P_coefficient({current_id: 32})
io.set_I_coefficient({current_id: 0})
io.set_D_coefficient({current_id: 0})
io.change_id({current_id: int(args.id)}) # 如果电机 ID 已经配置,而查看其他信息,注释这行

current_id = int(args.id)

time.sleep(1)

io.set_goal_position({current_id: 0})

time.sleep(1)

在表格中,修改这里的 ID 号和自定义位置,这样电机就会设置当前位置,改为2048。

自定义指令生成

名称ID当前位置 0当前位置 2048
right_hip_yaw10FF FF 0A 04 0B 00 00 E6FF FF 0A 04 0B 00 08 DE
right_hip_roll11FF FF 0B 04 0B 00 00 E5FF FF 0B 04 0B 00 08 DD
right_hip_pitch12FF FF 0C 04 0B 00 00 E4FF FF 0C 04 0B 00 08 DC
right_knee13FF FF 0D 04 0B 00 00 E3FF FF 0D 04 0B 00 08 DB
right_ankle14FF FF 0E 04 0B 00 00 E2FF FF 0E 04 0B 00 08 DA
left_hip_yaw20FF FF 14 04 0B 00 00 DCFF FF 14 04 0B 00 08 D4
left_hip_roll21FF FF 15 04 0B 00 00 DBFF FF 15 04 0B 00 08 D3
left_hip_pitch22FF FF 16 04 0B 00 00 DAFF FF 16 04 0B 00 08 D2
left_knee23FF FF 17 04 0B 00 00 D9FF FF 17 04 0B 00 08 D1
left_ankle24FF FF 18 04 0B 00 00 D8FF FF 18 04 0B 00 08 D0
neck_pitch30FF FF 1E 04 0B 00 00 D2FF FF 1E 04 0B 00 08 CA
head_pitch31FF FF 1F 04 0B 00 00 D1FF FF 1F 04 0B 00 08 C9
head_yaw32FF FF 20 04 0B 00 00 D0FF FF 20 04 0B 00 08 C8
head_roll33FF FF 21 04 0B 00 00 CFFF FF 21 04 0B 00 08 C7
  • roll,x 轴,垂直纸面
  • pitch,y 轴,水平
  • yaw,z 轴,竖直

参考:欧拉角Pitch、Roll、Yaw介绍

欧拉角

电路连接

模块连接示意图

模块连接示意图

为了安全起见,请确保在将电池放入电池座之前,所有电池单元已充电至相同的电压。

电源连接示意图:

  • 注意充放电保护板 BMS 直接输出的 8.4V 给电机驱动板和稳压板 UBEC 供电
  • 稳压板的 EN 短接帽要拿掉。红灯亮时表示有输出
  • UBEC 输出 5V 给头部各模块供电

保护电路连接示意图:

充电电路示意图:

  • 充满时,红灯亮,绿灯也亮
  • 电池电量不足充电时,红灯亮,绿灯不亮

脚部接触开关连接

调试

Runtime 设置文档:

运行时

1
2
3
4
git clone https://github.com/apirrone/Open_Duck_Mini_Runtime
cd Open_Duck_Mini_Runtime
git checkout v2
pip install -e .
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
python scripts/calibrate_imu.py
Calibrated : False
Calibration status: (3, 0, 3, 3)
Calibrated : False
Calibration status: (3, 0, 3, 3)
Calibrated : False
Calibration status: (3, 0, 3, 3)
Calibrated : False
Calibration status: (3, 0, 3, 3)
Calibrated : False
Calibration status: (3, 3, 3, 3)
Calibrated : True
CALIBRATION DONE
offsets_accelerometer (-57, -23, -12)
offsets_gyroscope (3, -4, 1)
offsets_magnetometer (-1354, 274, 368)
Saved imu_calib_data.pkl

python3 mini_bdx_runtime/mini_bdx_runtime/raw_imu.py
分量含义范围说明
sys系统整体校准状态0–3依赖于 gyro/accel/mag 的状态
gyro陀螺仪校准状态0–3静止即可自动完成
accel加速度计校准状态0–3多方向移动以完成
mag磁力计校准状态0–3环境干净下旋转设备可完成

各模块校准条件说明

🌀 Gyro(陀螺仪):

  • 只需要 静止几秒 即可完成。
  • 如果你一直在晃动设备,它可能永远达不到 3。

🧭 Magnetometer(磁力计):

  • 需要在远离金属、磁场干扰的环境中,多角度旋转设备。
  • 室内环境常常干扰大,很难校准到 3。

📐 Accelerometer(加速度计):

  • 需要你在多个方向上轻轻移动或旋转设备。
  • 不用剧烈甩动,类似于「画圈、倾斜」。

🧠 System(系统):

  • 综合其他三个分量,取决于它们的校准状态。

仿真

1
2
3
4
5
6
7
8
9
10
11
12
13
14
pip install onshape-to-robot
export PATH=$PATH:/home/sjl/.local/bin

# .bashrc
# Obtained at https://dev-portal.onshape.com/keys
export ONSHAPE_API=https://cad.onshape.com
export ONSHAPE_ACCESS_KEY="ewGlcCa0TIIDRLd48DpxgwBA"
export ONSHAPE_SECRET_KEY="SneSiDla3DpJX0fjCf0VXPyVWWiEZmNW6n46In6FGxm2H9ID"

$env:ONSHAPE_API = "https://cad.onshape.com"
$env:ONSHAPE_ACCESS_KEY = "ewGlcCa0TIIDRLd48DpxgwBA"
$env:ONSHAPE_SECRET_KEY = "SneSiDla3DpJX0fjCf0VXPyVWWiEZmNW6n46In6FGxm2H9ID"

mkdir duck

duck/config.json:

1
2
3
4
5
6
{
// Onshape URL of the assembly
"url": "https://cad.onshape.com/documents/64074dfcfa379b37d8a47762/w/3650ab4221e215a4f65eb7fe/e/0505c262d882183a25049d05",
// Output format
"output_format": "urdf"
}
1
onshape-to-robot duck


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
wget https://github.com/google-deepmind/mujoco/releases/download/3.3.2/mujoco-3.3.2-linux-x86_64.tar.gz
tar xvf mujoco-3.3.2-linux-x86_64.tar.gz
export PATH=$PATH:/opt/mujoco-3.3.2/bin

cd duck
mv assets/* . && rm -rf assets
compile robot.urdf scene.xml
WARNING: Geom with duplicate name '' encountered in URDF, creating an unnamed geom.
WARNING: Geom with duplicate name '' encountered in URDF, creating an unnamed geom.
WARNING: Geom with duplicate name '' encountered in URDF, creating an unnamed geom.
WARNING: Geom with duplicate name '' encountered in URDF, creating an unnamed geom.
WARNING: Geom with duplicate name '' encountered in URDF, creating an unnamed geom.
WARNING: Geom with duplicate name '' encountered in URDF, creating an unnamed geom.
Done.
First compile: 0.7649s
Second compile: 0.18s
1
2
3
4
python3 -m mujoco.viewer --mjcf=duck/scene.xml

# 或者上一级目录
onshape-to-robot-mujoco duck

安装 uv

1
curl -LsSf https://astral.sh/uv/install.sh | sh

参考运动发生器:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 不然无法 clone 大文件
sudo apt install git-lfs
git clone https://github.com/apirrone/Open_Duck_reference_motion_generator.git
uv run scripts/auto_waddle.py -j8 --duck open_duck_mini_v2 --sweep

# 这将生成 polynomial_coefficients.pkl
uv run scripts/fit_poly.py --ref_motion recordings/

# 绘制
uv run scripts/plot_poly_fit.py --coefficients polynomial_coefficients.pkl

# 重放
uv run scripts/replay_motion.py -f recordings/<file>.json

# 打开网页版仿真环境
uv run open_duck_reference_motion_generator/gait_playground.py --duck open_duck_mini_v2

查看mujoco:

1
2
3
git clone git@github.com:apirrone/Open_Duck_Playground.git
cd Open_Duck_Playground/playground/open_duck_mini_v2/xmls
python3 -m mujoco.viewer --mjcf=open_duck_mini_v2.xml

训练:

1
2
cd Open_Duck_Playground
uv run playground/open_duck_mini_v2/runner.py