拓冰建站拓冰建站
首页 / 资讯中心 / 正文

人形机器人进阶抓取技术:从多模态感知到自适应闭环控制

1. 从“抓取”到“灵巧操作”人形机器人抓取技术的进阶之路当我们在谈论人形机器人时一个绕不开的核心能力就是“抓取”。这听起来简单不就是让机械手握住一个东西吗但如果你真的上手调试过就会明白这背后是一个从“能抓”到“抓得好”再到“像人一样灵巧操作”的巨大鸿沟。最近我们团队在Mercury X1人形机器人平台上深入探索了一系列超越基础抓取的进阶技术。Mercury X1以其开源、模块化和相对亲民的成本成为了研究灵巧操作的绝佳平台。这次分享我想聊聊我们是如何让这台机器人从“笨拙地夹取”进化到“稳定、自适应且具备初步触觉反馈的精细操作”的。无论你是机器人学的研究者、工程师还是对前沿技术感兴趣的开发者这些从实际项目中踩坑总结出的思路和实现细节或许能给你带来一些启发。2. 为什么基础抓取在真实场景中“不够用”在开始讲进阶技术之前我们必须先理解基础抓取方案的局限性。大多数入门教程或Demo展示的抓取通常基于一个理想化的假设目标物体是刚性的、形状规则且已知的环境是结构化的、光照恒定的。基于这些假设我们可以采用“感知-规划-执行”的经典流程用深度相机获取点云通过算法如GPD、GraspNet生成几个候选抓取位姿然后规划机械臂运动轨迹最后执行。这套流程在实验室里抓取一个放在空旷桌面上的方块或杯子效果往往不错。然而一旦进入非结构化环境问题就接踵而至。比如目标物体可能是非刚性或易变形的一个装满东西的塑料袋、一个毛绒玩具。表面光滑或反光的一个不锈钢保温杯、一个玻璃瓶。这会导致深度相机点云数据严重缺失或噪声极大。被部分遮挡或堆叠的从一堆杂物中取出某个特定物品。需要特定姿态抓取的抓取一把螺丝刀的柄部而非头部抓取一本书的侧面而非封面。更关键的是“抓取”本身不是目的后续的“操作”才是。比如抓取螺丝刀是为了拧螺丝抓取水杯是为了倒水抓取零件是为了装配。基础抓取方案只关心“握紧”的瞬间而忽略了抓取姿态对后续操作任务的巨大影响。一个不合适的初始抓取姿态会让后续的操作变得极其困难甚至不可能。因此进阶抓取技术的核心目标就是让机器人具备应对不确定性、适应物体特性、并为后续操作任务进行优化的能力。下面我将结合我们在Mercury X1上的实践分几个层面来拆解这些技术。3. 感知升级从“看见”到“理解”与“触觉”可靠的抓取始于精准的感知。当视觉尤其是深度视觉在复杂条件下失效时我们必须引入更多维度的信息。3.1 多模态感知融合视觉、触觉与力觉单纯依赖RGB-D相机在应对透明、反光、纹理单一物体时是脆弱的。我们的策略是进行多模态融合。视觉层面我们不仅使用Mercury X1头部的深度相机还在其手腕末端加装了一个小型、轻量的Eye-in-Hand相机。头部相机提供全局场景理解而手眼相机能在接近物体时提供无遮挡、高分辨率的局部视图。通过手眼标定我们可以将手眼相机看到的特征点与机械臂的末端位姿、以及头部相机的全局点云进行融合。当全局点云中某个区域如玻璃表面数据缺失时手眼相机在近距离拍摄的RGB图像可以通过深度学习模型如DPT for depth prediction预测出相对深度补全局部点云信息。触觉与力觉层面这是实现“灵巧”的关键。我们在Mercury X1的灵巧手或夹爪指尖集成了低成本但有效的触觉传感器。一种实用的方案是使用基于视觉的触觉传感器如GelSight或TacTip的简化版本。它们的基本原理是在弹性体硅胶表面覆盖带有纹理的皮肤内部用微型摄像头观察皮肤在接触物体时的形变。通过分析形变图像可以高精度地估计接触点的位置、法向力、甚至微小的切向滑移。# 伪代码示例一个简单的触觉图像处理流程基于OpenCV def process_tactile_image(raw_image): # 1. 图像预处理去噪、增强对比度 processed cv2.GaussianBlur(raw_image, (5,5), 0) processed cv2.convertScaleAbs(processed, alpha1.5, beta0) # 2. 特征提取例如计算光流或特征点位移需要连续帧 # 这里假设我们通过背景差分法获取接触区域 gray cv2.cvtColor(processed, cv2.COLOR_BGR2GRAY) _, mask cv2.threshold(gray, 30, 255, cv2.THRESH_BINARY) # 3. 计算接触区域质心作为接触点位置估计 M cv2.moments(mask) if M[m00] ! 0: cX int(M[m10] / M[m00]) cY int(M[m01] / M[m00]) contact_center (cX, cY) else: contact_center None # 4. 简化通过接触区域面积变化粗略估计法向力 contact_area cv2.countNonZero(mask) normal_force_estimate contact_area * calibration_factor return contact_center, normal_force_estimate融合策略在抓取过程中我们建立了一个以物体为中心的概率状态估计。视觉提供物体的初始位姿和大致形状先验。当机械手开始接近并接触物体时触觉信息开始更新这个估计。例如指尖接触到的局部曲率可以反过来修正对物体形状的认知检测到的滑移信号可以触发抓握力的调整。这种“视觉引导触觉确认与修正”的闭环极大地提升了在感知不确定条件下的抓取成功率。实操心得一传感器标定是基础中的基础。手眼标定Eye-in-Hand Calibration的精度直接影响局部感知融合的准确性。我们采用经典的Tsai-Lenz方法并制作了高精度的标定板在机械臂多个姿态下采集数十组数据确保标定误差在毫米级。触觉传感器的标定则更“物理”需要建立像素位移与实际力/力矩的映射关系这通常需要一个精密的力传感器作为基准进行数据采集。3.2 基于学习的抓取点生成从几何到语义传统抓取生成算法严重依赖完整的几何模型。当点云不完整时效果大打折扣。我们采用了基于深度学习的抓取检测方法。我们使用了一个在大量合成与真实数据上预训练的抓取检测网络如GG-CNN的改进版本或基于Transformer的模型。这个网络的输入不再是完整的点云而是多视角的RGB-D图像片段甚至是单目RGB图像。输出是对图像中每个可能抓取位置的质量评分、抓取宽度、抓取角度夹爪姿态的预测。关键在于我们将任务语义引入了抓取点选择。例如对于“倒水”任务我们不是简单地寻找杯子上最容易抓取的位置而是寻找一个有利于后续倾倒动作的抓取点如靠近杯子上沿的侧面。我们在训练数据中不仅标注了“可抓取性”还为不同物体标注了“功能部位”如杯柄、刀柄、扳手的开口。在网络训练时增加了一个辅助输出头用于预测抓取点所属的功能类别。在规划时任务规划器会先指定“需要抓取物体的哪个功能部位”然后抓取检测网络会在对应的功能区域生成质量最高的抓取建议。# 伪代码示例结合任务语义的抓取选择 class TaskAwareGraspSelector: def __init__(self, grasp_net_model, task_knowledge_base): self.grasp_net grasp_net_model self.task_kb task_knowledge_base # 例如{cup: {pour: handle_side, handover: body}} def select_grasp(self, rgbd_image, object_class, intended_task): # 1. 网络预测所有候选抓取 all_grasp_candidates self.grasp_net.predict(rgbd_image) # 2. 从知识库中获取该物体-任务对应的功能区域偏好 preferred_region self.task_kb.get(object_class, {}).get(intended_task, None) # 3. 过滤和排序候选抓取 filtered_grasps [] for grasp in all_grasp_candidates: grasp_region self._estimate_grasp_region(grasp, object_class) if preferred_region is None or grasp_region preferred_region: # 计算综合得分抓取质量分 任务适配度分 task_score self._compute_task_compatibility(grasp, intended_task) total_score grasp.quality * 0.7 task_score * 0.3 filtered_grasps.append((grasp, total_score)) # 4. 返回得分最高的抓取 if filtered_grasps: best_grasp max(filtered_grasps, keylambda x: x[1])[0] return best_grasp else: # 如果没有符合任务区域的抓取则退回仅基于质量的抓取 return max(all_grasp_candidates, keylambda x: x.quality)4. 规划与控制从“开环执行”到“自适应闭环”有了好的抓取建议如何稳定、安全地执行是另一个挑战。我们摒弃了“规划一条轨迹然后盲目执行”的开环模式转向了基于实时感知反馈的自适应闭环控制。4.1 柔顺控制与阻抗控制的应用在接触物体的一瞬间纯粹的位姿控制是危险的极易导致碰撞、挤压甚至损坏物体或机器人。我们为Mercury X1的末端执行器引入了阻抗控制。你可以把阻抗控制想象成让机械手末端具有“虚拟的弹簧和阻尼”特性。我们为末端设定一个目标位置即理想的抓取点但同时设定一组阻抗参数刚度K和阻尼D。当机械手接触物体时如果实际位置与目标位置有偏差产生了接触力阻抗控制器不会强行修正这个位置误差而是会根据设定的刚度产生一个与之成正比的“回复力”同时阻尼项吸收冲击能量。这样机械手就能以“柔顺”的方式贴合物体的表面适应微小的定位误差和物体表面的不规则性。在Mercury X1上我们通常在到达抓取点前的一段距离切换为阻抗控制模式。具体参数刚度K需要根据物体特性调整抓取一个鸡蛋需要很低的刚度非常柔顺而抓取一个沉重的扳手则需要较高的刚度更刚硬。4.2 抓取力闭环调节告别“握碎”或“掉落”抓取力控制是灵巧操作的灵魂。固定不变的抓取力要么导致物体滑落要么导致物体变形损坏。我们基于触觉传感器反馈实现了一个动态的抓取力调节闭环。其核心逻辑是一个状态机预抓取阶段以较快的速度接近目标抓取位置抓取器微微张开。初始接触阶段触觉传感器检测到接触信号控制器切换为低速高精度模式同时开始缓慢增加抓取力。握紧阶段持续监测两个关键信号法向力和滑移信号。法向力确保达到最小稳定抓取力阈值。触觉图像中的特征点如果发生持续的、定向的移动则表明物体正在滑移。这是最需要关注的信号。滑移补偿一旦检测到滑移控制器会以一个小增量ΔF增加抓取力直到滑移停止。同时为了防滑可以命令手指做一个微小的“再握紧”动作增加包裹度。维持阶段保持一个略高于滑移阈值的抓取力并持续监控。如果因为物体重量或外部扰动导致滑移再次发生则重复补偿过程。# 伪代码示例基于触觉反馈的抓取力闭环控制 class TactileGraspForceController: def __init__(self, min_force, max_force, force_increment, slip_detector): self.current_force min_force self.min_f min_force self.max_f max_force self.force_inc force_increment self.slip_detector slip_detector self.gripper GripperInterface() def execute_grasp(self): self.gripper.move_to_pregrasp() self.gripper.set_force(self.min_f) self.gripper.close() while not self.grasp_is_secure(): tactile_data get_tactile_sensor_data() is_slipping, slip_vector self.slip_detector.detect(tactile_data) if is_slipping and self.current_force self.max_f: # 检测到滑移增加抓取力 self.current_force self.force_inc self.gripper.set_force(self.current_force) print(fSlip detected! Increasing force to {self.current_force}N) # 可选执行一个微小的再握紧动作来增加摩擦 self.gripper.adjust_position_for_anti_slip(slip_vector) elif not is_slipping and self.current_force self.min_f some_margin: # 没有滑移且力较大可以尝试略微减小以节省能耗/避免损伤 self.current_force - self.force_inc * 0.5 self.gripper.set_force(self.current_force) time.sleep(control_loop_period) print(Grasp stabilized.) def grasp_is_secure(self): # 综合判断持续一段时间无滑移且抓取力在合理范围内 return self.stable_time threshold and self.min_f self.current_force self.max_f实操心得二滑移检测的阈值需要精细调节。触觉传感器检测到的“滑移”是一个相对信号阈值设得太低环境振动或传感器噪声都可能误触发导致抓取力不断攀升直至过大阈值设得太高则真正的滑移可能无法及时检测导致物体掉落。我们通过在平台上抓取不同材质砂纸、塑料、金属、布料的标准块记录其开始滑移时的触觉信号特征为不同物体类别设定了不同的初始阈值。这是一个需要大量实验积累的过程。5. 高级抓取策略应对复杂场景基础的自适应抓取解决了许多问题但对于一些特别棘手的场景需要更专门的策略。5.1 非刚性物体抓取拥抱变形抓取一个塑料袋或一件衣服最大的挑战在于物体在抓取过程中会发生大变形传统的刚体假设完全失效。我们的策略是“拥抱变化”。首先我们使用一个经过非刚性物体数据训练的抓取检测网络它更关注物体的整体轮廓和可抓取区域如提手、边缘而非精确的几何特征。规划时我们采用多阶段接触策略。例如抓取一件平铺的T恤第一次接触用两指捏起衣服肩部的一个点。拖拽与重整在保持捏取的状态下轻轻提起并抖动或移动让衣服在重力作用下自然下垂形成更易于抓取的形态比如让另一只袖子垂下。第二次接触另一只机械手或同一只手的另一个手指去抓取下垂部分形成的环状结构如袖口或下摆。协同握紧双手协同形成一个对非刚性物体更稳定的“包围式”抓取。整个过程高度依赖视觉跟踪衣服的轮廓变化和力觉感知拉扯的张力防止撕裂。控制算法需要非常“轻柔”允许较大的位置偏差并严格控制作用力。5.2 动态抓取与空中拦截这是抓取技术中的“高阶动作”要求机器人在物体运动过程中预测其轨迹并完成抓取。这在分拣、递送等场景很有用。实现动态抓取Mercury X1需要高速感知与预测视觉系统需要有高帧率如60fps以上并运行一个轻量化的目标跟踪算法如KCF或基于深度学习的SORT/DeepSORT实时估计物体的位置、速度和加速度。结合简单的物理模型如匀加速运动预测物体在未来几百毫秒内的运动轨迹。时间最优轨迹规划机械臂的轨迹规划器不再以最短路径为目标而是以“在预测的拦截点与物体相遇”为目标并且要考虑机器人的动力学约束最大速度、加速度。我们通常使用时间参数化的轨迹例如用五次多项式插值将路径点与时间关联确保机械手末端在精确的时刻到达精确的位置。抓取时机闭环控制在接近拦截点的最后阶段切换到直接力控制或高增益位置控制以补偿预测误差。触觉传感器用于确认抓取成功的瞬间。实操心得三动态抓取的仿真至关重要。在真实机器人上调试动态抓取既危险又低效。我们大量使用Gazebo或MuJoCo仿真环境在其中模拟物体以不同初速度、角度抛出的场景反复调试跟踪算法、预测模型和轨迹规划器的参数。只有在仿真中达到高成功率90%后才会迁移到真实的Mercury X1上进行少量验证性实验。仿真能极大加速迭代周期并避免硬件损坏。6. 从抓取到操作抓取姿态的优化最后我们回到最初的观点抓取是为操作服务的。一个优秀的抓取规划必须考虑后续的操作任务。我们引入了任务兼容性抓取度量。在评估一个候选抓取姿态时除了传统的稳定性度量如力闭合指数我们还计算以下因素操作灵巧度抓取后机械手/腕部还有多少可用的运动空间工作空间来执行后续任务例如抓取螺丝刀时如果抓握点太靠近尖端手腕可能没有足够的空间来旋转拧螺丝。避障性以该姿态抓取物体后在移动到操作目标位姿如拧螺丝的位置的路径上是否容易发生碰撞力传递效率对于需要施加力的任务如撬动、扳拧抓取姿态是否能有效地将手部力传递到工具的功能部位我们在抓取规划器中将上述任务兼容性指标与基础抓取质量指标进行加权融合选择综合得分最高的抓取。这本质上是一个多目标优化问题。在实践中我们通常采用分层筛选的方法先用基础质量指标筛选出前K个稳定抓取再在这K个抓取中用任务指标进行排序选择。例如让Mercury X1“抓取马克笔并拔掉笔帽”视觉识别出马克笔和笔帽。抓取检测网络生成笔身上多个稳定的抓取点。任务规划器指定“后续需要沿笔杆轴向施加拉力”。抓取选择器会优先选择抓取笔的尾端而非中部因为这样在拔笔帽时能提供更长的力臂且手腕姿态更自然。同时它会评估抓取尾端后手部是否会与笔帽或桌面碰撞。通过将操作任务的需求前馈到抓取决策环节我们显著提高了机器人执行复杂操作流程的一次成功率。让机器人“抓得好”是一个永无止境的优化过程。在Mercury X1这个平台上我们从多模态感知融合、自适应闭环控制、到高级抓取策略和任务导向优化一步步地搭建起了这套进阶抓取技术栈。每一个环节都充满了工程细节的打磨和算法参数的调优。最大的体会是没有“银弹”必须根据具体的物体、任务和环境灵活地组合和调整这些技术模块。这套框架目前已经能让我们机器人稳定地处理实验室中大部分常见的抓取任务并为更复杂的双手操作、工具使用打下了坚实的基础。下一步我们正在探索如何将强化学习引入到抓取策略的自适应优化中让机器人能通过自主尝试学会应对从未见过的新奇物体。这条路很长但每一次让机器人更“灵巧”一点都让人兴奋不已。
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门