Skip to content

空间与极端环境机器人

空间和极端环境机器人将自主性推向极限,通信延迟、辐射和非结构化地形要求机器人能够独立思考和行动。本章涵盖行星漫游车、在轨服务、通信受限的自主性、抗辐射计算、水下机器人、搜索与救援、集群机器人以及人机交互

  • 在本章的前面部分,我们研究了在相对温和的环境中运行的自主系统:有车道标线的道路、地板平整的仓库、包含已知物体类别的厨房。但机器人技术最有影响力的应用场景之一,恰恰是人类无法到达,或者人类存在的代价极其高昂的环境:火星表面、深海海底、核灾难现场、燃烧的建筑。

  • 这些极端环境具有共同的挑战:通信受限或存在延迟;地形非结构化且不可预测;硬件必须能够承受恶劣条件;当出现问题时,附近没有人类可以修复。机器人必须实现真正的自主,而不仅仅是“有人类盯着屏幕的自主”。

空间机器人

  • 空间是终极的极端环境。没有空气,温度从-170°C 到 +120°C 剧烈变化,辐射轰击电子设备,而帮助远在数百万公里之外。空间机器人必须异常可靠、节能且自主。

  • 行星漫游车 是探索其他世界表面的移动机器人。NASA 的火星漫游车(勇气号、机遇号、好奇号、毅力号)是最著名的例子。每一代都比上一代更加自主。

地-火通信延迟:单程4-24分钟,往返8-48分钟,使得实时控制不可能

  • 根本的约束是通信延迟。火星与地球的无线电通信延迟为4-24分钟(取决于轨道位置),因此往返通信需要8-48分钟。漫游车无法被实时摇控。如果它遇到一块岩石,不能向地球求助并等待响应。它必须自己做出决定。

  • 早期的漫游车(勇气号、机遇号)严重依赖地面“回路中”的规划:人类研究图像、规划路径、上传指令,漫游车再执行。一个驾驶周期需要一整个火星日。漫游车每个火星日可能只能行驶50-100米。

  • 好奇号和毅力号上的 AutoNav(自主导航)极大地提高了自主性。漫游车使用立体相机建立局部3D地图(回顾第8章的立体深度),评估地形可通过性(坡度、粗糙度、岩石大小),并使用基于网格的规划器结合可通过性成本图来规划安全路径。漫游车在人类团队睡觉时自主驾驶,使每日行驶距离提高到100米以上。

  • 火星漫游车上的感知流程受到抗辐射处理器的限制,这些处理器的速度比消费级硬件慢几个数量级(下面会讨论)。算法必须计算节俭:使用经典的立体匹配而非深度神经网络,使用简单的成本图规划器而非学习到的策略。

  • 在轨服务 涉及对在轨卫星进行检查、维修、加油或使其离轨的机器人。随着空间变得更加拥挤,这是一个不断发展的领域。NASA 的 OSAM-1 任务以及商业企业(Astroscale, Northrop Grumman MEV)使用机械臂和对接口对卫星进行服务。

  • 挑战在于近距离操作:服务航天器必须接近目标卫星(该卫星可能处于翻滚、不合作、且缺乏对接接口的状态),并在微重力环境下进行精确操作。基于视觉的位姿估计(从相机图像确定目标的3D位置和姿态)至关重要。这使用了第8章中的技术:特征检测、PnP(透视n点)求解,以及更近期基于深度学习的位姿估计器。

  • 卫星检查 使用小型航天器对其它卫星进行视觉检查,以发现损坏或异常。检查器必须自主绕目标导航、避免碰撞,并从最佳视角捕获高分辨率图像。这是一个规划问题:在满足燃料约束、光照条件和避碰要求的前提下,找到覆盖所有检查点的轨迹。

通信约束

  • 在太空中,通信受到光速、可用带宽和轨道几何的限制(火星背面的漫游车如果没有中继卫星就无法与地球通信)。

  • 这些约束从根本上改变了自主架构。在地球上,机器人可以将高清视频流传输到云服务器,在 GPU 集群上运行推理,并在毫秒级内接收命令。在太空中,机器人必须在机载设备上完成所有工作。

  • 高延迟 意味着机器人必须在没有实时人类指导的情况下规划和行动。自主软件必须处理正常运行、检测异常并应对危险,而不能等待人类的输入。这需要强大的机载状态估计、故障检测和应急规划能力。

  • 有限带宽 意味着机器人无法传输原始传感器数据。一张高分辨率图像可能就有几兆字节,但火星到地球的直接数据链路速率仅为每秒几千比特(通过轨道中继会更高,但仍然有限)。机器人必须激进地压缩数据,优先决定发送哪些数据,并在本地做出大多数决策。

  • 通信窗口 是间歇性的。火星漫游车只能在特定的轨道几何期间与地球通信,通常每个火星日通过中继卫星只有几个小时。在这些窗口之外,漫游车完全依靠自己。

  • 这对人工智能的启示是:机载自主性 必须高度可靠。系统需要检测是否出了问题(某个轮子卡住、某个传感器故障、前方地形不可通过),决定安全的响应方式,并持续运行直到下一个通信窗口,届时它可以汇报情况并接收更新指令。

抗辐射计算

  • 太空中充满了电离辐射:宇宙射线、太阳粒子事件以及行星磁场捕获的辐射。高能粒子可能使内存中的比特翻转(单粒子翻转),永久损坏晶体管(总电离剂量),或者造成电路中的破坏性闩锁。

  • 抗辐射处理器 专为此类环境设计。它们使用更大的晶体管几何尺寸、冗余逻辑(三模冗余:每个电路有三个副本,对输出进行投票)以及专门的制造工艺。代价是性能:一颗最先进的抗辐射处理器可能提供 200 MIPS,而消费级 GPU 每秒可执行数十亿次操作。

  • RAD750(BAE Systems)为好奇号和许多其他航天器提供动力。它以 200 MHz 运行,处理能力约为 400 MIPS,与 1990 年代中期的台式电脑相当。毅力号使用类似级别的处理器。在此类硬件上运行现代神经网络(数百万参数,数十亿次乘加运算)是不可行的。

  • 模型压缩 变得至关重要。第 6 章中的技术(量化、剪枝、知识蒸馏)用于缩小神经网络,使其适应极端的计算预算。在笔记本电脑 GPU 上运行仅需毫秒的模型,在抗辐射处理器上可能需要数分钟,或者根本装不进内存。

  • 另一种方法是使用商用现货处理器,并结合软件中的辐射缓解措施:纠错码、看门狗定时器、定期内存刷新以及优雅降级策略。一些现代任务采用这种方法,以牺牲软件复杂性和风险为代价,换取更强大的计算能力。

  • 未来的行星任务正在探索 FPGA 和专用 AI 加速器,这些器件具有抗辐射能力,同时比传统的抗辐射 CPU 提供更多的计算能力,可能首次实现在机载设备上运行深度学习。

非结构化地形中的自主导航

  • 在地球上,道路是平坦、有良好标线和地图的。在火星、月球或灾难现场,没有道路。地形是非结构化的:岩石、斜坡、沙子、裂缝以及可能无法支撑机器人重量的表面。

  • 地形分类 评估每一块地面是否安全可通行。特征包括坡度(来自 3D 重建)、粗糙度(表面法线的方差)、岩石密度和土壤类型。经典方法从立体深度图计算这些特征;现代方法使用基于视觉和几何特征的学习分类器。

  • 视觉-惯性里程计 通过跟踪相机帧间的视觉特征并与 IMU 测量值融合来估计机器人的运动。这是 SLAM 的核心组成部分(第 8 章),针对极端条件进行了适配。在火星上,视觉-惯性里程计必须处理:缺乏特征的沙地(可跟踪的视觉特征少)、严酷的光照(极端阴影)以及有限的计算能力。

  • 估计使用扩展卡尔曼滤波器或因子图优化来融合视觉和惯性数据。状态向量包括位置、速度、姿态和 IMU 偏差。预测步骤使用 IMU 积分:

\[\mathbf{x}_{t+1} = f(\mathbf{x}_t, \mathbf{u}_t)\]
  • 其中 \(\mathbf{u}_t\) 是 IMU 测量值(加速度和角速度)。更新步骤使用视觉特征观测值来校正预测。这是贝叶斯估计(第 5 章):IMU 提供先验,视觉观测更新信念。

  • 危险规避 在行星着陆期间至关重要。当航天器向地表下降时,它必须使用机载相机或激光雷达实时识别安全着陆区。NASA 在毅力号上使用的地形相对导航系统将机载相机图像与预加载的轨道地图进行比较,以在下降过程中确定其位置,然后转向避开危险地形。这使得在杰泽罗陨石坑着陆成为可能,这是一个科学意义丰富但地形危险的区域,对于以往的任务来说风险太大。

水下机器人

  • 深海如同太空一样陌生:巨大压力(海洋最深处超过 1000 个大气压)、近乎零能见度、没有 GPS、通信受限。水下机器人对于海洋科学、海上基础设施检查、深海采矿和搜索作业至关重要。

  • AUV(自主水下航行器)无缆作业,携带自身电源和计算设备。它们遵循预先编程的勘测模式,或使用机载智能来适应新发现。AUV 用于海床测绘、管道检查和环境监测。

  • ROV(遥控无人潜水器)通过电缆与水面舰艇连接,电缆提供电力和通信。它们用于需要实时人类控制的任务:深海操作、施工和维修。缆线消除了通信约束,但限制了航程并增加了操作复杂性。

  • 水声通信 是水下主要的通信方式(无线电波在水中衰减很快)。水声调制解调器在几公里范围内可实现 1-10 kbps 的数据速率,而陆地无线电可达每秒千兆比特。这比火星通信更受限,迫使 AUV 具有高度自主性。

  • 水下 SLAM 尤其具有挑战性。声纳提供距离测量,但角分辨率差且有显著噪声(来自海底和海面的多径反射)。相机仅在非常短的距离内有效(清水下几米,浑浊条件下更短)。基于特征的视觉 SLAM(第 8 章)必须针对水下场景独特的视觉特征进行调整:颜色衰减(红光首先被吸收)、反向散射,以及会产生亮斑和深阴影的人工照明。

  • 没有 GPS 的导航使用航位推算(积分来自多普勒测速仪的速度,该测速仪使用声学多普勒频移测量相对于海床的速度),并辅以偶尔浮出水面进行 GPS 定位或通过水面应答器进行声学定位。这与仅使用 IMU 的导航一样存在漂移问题:小的速度误差在长任务中会累积。

搜索与救援机器人

  • 在地震、建筑物倒塌或工业事故之后,机器人可以进入对人类救援人员来说过于危险的空间:结构不稳定的建筑、有毒环境、火灾或密闭空间。

  • 要求包括:快速部署(几分钟,而非几小时)、在无 GPS 环境中运行(建筑物内部、地下)、通过墙壁和废墟进行鲁棒的通信,以及能够在高度杂乱、部分坍塌的空间中导航,并且要应对碎片、灰尘和照明不足。

  • 多机器人协调 在搜索与救援中非常有价值,因为一组机器人可以比单个机器人更快地覆盖大面积区域。挑战在于协调:机器人必须划分搜索区域,避免重复劳动,并共享发现。

  • 基于前沿的探索 将机器人分配到已探索空间与未探索空间之间的边界(“前沿”)。每个机器人导航到最近的未探索前沿,绘制地图,然后继续前进。一个中央或分布式规划器将前沿分配给机器人,以最小化总探索时间。这是一个覆盖优化问题。

  • 通过废墟进行通信不可靠。机器人可能与操作员以及彼此之间失去联系。系统必须能够容忍间歇性通信:每个机器人应该能够独立操作,建立自己的局部地图,做出自己的决策,然后在通信恢复时合并信息。

集群机器人

  • 集群机器人 使用大量简单、低成本的机器人,通过局部交互实现复杂的集体行为。单个机器人并不具备独立完成任务的能力,但整个集群却可以执行单个机器人无法完成的任务。

  • 灵感来自生物集群:蚂蚁用身体搭建桥梁,蜜蜂共同决定筑巢地点,鱼群通过协调运动躲避捕食者。在每种情况下,简单的局部规则(跟随邻居、避免碰撞、向食物移动)都会产生复杂的全局行为。

  • 去中心化控制 意味着没有中央指挥官。每个机器人遵循相同的局部规则,仅对邻居和直接环境做出反应。全局行为从这些局部交互中涌现出来。这使得集群具有固有的鲁棒性:如果一个机器人失效,集群仍能继续运行。没有单点故障。

  • 共识算法 使集群仅通过局部通信就能达成集体决策共识(例如,向哪个方向移动,优先完成哪个任务)。一个简单的共识协议是让每个机器人与邻居对其值进行平均:

\[x_i(t+1) = \frac{1}{|N_i| + 1} \left( x_i(t) + \sum_{j \in N_i} x_j(t) \right)\]

集群共识:机器人从分散开始,迭代地与邻居平均,收敛到共享位置

  • 其中 \(N_i\) 是机器人 \(i\) 的邻居集合。迭代进行直到所有机器人收敛到相同的值(全局平均值)。收敛速度取决于通信图的拓扑,特别是其代数连通度(图拉普拉斯矩阵的第二小特征值,与第 2 章的特征值相关)。

Reynolds 的三个集群规则:分离避免碰撞,对应对齐航向,凝聚保持与群体一起

  • 集群算法(Reynolds 规则)通过每个机器人的三个简单规则产生协调的群体运动:

    • 分离:转向以避免离得太近的邻居(避免碰撞)。
    • 对齐:转向邻居的平均航向(朝同一方向移动)。
    • 凝聚:转向邻居的平均位置(与群体待在一起)。
  • 每个规则是对机器人速度的一个向量贡献。这些向量的加权和产生自然的集群行为。这是向量的线性组合(第 1 章),其中权重控制每个行为的相对重要性。

  • 集群机器人的应用包括环境监测(在大面积区域分布传感器)、精准农业(协调无人机进行作物喷洒)、建筑施工(机器人集体组装结构)以及搜索任务(高效覆盖大面积区域)。

人机交互

  • 大多数现实世界的自主系统与人类并肩工作,而不是孤立运行。人与机器人之间的交互——他们如何沟通、共享控制、建立信任——与机器人的技术能力同等重要。

共享自主光谱:从完全人类遥操作(alpha=1)到混合控制再到完全机器人自主(alpha=0)

  • 共享自主 融合了人类和机器人的控制。它既不是完全的遥操作(人类控制一切),也不是完全的自主(机器人控制一切),而是让人类提供高层意图,机器人执行低层操作。例如,人类可以指向一个物体并说“拿起那个”,然后机器人自主规划抓取和手臂动作。

  • 从数学上讲,共享自主可以建模为人类输入 \(\mathbf{u}_h\) 和机器人自主动作 \(\mathbf{u}_r\) 的混合:

\[\mathbf{u} = \alpha \mathbf{u}_h + (1 - \alpha) \mathbf{u}_r\]
  • 其中 \(\alpha \in [0, 1]\) 是混合参数。当 \(\alpha = 1\) 时,人类完全控制(遥操作)。当 \(\alpha = 0\) 时,机器人完全自主。自适应共享自主根据情况调整 \(\alpha\):当机器人自信时,它接管更多控制;当不确定或面临新情况时,它让出控制。

  • 遥操作 在超出当前自主能力的任务中仍然重要。人类操作员通过机器人的相机观察场景,远程控制机器人。挑战在于延迟:即使是 100 毫秒的延迟也会使遥操作变得困难,而太空中几秒钟的延迟使得精细操作几乎不可能。预测显示(显示机器人预测的未来状态)和虚拟 fixture(软件引导,防止操作员命令危险运动)有助于弥补延迟的影响。

  • 信任校准 是确保人类对机器人拥有适当信任的问题:不要太多(过度信任导致自满,在需要介入时未能介入);也不太少(信任不足导致不必要的干预和低效利用)。信任应该根据机器人的实际能力进行校准:在它擅长的情境下信任它,在其能力边缘的情境下保持怀疑。

  • 研究表明,信任受以下因素影响:机器人的透明度(它是否解释自己的决定?)、可靠性(它的失败是可预测的还是随机的?)以及沟通(它是否表达不确定性?)。一个说“我 40% 确信这条路径安全,我应该继续吗?”的机器人,比一个默默向前行驶的机器人,能促成更好的人类决策。

  • 机器人运动中的可读性 意味着机器人的移动方式能够向附近的人类传达其意图。如果一个机器人伸手去拿某个物体,它的路径应该让人类在它到达之前就能清楚它瞄准的是哪个物体。这涉及规划能够最大化观察者从观察到的部分轨迹中提前推断出目标的概率的轨迹,可以形式化为:

\[\pi^* = \arg\max_\pi P(G \mid \xi_{0:t})\]
  • 其中 \(G\) 是目标,\(\xi_{0:t}\) 是迄今为止观察到的轨迹。这使用了贝叶斯推理(第 5 章):观察者对可能的目标有一个先验,机器人的轨迹提供了更新这一信念的证据。

编程任务(使用 CoLab 或 notebook)

  1. 模拟一个集群机器人的共识算法,使机器人群体就一个目标位置达成一致。从随机初始位置开始,观察收敛过程。

    import jax
    import jax.numpy as jnp
    import matplotlib.pyplot as plt
    
    n_robots = 10
    rng = jax.random.PRNGKey(0)
    positions = jax.random.uniform(rng, (n_robots, 2), minval=-5, maxval=5)
    
    # 通信图:每个机器人与它的 3 个最近邻居通信
    def get_neighbours(positions, k=3):
        dists = jnp.linalg.norm(positions[:, None] - positions[None, :], axis=-1)
        # 对每个机器人,找到最近的 k 个(排除自身)
        neighbours = jnp.argsort(dists, axis=1)[:, 1:k+1]
        return neighbours
    
    history = [positions.copy()]
    
    for step in range(30):
        neighbours = get_neighbours(positions)
        new_positions = jnp.zeros_like(positions)
        for i in range(n_robots):
            nbr_pos = positions[neighbours[i]]
            new_positions = new_positions.at[i].set(
                (positions[i] + nbr_pos.sum(axis=0)) / (len(neighbours[i]) + 1)
            )
        positions = new_positions
        history.append(positions.copy())
    
    # 绘制收敛过程
    fig, axes = plt.subplots(1, 3, figsize=(15, 4))
    for ax, step_idx, title in zip(axes, [0, 10, 29], ["初始", "第10步", "最终"]):
        h = history[step_idx]
        ax.scatter(h[:, 0], h[:, 1], s=50)
        ax.set_xlim(-6, 6); ax.set_ylim(-6, 6)
        ax.set_aspect("equal"); ax.grid(True); ax.set_title(title)
    plt.suptitle("集群共识:机器人收敛到一致")
    plt.tight_layout()
    plt.show()
    

  2. 实现 Reynolds 的集群规则(分离、对齐、凝聚),并模拟一个群体一起移动。

    import jax
    import jax.numpy as jnp
    import matplotlib.pyplot as plt
    
    n = 30
    rng = jax.random.PRNGKey(1)
    k1, k2 = jax.random.split(rng)
    pos = jax.random.uniform(k1, (n, 2), minval=-5, maxval=5)
    vel = jax.random.uniform(k2, (n, 2), minval=-0.5, maxval=0.5)
    
    dt = 0.1
    separation_radius = 1.0
    neighbour_radius = 3.0
    
    trajectories = [pos.copy()]
    
    for _ in range(200):
        new_vel = jnp.zeros_like(vel)
        for i in range(n):
            diffs = pos - pos[i]
            dists = jnp.linalg.norm(diffs, axis=1)
    
            # 半径内的邻居(排除自身)
            nbr_mask = (dists < neighbour_radius) & (dists > 0)
            sep_mask = (dists < separation_radius) & (dists > 0)
    
            # 分离:转向远离非常近的邻居
            if sep_mask.any():
                sep = -diffs[sep_mask].sum(axis=0)
            else:
                sep = jnp.zeros(2)
    
            # 对齐:匹配邻居的平均速度
            if nbr_mask.any():
                align = vel[nbr_mask].mean(axis=0) - vel[i]
            else:
                align = jnp.zeros(2)
    
            # 凝聚:转向邻居的平均位置
            if nbr_mask.any():
                cohesion = pos[nbr_mask].mean(axis=0) - pos[i]
            else:
                cohesion = jnp.zeros(2)
    
            new_vel = new_vel.at[i].set(vel[i] + 1.5 * sep + 0.5 * align + 0.3 * cohesion)
    
        # 限制速度
        speeds = jnp.linalg.norm(new_vel, axis=1, keepdims=True)
        vel = jnp.where(speeds > 2.0, new_vel / speeds * 2.0, new_vel)
        pos = pos + vel * dt
        trajectories.append(pos.copy())
    
    # 绘制快照
    fig, axes = plt.subplots(1, 3, figsize=(15, 4))
    for ax, idx, title in zip(axes, [0, 50, 199], ["开始", "第50步", "第200步"]):
        p = trajectories[idx]
        ax.scatter(p[:, 0], p[:, 1], s=20, c="blue")
        ax.set_aspect("equal"); ax.grid(True); ax.set_title(title)
        lim = max(abs(p).max() + 1, 6)
        ax.set_xlim(-lim, lim); ax.set_ylim(-lim, lim)
    plt.suptitle("Reynolds 集群:分离 + 对齐 + 凝聚")
    plt.tight_layout()
    plt.show()
    

  3. 模拟共享自主的混合:人类提供有噪声的方向输入,机器人的自主系统提供到达目标的平滑路径。使用不同的 alpha 值进行混合。

    import jax
    import jax.numpy as jnp
    import matplotlib.pyplot as plt
    
    goal = jnp.array([10.0, 5.0])
    pos = jnp.array([0.0, 0.0])
    dt = 0.1
    
    rng = jax.random.PRNGKey(3)
    
    fig, axes = plt.subplots(1, 3, figsize=(15, 4))
    for ax, alpha in zip(axes, [1.0, 0.5, 0.0]):
        pos = jnp.array([0.0, 0.0])
        path = [pos.copy()]
    
        for step in range(150):
            # 机器人自主:平滑路径到目标
            direction = goal - pos
            u_robot = direction / (jnp.linalg.norm(direction) + 1e-6) * 1.0
    
            # 人类输入:大致正确的方向,但有噪声
            noise = jax.random.normal(jax.random.fold_in(rng, step), (2,)) * 0.5
            u_human = u_robot + noise
    
            # 混合
            u = alpha * u_human + (1 - alpha) * u_robot
            pos = pos + u * dt
            path.append(pos.copy())
    
            if jnp.linalg.norm(pos - goal) < 0.3:
                break
    
        path = jnp.stack(path)
        ax.plot(path[:, 0], path[:, 1], "b-", alpha=0.7)
        ax.plot(*goal, "r*", markersize=15)
        ax.plot(0, 0, "go", markersize=10)
        ax.set_title(f"α={alpha:.1f} ({'人类' if alpha==1 else '机器人' if alpha==0 else '共享'})")
        ax.set_xlim(-1, 12); ax.set_ylim(-3, 8)
        ax.set_aspect("equal"); ax.grid(True)
    
    plt.suptitle("共享自主:融合人类与机器人的控制")
    plt.tight_layout()
    plt.show()