2. 手术机器人系统架构与软件分层
手术机器人软件不是“一个大程序”,而是一组在时间尺度、安全等级、数据形态上差异极大的子系统协同工作的结果。主从控制回路要求毫秒级确定性,影像处理允许百毫秒级延迟,导航配准可能只在术前或术中若干关键点触发,而安全监控必须始终在线且独立于业务逻辑。因此,架构设计的核心不是“分几个模块”,而是按实时性、安全等级和数据所有权划分层次,并为跨层交互约定清晰接口。
一、五类功能模块的职责边界
从工程实现角度,可将系统划分为五个功能域:
- 主从控制域:接收主手(操作手柄)位姿,经运动学解算、比例映射、抖动滤波后,输出从端机械臂关节目标。它拥有最高的实时优先级,典型控制周期为 1 kHz(1 ms),抖动容忍度通常要求小于周期的 10%。
- 导航域:维护患者坐标系、影像坐标系、机器人基坐标系之间的变换链,输出目标位姿与路径约束。它不直接驱动电机,而是向主从控制域提供“目标点”或“虚拟夹具”参数。
- 影像域:负责 CT/MR 数据加载、分割、三维重建、术中影像(如内窥镜、超声)采集与显示。它输出的是带坐标信息的影像体数据和分割掩膜,供导航域配准使用。
- 人机交互域:包括脚踏、按钮、语音、图形界面。它把术者意图翻译成“模式切换”“使能”“急停”等离散命令,不参与连续控制回路。
- 安全监控域:独立采集关节电流、速度、力传感器、急停回路状态,执行越界、超速、力超限判断,并可直接切断使能。它必须与主从控制域在物理或逻辑上隔离,避免“业务卡死导致安全失效”。
二、分层结构与接口约定
把上述五个域映射到软件分层,通常形成四层:硬件抽象层(HAL)、实时控制层、功能服务层、应用交互层。层与层之间只允许相邻调用,禁止跨层直接访问硬件寄存器或共享内存,这是保证可替换性和安全隔离的前提。
接口约定的关键不是“用什么协议”,而是数据语义、更新频率、失效行为和坐标系定义。例如主从控制域与导航域之间,若约定“目标位姿”接口,必须同时约定:位姿在机器人基坐标系下表达、四元数顺序为 (w,x,y,z)、更新频率不低于 50 Hz、超时 200 ms 未更新则保持当前目标并触发降级提示。缺少任何一项,集成时都会出现“单模块正常、联调异常”的典型问题。
三、接口约定的三个关键维度
第一是时间维度。不同层对“实时”的定义完全不同。主从控制层要求硬实时,接口调用必须有确定的最坏执行时间;功能服务层是软实时,允许排队和降级;应用交互层则是事件驱动。若把导航服务的配准计算直接放在控制线程里,一次 200 ms 的配准就会造成 200 个控制周期丢失,机械臂表现为明显卡顿甚至抖动。正确做法是:导航域在独立线程完成配准,通过无锁队列把结果以“最新值覆盖”方式发布给控制层,控制层每个周期只读取最新快照。
第二是安全维度。安全监控域不能依赖业务层的健康状态。工程上通常采用“心跳 + 看门狗”结构:主从控制层每个周期向安全监控域发送心跳,安全监控域若连续 3 个周期(3 ms)未收到心跳,立即切断使能并抱闸。同时,安全监控域自身有独立的传感器采集通道,不经过功能服务层转发。这样即使导航或影像服务崩溃,安全链路仍然有效。
第三是数据所有权维度。每个数据对象只能有一个“权威来源”。例如患者坐标系到机器人基坐标系的变换矩阵,权威来源是导航域;主从控制域只消费、不修改。影像分割掩膜由影像域拥有,导航域只读取。若允许多处写入,联调时会出现“谁最后写谁生效”的竞态,且难以复现。
四、一个可落地的接口定义示例
以下给出主从控制域与导航域之间“目标位姿”接口的字段约定,可直接作为集成时的接口文档片段:
接口名称:NavigationTargetPose
方向:导航域 → 主从控制域
传输方式:共享内存双缓冲 + 序列号
更新频率:50 Hz(20 ms)
超时阈值:200 ms
字段定义:
seq uint64 序列号,单调递增
timestamp uint64 采集时刻(ns,单调时钟)
frame_id string 固定为 "robot_base"
position float64[3] x, y, z(mm)
quaternion float64[4] w, x, y, z(单位四元数)
valid bool false 表示当前目标不可用
constraint uint8 0=无约束 1=虚拟夹具 2=路径约束
失效行为:
valid=false 或超时 → 控制层保持当前目标,
同时向人机交互域上报 "NAV_TARGET_LOST" 降级事件
这个示例说明:接口约定必须写到“字段级”和“失效级”,否则集成阶段只能靠试错。实际项目中,建议把每个跨域接口都按此粒度形成文档,并在持续集成中增加接口契约测试,例如注入超时、乱序、无效值,验证接收方的降级行为是否符合约定。
分层与接口约定的价值,在单模块开发阶段并不明显,但一旦进入多模块联调、换型或注册检验阶段,它决定了问题能否被快速定位。一个清晰的架构,应当让“导航算错了”和“控制没收到”在日志和状态上可区分,而不是表现为同一个“机械臂不动”。