ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

叠衣服为何成为机器人技术试金石?从感知到规划的全链路解析

叠衣服为何成为机器人技术试金石?从感知到规划的全链路解析 如果你最近关注机器人领域的新闻可能会发现一个有趣的现象像 Figure AI、1X 这类估值动辄数十亿美元的明星机器人公司都在不约而同地展示一个看似“简单”的技能——叠衣服。这听起来有点“大材小用”。毕竟这些公司背后是顶尖的 AI 模型、复杂的机械臂和精密的传感器目标是为人类提供通用劳动力。为什么它们会把宝贵的研发资源和宝贵的公众演示机会押注在叠衣服这件家务事上这绝不是一个偶然的营销噱头。叠衣服正成为检验“具身智能”能否真正走进家庭、实现商业化的“试金石”和“分水岭”。它表面上是一个简单的任务背后却集成了机器人技术当前面临的最核心挑战非结构化环境感知、柔性物体操作、长序列任务规划以及人机安全共处。本文将为你深入拆解为什么“叠衣服”这个场景如此关键它背后隐藏着哪些技术深水区以及这对我们开发者、研究者和技术爱好者意味着什么。我们不仅会探讨其技术内涵还会分析其商业逻辑并提供一个基于开源工具如 ROS、PyBullet的简易仿真环境搭建指南让你能亲手体验这个“简单”任务背后的复杂性。1. 叠衣服为什么它是家用机器人的“圣杯”级挑战在讨论具体技术前我们必须先建立一个共识叠衣服的难度远超工业场景中的“拧螺丝”或“码垛”。工业机器人如 ABB、库卡的成功建立在高度结构化的环境上。工作台位置固定零件形状、重量、材质已知光照恒定任务流程可精确编程。这是一个“封闭世界”问题。而家庭环境是一个典型的“开放世界”物体非刚性且可变形一件 T 恤在被抓取、提起、铺平、折叠的过程中其形状、质心、刚度时刻在变化。感知高度不确定衣服可能皱成一团部分被其他物品遮盖颜色、纹理多样且受光照、阴影影响大。操作需极高灵巧性需要多种抓取策略捏、抓、托、柔顺控制以避免撕扯以及利用环境如桌面辅助操作。任务序列长且需实时规划“识别衣服 - 定位关键点领口、袖口- 展开 - 抚平 - 对齐边角 - 执行折叠动作 - 放置整齐”其中任何一步失败都可能需要回退或重新尝试。因此当 Figure AI 或 1X 的机器人流畅地完成叠衣服时它实际上向外界传递了一个强信号我们的机器人在感知、规划和控制这三个核心模块上已经具备了处理高度非结构化、长周期任务的能力。这比展示行走、握手、递咖啡更具技术说服力。从商业角度看选择叠衣服也极具智慧场景普适性全球每个家庭都有此需求市场想象空间巨大。价值感知直接用户能立刻理解机器人带来的便利比抽象的技术参数更有冲击力。技术展示全面一次演示涵盖了计算机视觉、强化学习、运动规划、力控等多个前沿领域。安全要求高与柔软衣物互动天然地降低了公众对机器人“危险、笨重”的恐惧更易被家庭接受。2. 核心技术拆解从“看到”到“叠好”的全链路要完成叠衣服一个机器人系统需要打通以下技术链条每一环都是当前的研究热点。2.1 环境感知与状态估计这是第一步也是基础。机器人需要“看懂”桌面上那堆布料是什么。传感器融合通常结合 RGB 相机获取颜色、纹理、深度相机获取 3D 点云和可能的触觉传感器。基于 ROS 的机器人常使用RGBD话题来同步处理图像和深度信息。语义分割与关键点检测模型需要从杂乱的点云或图像中分割出“衣服”这个物体并进一步识别出“领口”、“袖口”、“下摆”等语义关键点。这通常需要训练一个深度学习模型如基于 PointNet 的点云分割或基于 CNN 的图像分割。状态估计即使识别出关键点衣服的“褶皱状态”和“展开程度”也是连续变量需要被估计出来以指导下一步的“展开”动作。2.2 抓取与操作规划知道衣服在哪之后怎么去拿柔性物体抓取点生成与抓取刚性物体计算稳定抓取力封闭不同抓取衣服更关注如何能有效提起并控制其姿态。算法需要生成多个可能的抓取点如两个袖口、肩部并评估抓取后的预测状态。运动规划机械臂需要无碰撞地运动到抓取点。在家庭拥挤环境中这需要高效的路径规划算法如RRT*,CHOMP。在 ROS 中可以使用MoveIt!框架来完成这一任务。柔顺与力控抓取时不能太用力会捏坏也不能太松会掉落。需要力/力矩传感器和阻抗控制、导纳控制等算法让机械臂表现得像人的手一样“柔顺”。2.3 折叠动作序列与技能学习这是最体现“智能”的部分。如何将“铺平的衣服”变成“叠好的衣服”任务与运动规划折叠可以分解为一系列子动作pickplaceflip。高层任务规划器决定子动作的顺序底层运动规划器为每个子动作生成轨迹。这通常是一个分层规划问题。模仿学习与强化学习让机器人自己通过试错强化学习来学会叠衣服成本极高。目前更可行的路径是模仿学习先通过人类演示遥操作收集数据机器人学习其中的策略。强化学习则可用于在仿真环境中微调和优化策略使其更鲁棒。这正是许多公司如宇树科技在 G1 人形机器人上使用 Soft Actor-Critic 等算法优化 PPO采用的方法。仿真到真实迁移在真实机器人上训练既危险又昂贵。因此研究者在PyBullet、MuJoCo、Isaac Sim或ROSGazebo中构建高保真物理仿真环境训练智能体再将策略迁移到真机。衣服的物理属性质量、摩擦、弹性建模是仿真中的一大难点。3. 动手实践在仿真中搭建一个简易的“叠衣服”训练环境我们无法拥有 Figure 或 1X 的顶级硬件但可以在仿真中理解其核心逻辑。下面我们将使用PyBullet和Python搭建一个极度简化的二维“叠毛巾”仿真环境用于理解任务规划和强化学习的基本流程。环境准备Python 3.8必要库pybullet,numpy,opencv-python,gym(可选用于强化学习接口)3.1 初始化仿真世界首先我们创建一个物理世界并加载一个平面桌子和一个可变形物体的简化替代品我们用两个连接的可移动矩形块来模拟毛巾。# 文件sim_env.py import pybullet as p import pybullet_data import time import numpy as np class ClothFoldingEnv: def __init__(self, guiTrue): # 连接物理引擎 if gui: self.physicsClient p.connect(p.GUI) else: self.physicsClient p.connect(p.DIRECT) p.setAdditionalSearchPath(pybullet_data.getDataPath()) p.setGravity(0, 0, -9.8) # 加载地面桌子 self.planeId p.loadURDF(plane.urdf) # 创建一个简化的“毛巾”两个用滑动关节连接的矩形块 # 第一个矩形块代表毛巾的一部分 base_pos [0, 0, 0.1] base_ori p.getQuaternionFromEuler([0, 0, 0]) self.part1 p.loadURDF(cube_small.urdf, base_pos, base_ori) p.changeVisualShape(self.part1, -1, rgbaColor[0.8, 0.3, 0.3, 1]) # 红色 # 第二个矩形块代表毛巾的另一部分 part2_pos [0.2, 0, 0.1] # 初始与 part1 分开 self.part2 p.loadURDF(cube_small.urdf, part2_pos, base_ori) p.changeVisualShape(self.part2, -1, rgbaColor[0.3, 0.3, 0.8, 1]) # 蓝色 # 创建一个简单的“机械臂末端执行器”一个球体 self.ee_pos [0.5, 0, 0.5] self.ee p.loadURDF(sphere_small.urdf, self.ee_pos, base_ori) p.changeVisualShape(self.ee, -1, rgbaColor[0, 1, 0, 1]) # 绿色 # 定义“叠好”的目标状态两个块上下对齐 self.goal_state np.array([0.0, 0.0, 0.05, 0.0, 0.0, 0.15]) def get_observation(self): 获取环境状态两个块的位置 末端位置 pos1, _ p.getBasePositionAndOrientation(self.part1) pos2, _ p.getBasePositionAndOrientation(self.part2) pos_ee, _ p.getBasePositionAndOrientation(self.ee) # 简化只返回位置x,y,z state np.array([pos1[0], pos1[1], pos1[2], pos2[0], pos2[1], pos2[2], pos_ee[0], pos_ee[1], pos_ee[2]]) return state def step(self, action): 执行动作action 为末端执行器在x,y,z方向上的位移增量 # 动作空间delta_x, delta_y, delta_z dx, dy, dz action current_pos, _ p.getBasePositionAndOrientation(self.ee) new_pos [current_pos[0] dx, current_pos[1] dy, current_pos[2] dz] p.resetBasePositionAndOrientation(self.ee, new_pos, [0, 0, 0, 1]) # 模拟物理 for _ in range(10): p.stepSimulation() if self.gui: time.sleep(1./240.) # 计算奖励鼓励 part2 移动到 part1 上方 pos1, _ p.getBasePositionAndOrientation(self.part1) pos2, _ p.getBasePositionAndOrientation(self.part2) # 简单奖励负的欧氏距离距离越小奖励越大 reward -np.linalg.norm(np.array(pos2) - (np.array(pos1) [0, 0, 0.1])) # 判断是否完成简化 done (reward -0.05) # 距离足够近则认为完成 return self.get_observation(), reward, done, {} def reset(self): 重置环境 p.resetBasePositionAndOrientation(self.part1, [0,0,0.1], [0,0,0,1]) p.resetBasePositionAndOrientation(self.part2, [0.2,0,0.1], [0,0,0,1]) p.resetBasePositionAndOrientation(self.ee, [0.5,0,0.5], [0,0,0,1]) return self.get_observation() # 测试环境 if __name__ __main__: env ClothFoldingEnv(guiTrue) obs env.reset() for i in range(200): # 随机动作 action np.random.uniform(-0.05, 0.05, size3) obs, reward, done, _ env.step(action) print(fStep {i}, Reward: {reward:.4f}) if done: print(Task Completed!) break p.disconnect()这段代码创建了一个可视化仿真环境。绿色球体是“机械手”红蓝两个方块代表待折叠的“毛巾”的两部分。目标是用绿球推动蓝块到红块的正上方。这模拟了折叠中“对齐”这一关键子任务。3.2 实现一个简单的 Q-Learning 智能体接下来我们用一个经典的强化学习算法让智能体学习如何完成这个对齐任务。为了简化我们将连续状态空间离散化。# 文件simple_agent.py import numpy as np import pickle class QLearningAgent: def __init__(self, state_space_size, action_space_size, learning_rate0.1, discount_factor0.95, exploration_rate0.1): self.q_table np.zeros((state_space_size, action_space_size)) self.lr learning_rate self.gamma discount_factor self.epsilon exploration_rate self.action_space action_space_size def discretize_state(self, continuous_state): 将连续状态9维离散化为一个索引极度简化仅用于演示 # 这里是一个极其粗糙的离散化只取 part2 和 ee 在 x 轴上的相对位置 part2_x continuous_state[3] ee_x continuous_state[6] diff part2_x - ee_x # 离散为3个区间ee在左接近在右 if diff -0.1: return 0 elif abs(diff) 0.1: return 1 else: return 2 def choose_action(self, state): epsilon-greedy 策略选择动作 state_idx self.discretize_state(state) if np.random.uniform(0, 1) self.epsilon: # 探索随机选择动作 return np.random.randint(0, self.action_space) else: # 利用选择 Q 值最大的动作 return np.argmax(self.q_table[state_idx]) def learn(self, state, action, reward, next_state, done): Q-learning 更新规则 state_idx self.discretize_state(state) next_state_idx self.discretize_state(next_state) current_q self.q_table[state_idx, action] if done: target_q reward else: target_q reward self.gamma * np.max(self.q_table[next_state_idx]) # Q-table 更新 self.q_table[state_idx, action] self.lr * (target_q - current_q) def save(self, filename): with open(filename, wb) as f: pickle.dump(self.q_table, f) def load(self, filename): with open(filename, rb) as f: self.q_table pickle.load(f) # 训练循环主程序 def train_agent(episodes500): from sim_env import ClothFoldingEnv env ClothFoldingEnv(guiFalse) # 训练时关闭GUI更快 # 动作空间我们简化为5个离散动作上、下、左、右、不动 # 对应末端执行器的位移 action_map { 0: [0, 0, 0.05], # 上 1: [0, 0, -0.05], # 下 2: [-0.05, 0, 0], # 左 3: [0.05, 0, 0], # 右 4: [0, 0, 0] # 不动 } agent QLearningAgent(state_space_size3, action_space_size5) for episode in range(episodes): state env.reset() total_reward 0 done False steps 0 while not done and steps 100: action_idx agent.choose_action(state) action action_map[action_idx] next_state, reward, done, _ env.step(action) agent.learn(state, action_idx, reward, next_state, done) state next_state total_reward reward steps 1 if episode % 50 0: print(fEpisode {episode}, Total Reward: {total_reward:.2f}, Steps: {steps}) agent.save(q_table.pkl) print(Training finished. Q-table saved.) return agent if __name__ __main__: trained_agent train_agent(episodes300)这个智能体通过不断试错学习在哪种状态蓝块相对于绿球的位置下采取哪种移动方向能获得更高奖励即让蓝块更靠近红块上方。3.3 运行与验证训练结果训练完成后我们可以加载模型并可视化智能体的表现。# 文件test_agent.py from sim_env import ClothFoldingEnv from simple_agent import QLearningAgent import time def test_agent(): env ClothFoldingEnv(guiTrue) # 测试时打开GUI agent QLearningAgent(state_space_size3, action_space_size5) agent.load(q_table.pkl) action_map { 0: [0, 0, 0.05], 1: [0, 0, -0.05], 2: [-0.05, 0, 0], 3: [0.05, 0, 0], 4: [0, 0, 0] } state env.reset() done False total_reward 0 steps 0 while not done and steps 50: state_idx agent.discretize_state(state) action_idx np.argmax(agent.q_table[state_idx]) # 直接选择最优动作 action action_map[action_idx] next_state, reward, done, _ env.step(action) state next_state total_reward reward steps 1 time.sleep(0.1) # 慢放观察 print(fTest finished. Total Reward: {total_reward:.2f}, Steps: {steps}) if done: print(Agent successfully aligned the blocks!) else: print(Agent failed to complete the task within step limit.) p.disconnect() if __name__ __main__: test_agent()运行test_agent.py你将看到绿色球体机械手自动移动尝试将蓝色方块推到红色方块上方。虽然这个仿真极度简化但它清晰地展示了“感知-决策-控制”的闭环以及强化学习如何让智能体通过奖励信号学会完成一个目标明确的子任务。4. 从仿真到现实的鸿沟与真实系统的复杂性我们的仿真玩具揭示了基本逻辑但与 Figure、1X 面临的真实挑战相比差距如同小溪与海洋状态表示我们用两个方块的位置代替了衣服的连续变形状态。真实系统需要处理高维点云或图像。动作空间我们的动作是简单的位移。真实机械臂有 6-7 个关节动作空间是连续且高维的。物理仿真PyBullet对柔软、薄壳物体的仿真仍不完美。衣服的摩擦、弹性、自重导致的形变非常复杂。工业界和学术界正在努力提升物理仿真的保真度。感知-控制闭环我们的仿真中状态是直接获取的。现实中需要通过摄像头实时识别、跟踪衣服的形态存在延迟和噪声。长序列规划我们只解决了“对齐”一个子任务。完整的叠衣服包含多个子任务需要更高级的任务规划器如基于 LLM 的规划来编排。5. 对开发者与学习者的启示技能模块化是方向叠衣服这类复杂任务会被分解为“抓取”、“铺平”、“对齐”、“折叠”等可复用的基础技能库。作为开发者可以专注于其中某一个技能如基于视觉的柔性物体抓取进行深耕。仿真优先策略在机器人领域Sim2Real仿真到现实迁移已成为核心工作流。掌握ROS/Gazebo、Isaac Sim、PyBullet等仿真工具并了解如何构建高保真仿真环境、添加传感器噪声、进行域随机化是至关重要的能力。多学科知识融合机器人学是机械、电子、计算机、控制、AI 的交叉点。除了经典的机器人学运动学、动力学、控制理论现在还需要熟悉深度学习CV、RL、强化学习以及大语言模型在任务规划中的应用。关注开源项目与数据集例如Facebook的DexNet数据集专注于抓取UC Berkeley的SoftGym提供可变形物体操作仿真环境。参与这些社区项目是快速提升的途径。6. 总结叠衣服背后的产业信号当顶尖机器人公司纷纷展示叠衣服时他们不仅仅在演示一个功能而是在传递清晰的产业信号技术拐点已至感知、规划和控制的进步使得处理家庭环境中非结构化任务成为可能。商业化路径清晰从工业场景已知、固定迈向家庭服务场景未知、动态叠衣服是一个完美的技术验证和市场需求结合点。软件定义机器人未来的竞争核心不再是硬件虽然很重要而是其内部的“大脑”——AI 算法、数据闭环和软件生态。对于我们技术人而言这意味着一波新的机遇。无论是深入机器人操作系统ROS 2、研究强化学习与模仿学习算法还是专注于特定传感器如触觉、3D视觉的融合应用都大有可为。理解“叠衣服”背后的技术栈就是理解了下一代服务机器人核心竞争力的钥匙。建议收藏本文从文中的简化仿真代码入手逐步扩展到更复杂的仿真环境如用trimesh加载真实衣服模型用stable-baselines3尝试更先进的 PPO 算法你将对“具身智能”这个激动人心的领域有更深刻、更实操层面的认识。真正的挑战和乐趣才刚刚开始。
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进