Quadruped Platform · 四足
Navi 四足机器人 SDK
Navi 是 FF 紧凑型四足机器人产品线(Dev / Mini 多变体)。除了标准的运动与状态能力,
它最大的特色是 session.navi.* 专属命名空间:上百个扩展动作
(鞠躬 / 招手 / 转圈 / 舞蹈)、可深度调节的步态与运动参数、表情与外设控制。
01概览与能力矩阵
| 能力域 | 方法 | 状态 | 说明 |
|---|---|---|---|
motion | cmd_vel() | ✅ live | 速度控制 |
stand() / damping() | ✅ live | 站立 / 阻尼(内部映射扩展动作) | |
do_preset() | ✅ live | stand / damping / passive 等模式名 | |
state | battery() / status() / joint_states() | ✅ live | 全套遥测 |
pose() | ❌ | 无 SLAM,CapabilityNotSupported | |
navi ★ | do_action() / set_gait() / play_emoji() … | ✅ live | 平台专属扩展,见 扩展动作库 |
display | set_led() | 🟡 部分 | 灯效(屏幕走 navi.set_screen()) |
navigation | goto() | 🟡 部分 | 对接中 |
audio / vision / arm / checkin | — | ❌ | 音量走 navi.set_volume();其余本形态不适用 |
两层 API 怎么选
跨机器人代码用标准能力(
motion / state)和 ff_sdk.skills.*;
Navi 专属玩法(扩展动作 / 步态调参 / 表情)用 session.navi.* ——
后者明确是 platform-specific,换平台不可移植。
02安装
shell — 安装
# 在机器人上(aarch64)
pip install wheels/ff_sdk-0.1.0a0-cp310-cp310-linux_aarch64.whl
# 在 Linux 开发机上(x86_64)
pip install wheels/ff_sdk-0.1.0a0-cp310-cp310-linux_x86_64.whl
python -c "import ff_sdk; print(ff_sdk.__version__)"
Navi 经 WebSocket 与机器人通信,开发机与机器人同一局域网即可控制 —— 这是四个平台里 远程开发体验最顺的一个。
03快速开始
hello_navi.py — 标准能力 + 专属扩展
import asyncio, ff_sdk
async def main():
async with await ff_sdk.connect("NV-DEMO") as dog:
print(dog.diagnose())
# —— 标准能力(跨平台同一套写法)——
await dog.motion.stand() # 站立就绪
await asyncio.sleep(6)
await dog.motion.cmd_vel(linear=0.2) # 前进
await asyncio.sleep(2)
await dog.motion.stop()
battery = await dog.state.battery()
print(f"电量 {battery.percent:.0%}")
# —— Navi 专属扩展 ——
nv = dog.navi
actions = await nv.list_actions() # 全部可用扩展动作
await nv.do_action(20542) # 招手
await nv.play_emoji("happy") # 表情
await dog.motion.damping() # 收尾
asyncio.run(main())
解锁顺序
刚开机的机器人先
damping()(阻尼复位)再 stand()(站立就绪),
之后才能行走和做扩展动作。跳过这一步,运动指令可能被底层状态机忽略。
04连接 / 变体 / 配置
变体与 target 前缀
Navi 产品线有三个变体,API 相同,通过 target 前缀(或配置)选择:
| 变体 | target 写法 | 说明 |
|---|---|---|
| Dev(默认 ⭐) | NV-<sn> 或 NV-A100-<sn> | 开发者版四足,扩展动作 / 参数调节全量开放 |
| DevQ(旧款开发版) | NV-DevQ-<sn> | 走兼容控制路径 |
| Mini(消费版) | NV-Mini-<sn> | 面向消费场景的紧凑款 |
环境变量
| 变量 | 默认 | 说明 |
|---|---|---|
FF_SDK_NAVI_HOST | 机器人默认地址 | 机器人 IP(接入你的局域网时填) |
FF_SDK_NAVI_PORT | 9090 | 控制通道(WebSocket)端口 |
FF_SDK_DRY_RUN | 关 | 设 1 干跑模式 |
FF_SDK_TRANSPORT_TIMEOUT | 5.0 | 单次操作超时(秒) |
python — Config 指定变体与地址
from ff_sdk import Config
cfg = Config.from_env()
cfg.extra["navi_host"] = "192.168.1.77"
cfg.extra["navi_variant"] = "a100_dev" # a100_dev | devq | mini
dog = await ff_sdk.connect("NV-DEMO", config=cfg)
05Session 与生命周期
| 成员 | 类型 | 说明 |
|---|---|---|
session.motion / .state / … | 能力访问器 | 不支持时 raise CapabilityNotSupported |
session.navi ★ | 扩展命名空间 | 仅 Dev 变体;其他变体为 None |
session.capabilities() | set[str] | 支持的能力域集合 |
session.diagnose() | DiagnosticReport | 健康体检(控制通道连通性) |
await session.e_stop(reason) | — | 紧急停止 |
await session.close() | — | 断开连接 |
python — navi 命名空间的防御性访问
nv = dog.navi
if nv is None:
print("此变体不提供扩展命名空间(Mini / DevQ)")
else:
await nv.do_action(20542)
06motion · 运动控制
| 方法 | 说明 |
|---|---|
await motion.cmd_vel(linear, angular, lateral) | 速度控制(m/s, rad/s) |
await motion.stand() | 站立就绪(内部映射扩展动作,约 6s) |
await motion.damping() | 阻尼 / 软急停(同时清零速度) |
await motion.stop() | 停止移动 |
await motion.do_preset(name) | stand / stand_up / damping / passive / estop 等模式名 |
python — 行走方阵
import math
await dog.motion.stand()
await asyncio.sleep(6)
for _ in range(4): # 走一个正方形
await dog.motion.cmd_vel(linear=0.25) # 直行
await asyncio.sleep(3)
await dog.motion.cmd_vel(angular=math.pi/4) # 原地转 90°
await asyncio.sleep(2)
await dog.motion.stop()
07state · 状态遥测
| 方法 | 状态 | 说明 |
|---|---|---|
await state.battery() | ✅ | percent(0–1) / voltage / is_charging |
await state.status() | ✅ | RobotStatus 状态机 |
await state.joint_states() | ✅ | 标准关节遥测(names / positions / velocities / efforts) |
await state.pose() | ❌ | 无 SLAM,CapabilityNotSupported |
08navi.do_action · 扩展动作库 ★
async navi.do_action(action_id: int, *, hold_time: float = 3.0,
priority: int = 25) -> dict
async navi.list_actions() -> AvailableActions
Navi 内置 134 个扩展动作(动作库随固件更新可能增减)。
list_actions() 返回当前这台机器的权威动作清单(ID + 名称)——
写代码前先跑一次它。
常用动作 ID
| action_id | 动作 | 说明 |
|---|---|---|
0 | 阻尼 / 急停 | 关节松软,安全态 |
4 | 站立就绪 | 起立并进入可行走状态 |
20510 | 鞠躬 | |
20525 | 原地转身 180° | 周围留空间 |
20542 | 招手 | |
20567 | 抖肩舞 |
ID 以运行时为准
不同固件版本动作 ID 可能调整。硬编码 ID 前先
list_actions() 验证;
跨固件代码建议按动作名称查找 ID 再调用。
python — 按名称安全调用动作
actions = await dog.navi.list_actions()
def find_id(actions, keyword: str) -> int | None:
for act in actions.items: # (id, name) 列表
if keyword in act.name:
return act.id
return None
wave_id = find_id(actions, "wave")
if wave_id is not None:
result = await dog.navi.do_action(wave_id, hold_time=4.0)
print(result)
参数
| 参数 | 默认 | 说明 |
|---|---|---|
hold_time | 3.0 | 动作保持 / 执行时长(秒),长动作(舞蹈)按需加大 |
priority | 25 | 动作优先级,高优先级可抢占进行中的低优先级动作 |
09navi.set_* · 运动参数调节 ★
实时调节步态与运动风格 —— 这是 Navi 区别于其他平台的“可玩性”所在:
| 方法 | 参数 | 说明 |
|---|---|---|
await navi.set_gait(gait_id) | int | 切换步态 |
await navi.set_foot_height(height_m) | 米 | 抬脚高度(越高越能跨障,越费电) |
await navi.set_user_mode(mode) | int | 用户模式 |
await navi.set_collision_protect(enabled) | bool | 碰撞保护开关 |
await navi.set_friction(friction) | float | 地面摩擦系数估计(光滑地面调低防打滑) |
await navi.set_jump_distance(distance_m) | 米 | 跳跃距离 |
await navi.set_jump_angle(angle_rad) | 弧度 | 跳跃角度 |
进阶 setter(标注:待真机回归确认)
以下参数接口已定义,消息结构在持续真机验证中 —— 使用时建议小步调整并观察:
set_ground_model / set_free_leg / set_swing_traj_type /
set_controller_type / set_model_scale / set_swaying_duration /
set_swing_duration / set_velocity_decay / set_decelerate。
set_raw —— 逃生口
async navi.set_raw(topic: str, msg_type: str, msg: dict) -> None
对 SDK 尚未封装的底层接口直接发原始消息。仅在你明确知道消息结构时使用, 错误结构可能被底层忽略或产生预期外行为。
python — 草地行走调参示例
# 草地:抬高脚 + 保守速度
await dog.navi.set_foot_height(0.08)
await dog.navi.set_collision_protect(True)
await dog.motion.cmd_vel(linear=0.15)
10navi 便利方法 ★
| 方法 | 说明 |
|---|---|
await navi.play_emoji(name, hold_time=2.0) | 播放表情 |
await navi.set_volume(volume) | 音量(整数档位) |
await navi.self_charging(hold_time=60.0) | 自主回充 |
await navi.do_dog_behavior(behavior, hold_time=3.0, **extra) | 行为模式(撒娇 / 打滚等,按 list_actions 清单) |
await navi.set_walking_style(style, **extra) | 行走风格 |
await navi.set_motion_params(**params) | 批量运动参数 |
await navi.set_screen(**params) | 屏幕显示控制 |
await navi.set_fan(duty_cycle=…, enable=…) | 散热风扇 |
await navi.smart_action(name, **extra) | 智能行为入口 |
python — 表演一段
nv = dog.navi
await nv.play_emoji("happy")
await nv.do_action(20542, hold_time=4.0) # 招手
await nv.do_action(20567, hold_time=8.0) # 抖肩舞
await nv.do_action(20510, hold_time=4.0) # 鞠躬谢幕
await dog.motion.damping()
11跨平台 Skills
python
from ff_sdk import skills
await skills.wave(dog) # Navi 上自动映射为扩展动作“招手”
await skills.bow(dog) # → 扩展动作“鞠躬”
await skills.greet(dog, "朋友")
skills 在 Navi 上内部走 navi.do_action(),但调用方完全不用关心 ——
同一行代码换到 Aegis / Futurist 照样跑。
12异常与诊断
| 异常 | 什么时候抛 |
|---|---|
FfSdkError | 所有 SDK 异常的根类 |
ConnectionError / TransportError / TimeoutError | WebSocket 连接 / 线路 / 超时 |
PlatformError | 底层错误翻译 |
CapabilityNotSupported | 能力 / 变体不支持(如 Mini 上访问部分扩展) |
EStopActiveError / StateError | 急停激活 / 状态不允许 |
python — diagnose 先行
report = dog.diagnose()
print(report) # 控制通道连通性、变体识别结果
13示例索引
| 示例 | 内容 |
|---|---|
01_hello_connect.py | 第一次连接 + 诊断 + 紧急停止 |
02_diagnose.py | 体检报告详解 |
03_estop.py | 紧急停止 + 回调 + 重置 |
cookbook/context_manager.py | async with 上下文管理 |
cookbook/safety_watchdog.py | 安全看门狗 |
cookbook/multi_robot.py | 多机器人并发控制 |
cookbook/graceful_shutdown.py | 优雅关闭 |
14FAQ / 排错
| 现象 | 可能原因 | 解决 |
|---|---|---|
| 动作指令被忽略 | 没走解锁顺序 | 先 damping() 再 stand(),等站稳后发动作 |
dog.navi 是 None | 变体不是 Dev | 扩展命名空间仅 Dev 变体提供;用标准 motion 能力 |
do_action(id) 没反应 | ID 在该固件不存在 / 被低优先级抢占 | 先 list_actions() 验证 ID;必要时提高 priority |
| 连不上 | 不在同一局域网 / 端口不通 | 核对 FF_SDK_NAVI_HOST / FF_SDK_NAVI_PORT,ping 通再连 |
state.pose() 报错 | 无 SLAM | 预期行为,捕获 CapabilityNotSupported |