底盘 robonix/primitive/chassis
底盘原语覆盖移动机器人的低层运动控制和反馈。能力约定定义在 Robonix 源码树下:IDL 在 capabilities/lib/chassis/,能力约定 TOML 在 capabilities/primitive/chassis/(绝对路径见 rbnx path capabilities)。
注意:目标式导航(
navigate/status/cancel)不属于底盘原语,由robonix/service/navigation/*服务承担(通常 Nav2)——详见 导航服务。位姿在 map 帧的查询也不在这里——那是定位服务(service/map/pose)的职责。底盘原语只负责下发瞬时速度(move/twist_in)和反馈底盘自身的运动事实(odom)。
接口
能力约定 ID(contract_id) | 模式 | 载荷(IDL) | 能力约定 TOML |
|---|---|---|---|
robonix/primitive/chassis/driver | rpc | lifecycle/Driver | primitive/chassis/driver.v1.toml |
robonix/primitive/chassis/move | rpc | chassis/ExecuteMoveCommand(MoveCommand → std_msgs/String) | primitive/chassis/move.v1.toml |
robonix/primitive/chassis/twist_in | topic_in | geometry_msgs/Twist | primitive/chassis/twist_in.v1.toml |
robonix/primitive/chassis/odom | topic_out | nav_msgs/Odometry | primitive/chassis/odom.v1.toml |
底盘有两个运动入口,分工明确:
move(gRPC,单发离散命令):一次forward_m/rotate_deg,或带duration_sec封顶的速度命令。驱动收到后在cmd_vel上发一小段Twist再停——适合“前进 1 m““转 30°“这种离散动作(snapshot → reason → move → snapshot)。move刻意不暴露为 MCP:它下发的是未经避障的瞬时速度,不挂到大模型工具列表上;要带路径规划的运动,走service/navigation/navigate。twist_in(ROS 2 topic,geometry_msgs/Twist):连续速度流入口。导航控制器(simple_nav的 nav 节点、Nav2 controller)和 teleop 把cmd_vel发到这里,底盘连续跟随。注意导航不是通过 gRPC 调move,而是往twist_in发Twist。
历史变更:早期版本有
robonix/primitive/chassis/state能力约定,返回一个RobotState巨型消息(base_pose + joint_state + tcp_pose + gripper)。base_pose字段实际上是 AMCL 的输出,让底盘原语去依赖一个上层定位服务——这是分层倒置(原语应该是叶子节点)。该能力约定已删除,消费者改为:
- 想拿 odom-frame 位姿 → 订阅
primitive/chassis/odom- 想拿 map-frame 位姿 → 订阅
service/map/pose
典型组合
基础移动底盘实现 driver + move + odom + twist_in:
driver:gRPC,rbnx boot 通过Driver(CMD_INIT)把底盘启起来move:gRPC(不暴露为 MCP),离散单发运动命令(前进 / 旋转 / 限时速度)odom:ROS 2,给service/map/*做融合定位用twist_in:ROS 2,Nav2 控制器把cmd_vel发到这里