# daddyduck **Repository Path**: huahuaze/daddyduck ## Basic Information - **Project Name**: daddyduck - **Description**: 开源daddyduck复刻 - **Primary Language**: Python - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-10-27 - **Last Updated**: 2026-10-27 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 鸭子机器人 HD1910 可用基线 | 项目 | 内容 | | ------ | ---------------------------------------- | | 用户名 | kickpi | | 系统 | Linux aarch64,已验证 Ubuntu 24.04 / Armbian | | Python | 3.12.3 | | 安装路径 | `/home/kickpi/daddyduck_hd1910`(固定) | > --- ## 目录 1. [一、包内内容与适用范围](#一包内内容与适用范围) 2. [二、硬件与系统前提](#二硬件与系统前提) 3. [三、复制安装包](#三复制安装包) 4. [四、安装(两种方式选一种)](#四安装两种方式选一种) 5. [五、不上力验收](#五不上力验收) 6. [六、正式遥控启动](#六正式遥控启动) 7. [七、模型、IMU 和保护的确切版本](#七模型imu和保护的确切版本) 8. [八、常见问题](#八常见问题) --- ## 一、包内内容与适用范围 | 文件 / 目录 | 说明 | | ------------------------------- | ------------------------------------- | | `daddyduck_hd1910/` | 代码、ONNX、标定和配置,可阅读及在线重建环境 | | `board_runtime_snapshot.tar.gz` | 同一代码及完整 Linux ARM64 Python 虚拟环境,可离线恢复 | | `requirements-board.txt` | 实际依赖固定版本 | | `BOARD_ENVIRONMENT.txt` | 原系统信息 | - 完整归档保留 venv 链接与权限。 - Windows 解压出的 `.sh` 若没有执行权限,使用 `bash` 启动即可。 --- ## 二、硬件与系统前提 - Linux aarch64,已验证 Ubuntu 24.04 / Armbian,Python 3.12.3。 - 用户名 kickpi;安装路径固定 `/home/kickpi/daddyduck_hd1910`。 - **串口、I2C 驱动与设备树必须先在系统中启用。** 脚本不会刷系统、修改设备树或配置 Wi-Fi。 - 板卡网络 IP 变化不影响板端控制;电脑 SSH / 可视化需改成目标实际 IP。 - HD1910,串口 1 Mbps;内部零位标定必须已经完成。 ### 设备映射 | 部位 | 设备 | ID 与含义 | | --- | ---------------- | ------------------------------ | | 右腿 | `/dev/ttyACM1` | 20 髋偏航、21 髋侧摆、22 髋俯仰、23 膝、24 踝 | | 左腿 | `/dev/ttyACM2` | 10、11、12、13、14,顺序同右腿 | | 头颈 | `/dev/ttyACM0` | 30 颈俯仰、31 头俯仰、32 头偏航、33 头侧摆 | | 嘴巴 | `/dev/ttyACM0` | 34,**不受策略控制** | | IMU | `/dev/i2c-3` | BNO055,地址 0x28 | | 手柄 | `/dev/input/js0` | Xbox 360 兼容手柄 | - 关节映射:`q = -(ticks - 2048) * 2 * pi / 4096`,来自 `hardware_mapping.json`。 - **新机器人安装方向、关节零位和 IMU 安装若不同,必须重新核对,不能盲目复制装配标定。** --- ## 三、复制安装包 在电脑上解压 ZIP,将整个交付目录复制到板卡 `/home/kickpi/` 下。 Windows PowerShell(把目录名和时间戳替换为实际值,IP 替换为新板 IP): ```powershell scp -r "board_runtime_snapshot.tar.gz" kickpi@10.45.119.208:/home/kickpi/ ``` ```bash ssh kickpi@10.45.119.208 解压tar.gz文件 ``` > sudo 需要目标板实际密码。 --- ## 四、安装 > **安装脚本不启动电机。** 如已有 `/home/kickpi/daddyduck_hd1910`,会拒绝覆盖。先在原程序终端按 B 或 Ctrl+C 退出并确认卸力,再将已有目录改名保存后安装。 ### 安装依赖 - 将已验证的 ARM64 环境恢复到原绝对路径。 - **不依赖板端下载 ONNX Runtime。** - 要求兼容的系统 C 库、Python 3.12 及驱动; ## 五、不上力验收(建议操作,可省略) 1. 关闭其他串口控制器与电脑遥测窗口,确认没有程序占用 ACM0/1/2: ```bash ls -l /dev/ttyACM* /dev/i2c-3 /dev/input/js0 ``` 2. 运行探测: ```bash cd /home/kickpi/daddyduck_hd1910 sudo .venv/bin/python probe.py ``` - **15 个 ID 应正确应答**,不能出现串包、缺失或故障。 - 未运行控制器时应确认扭矩为 0。 - 若尚处于上力状态,先扶稳并在原程序中正常结束,**不要无支撑强制卸力**。 3. 影子推理(真实传感器数据,**不发送电机目标**): ```bash sudo .venv/bin/python run.py --gamepad --seconds 5 ``` | 检查项 | 预期 | | --------------------- | ------------------------------------------------ | | `completed` | `true` | | `motor_commands_sent` | `false` | | 周期 | 接近 50 Hz,无频繁超时 | | 启动打印 | `imu_config_file=imu_reference.json` 及该文件 SHA256 | 4. IMU 方向核对(不上力读取): | 姿态 | 加速度(重力方向)近似 | | ------ | ------------ | | 直立 | `[0, 0, -1]` | | 躯干脸朝下 | `[1, 0, 0]` | | 躯干左侧朝下 | `[0, 1, 0]` | 允许实际摆放误差;**同时核对角速度正方向,不能只凭静止直立就认定安装朝向正确。** --- ## 六、正式遥控启动 > **先扶正并做好支撑与断电准备,然后:** ```bash cd /home/kickpi/daddyduck_hd1910 ./start_gamepad.sh ``` 脚本自动请求 sudo。 | 操作 | 说明 | | --------------- | ------------------- | | 左摇杆回中,按 A | 开始 10 秒 HOME | | HOME 完成后再次回中按 A | 启用 | | 左摇杆上 / 下 | 前进 / 后退 | | 左摇杆左 / 右 | 左转 / 右转(斜推可边走边转) | | 摇杆回中 | 速度指令为 0,继续站立策略并保持上力 | | A | 暂停 / 恢复 | | B 或 Ctrl+C | 退出并尝试确认卸力 | - 不使用 LB;右摇杆未使用。 - 默认 **600 秒**后结束并卸力,需有人接住。 - 自定义时长:`./start_gamepad.sh --seconds 60`(上限 3600 秒)。 ### 策略指令上限(不保证实测达到) | 参数 | 上限 | | ------- | ---------- | | 前进 | 0.25 m/s | | 后退 | 0.15 m/s | | 转向 | 0.5 rad/s | | 前后指令变化率 | 0.1 m/s 每秒 | - **没有设置开机自动运动。** --- ## 七、模型、IMU 和保护的确切版本 ### 模型 - 训练第 20500 轮,`policy.onnx` - 输入 61 维、输出 14 维、50 Hz,ONNX 内含归一化 - SHA256:`de2a4f833505b5002be5286f0cd0050db5c75cf0785fecfb44197331f64fefaa` ### IMU 配置 - 实际配置:`imu_reference.json`;代码:`imu_calibration.py` - 读取 `imu_to_base`、`gyro_bias_sensor`、`flip_xy`、`accel_sign` - **不再使用 `hardware_mapping.json` 的 IMU 旋转** - 变换顺序:先 flip,减传感器零偏,再旋转 - 矩阵:`[0, -1, 0; 1, 0, 0; 0, 0, 1]` - `mount_yaw_correction_deg` **不重复旋转** - SHA256:`d181c863eb33fdbc468bd5ba43094f1ef8b3d236a78ccca87dab6802d5e015ba` ### 保护机制 | 项目 | 说明 | | ----------- | ------------------------------------------------------------ | | 运行 SRAM PID | 5 / 0 / 0,退出恢复原 PID | | EEPROM | 不写入舵机 EEPROM 标定 | | 停机条件 | 上位机电流、倾角、角速度**不作为停机条件**,继续记录 | | 目标角度 | 裁剪到既有限位 | | 保留保护 | 低于 6.4 V / 高于 8.4 V、温度 ≥ 65°C、通信失败、舵机故障状态、非有限输出、控制超时 | | 持续跟踪保护 | 同一关节偏差 > 1.2 rad 持续 100 ms;或目标/关节几乎静止且误差 > 0.5 rad 持续 300 ms | | 手柄断开 | 退出 | | 外部硬件看门狗 | 无 | | 自动跌倒恢复 | 无 | --- ## 八、常见问题 | 现象 | 处理 | | ------------------------ | ---------------------------------------------------------- | | `PermissionError` | 从 `start_gamepad.sh` 启动以请求 sudo,**勿用 chmod 777 代替 I2C 权限** | | 遥控器没反应 | 确认 `/dev/input/js0` 存在,摇杆回中按 A;HOME 后还需按第二次 A | | `ModuleNotFoundError` | 确认使用该目录的 `.venv/bin/python`,不使用系统 python 替代 | | 串口 ID 不匹配 / 缺失 | 检查三路接线、其他控制器占用与 USB 编号,**未通过 probe 前不启动** | | IMU 方向异常 | 以 `imu_reference.json` 为唯一控制标定,**勿叠加电脑显示的历史校正** | | 退出时 `shutdown_errors` 非空 | 扶稳后核对电机卸力;独立 `stop.py` 只应在原控制器结束后执行 |