2. 手术机器人系统架构与软件分层

手术机器人软件不是“一个大程序”,而是一组在时间尺度、安全等级、数据形态上差异极大的子系统协同工作的结果。主从控制回路要求毫秒级确定性,影像处理允许百毫秒级延迟,导航配准可能只在术前或术中若干关键点触发,而安全监控必须始终在线且独立于业务逻辑。因此,架构设计的核心不是“分几个模块”,而是按实时性、安全等级和数据所有权划分层次,并为跨层交互约定清晰接口。

一、五类功能模块的职责边界

从工程实现角度,可将系统划分为五个功能域:

  • 主从控制域:接收主手(操作手柄)位姿,经运动学解算、比例映射、抖动滤波后,输出从端机械臂关节目标。它拥有最高的实时优先级,典型控制周期为 1 kHz(1 ms),抖动容忍度通常要求小于周期的 10%。
  • 导航域:维护患者坐标系、影像坐标系、机器人基坐标系之间的变换链,输出目标位姿与路径约束。它不直接驱动电机,而是向主从控制域提供“目标点”或“虚拟夹具”参数。
  • 影像域:负责 CT/MR 数据加载、分割、三维重建、术中影像(如内窥镜、超声)采集与显示。它输出的是带坐标信息的影像体数据和分割掩膜,供导航域配准使用。
  • 人机交互域:包括脚踏、按钮、语音、图形界面。它把术者意图翻译成“模式切换”“使能”“急停”等离散命令,不参与连续控制回路。
  • 安全监控域:独立采集关节电流、速度、力传感器、急停回路状态,执行越界、超速、力超限判断,并可直接切断使能。它必须与主从控制域在物理或逻辑上隔离,避免“业务卡死导致安全失效”。

二、分层结构与接口约定

把上述五个域映射到软件分层,通常形成四层:硬件抽象层(HAL)、实时控制层、功能服务层、应用交互层。层与层之间只允许相邻调用,禁止跨层直接访问硬件寄存器或共享内存,这是保证可替换性和安全隔离的前提。

接口约定的关键不是“用什么协议”,而是数据语义、更新频率、失效行为和坐标系定义。例如主从控制域与导航域之间,若约定“目标位姿”接口,必须同时约定:位姿在机器人基坐标系下表达、四元数顺序为 (w,x,y,z)、更新频率不低于 50 Hz、超时 200 ms 未更新则保持当前目标并触发降级提示。缺少任何一项,集成时都会出现“单模块正常、联调异常”的典型问题。

手术机器人软件分层与接口关系 应用交互层 图形界面 / 术者控制台 脚踏 / 按钮 / 语音 状态显示 / 报警提示 手术流程管理 功能服务层 导航服务 坐标变换链 / 配准 目标位姿 / 虚拟夹具 影像服务 CT/MR 加载 / 分割 三维重建 / 术中影像 安全监控服务 越界 / 超速 / 力超限 急停回路 / 使能管理 日志与 回放 实时控制层(1 kHz 控制周期) 主从控制回路 运动学解算 / 比例映射 / 滤波 轨迹插补与限幅 速度 / 加速度 / 力矩约束 安全联锁执行 使能切断 / 抱闸 / 状态上报 硬件抽象层(HAL) 电机驱动 / 编码器 力 / 力矩传感器 影像采集卡 / 相机 急停 / 安全继电器 接口:模式命令 / 使能 / 急停(离散事件) 接口:目标位姿 / 虚拟夹具(50 Hz,超时降级) 接口:关节状态 / 传感器原始值(1 kHz) 独立安全通道 坐标系约定:机器人基坐标系为根,影像/患者坐标系经配准变换接入;位姿统一用四元数 (w,x,y,z) 表达

三、接口约定的三个关键维度

第一是时间维度。不同层对“实时”的定义完全不同。主从控制层要求硬实时,接口调用必须有确定的最坏执行时间;功能服务层是软实时,允许排队和降级;应用交互层则是事件驱动。若把导航服务的配准计算直接放在控制线程里,一次 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" 降级事件

这个示例说明:接口约定必须写到“字段级”和“失效级”,否则集成阶段只能靠试错。实际项目中,建议把每个跨域接口都按此粒度形成文档,并在持续集成中增加接口契约测试,例如注入超时、乱序、无效值,验证接收方的降级行为是否符合约定。

集成检查要点:① 每个跨域接口是否明确了坐标系与单位;② 是否定义了超时和无效值行为;③ 安全监控是否独立于业务线程;④ 是否存在多个写入者的共享数据;⑤ 控制周期内是否调用了可能阻塞的服务。

分层与接口约定的价值,在单模块开发阶段并不明显,但一旦进入多模块联调、换型或注册检验阶段,它决定了问题能否被快速定位。一个清晰的架构,应当让“导航算错了”和“控制没收到”在日志和状态上可区分,而不是表现为同一个“机械臂不动”。