资讯动态

Skild S1机器人基础模型:视频即提示词的机器人控制新范式

发布时间:2026/8/29 15:50:00 来源:尧图企业网站定制
1. 背景与核心概念1.1 为什么“机器人基础模型”突然火了过去几年大语言模型LLM在文本、代码、图像领域取得了巨大进展但机器人领域一直面临一个尴尬问题机器人很难像 ChatGPT 一样通过“和海量数据对话”来学会技能。传统机器人开发流程通常是这样的工程师为每个任务手工设计状态机或行为树。针对特定机械臂、特定物体、特定场景反复调参。换一个物体、换一个环境之前的逻辑可能全部失效。这种方式开发周期长、泛化能力弱而且每增加一个新任务都要重新写一套控制逻辑。机器人行业迫切需要一种新的范式能不能像训练大语言模型一样喂给机器人海量视频数据让它自己学会“看到什么就做什么”Skild S1 正是在这一背景下出现的机器人基础模型。它不再针对单一任务定制策略而是尝试构建一个通用的机器人“大脑”输入视频或视觉信号输出机器人可执行的动作指令。业内把这种交互方式形象地称为“视频即提示词”。就像 ChatGPT 把自然语言当作人与模型的交互接口一样Skild S1 尝试把视频变成人与机器人模型的交互接口。1.2 什么是基础模型Foundation Model在深入 Skild S1 之前先明确“基础模型”这个概念。基础模型并不是一个具体的算法而是一种“预训练大模型 下游适配”的开发范式先在海量通用数据上进行大规模预训练让模型学到通用的表征能力。再通过微调、提示词、少量示例等方式适配到具体任务。典型代表包括 NLP 领域的 GPT 系列、CV 领域的 CLIP、多模态领域的 GPT-4V 等。机器人基础模型则尝试把这种范式迁移到物理世界中模型通过学习大量机器人操作视频、人类演示视频、仿真数据理解“视觉输入”与“动作输出”之间的映射关系。1.3 Skild S1 解决的核心问题Skild S1 要解决的核心问题可以总结为三类泛化能力差传统模型换一个环境、换一个物体布局成功率就急剧下降。数据成本高机器人真实操作数据获取昂贵难以像文本数据那样规模化。任务定制繁琐每个新任务都需要重新设计奖励函数、采集数据、训练策略。Skild S1 的思路是通过大规模视频预训练让模型先理解“世界是怎么运作的”再通过少量视频示例或语言指令快速适配到新任务。用户只需要录制一段演示视频或者直接给出一段希望机器人模仿的视频模型就能生成对应的控制策略。从开发者的视角看Skild S1 带来的最大变化是机器人的开发从“写代码控制”逐渐转向“给视频示范”。这和我们使用大语言模型时从“写正则表达式”转向“写提示词”有相似的逻辑。2. 技术解读视频如何变成机器人指令2.1 “视频即提示词”的含义“视频即提示词”是 Skild S1 最核心的设计哲学。在传统 Prompt Engineering 中我们通过文字告诉大模型“你要做什么”。但在机器人场景中很多任务很难用文字精确描述比如“用左手把红色杯子端起来保持杯口朝上走到桌子另一边放下。”“把螺丝对准孔位以 30 牛米的扭矩拧紧但不要滑丝。”这些指令既涉及空间关系又涉及力控、速度、姿态等多个维度用文字描述要么太长要么不精确。而视频天然包含了这些信息位置、姿态、速度、时序、物体交互方式全部记录在像素变化中。Skild S1 的训练和推理都围绕视频展开在训练阶段模型大规模学习“人类/机器人操作视频 对应动作序列”的数据对。在推理阶段用户给出一段视频模型理解视频中的任务目标、物体状态、操作序列并生成当前机器人可以执行的动作策略。可以理解为视频既是任务描述提示词也是监督信号标准答案还是世界模型的学习素材。2.2 Skild S1 的整体架构从公开资料和技术趋势来看一个典型的机器人基础模型通常包含以下模块模块作用常见实现思路视觉编码器将视频帧转化为特征向量ViT、Video Transformer、预训练视觉模型时序建模理解动作先后顺序和因果关系Transformer、3D CNN、状态空间模型动作解码器将特征映射为机器人动作指令扩散策略、Actor-Critic 头、自回归动作生成指令对齐支持文本、视频、目标图像多模态输入Cross-Attention、对比学习、多模态融合Skild S1 的完整技术细节并未全部公开但可以确定的是它遵循“视觉输入 → 隐状态 → 动作输出”的端到端学习范式。与早期机器人学习算法如行为克隆相比Skild S1 的规模更大、数据来源更多样、泛化能力更强。2.3 与语言模型提示词的区别很多读者会问既然叫“视频即提示词”那它和 GPT-4V 这种多模态模型有什么区别这里需要做一个关键区分多模态大语言模型如 GPT-4V主要输出文本或 bounding box它理解视频内容但不直接生成机器人底层控制指令。机器人基础模型如 Skild S1直接输出关节角度、末端位姿、力控信号等机器人可执行的动作。换句话说GPT-4V 是“看懂视频后告诉你该做什么”Skild S1 是“看懂视频后自己上手做”。这也是机器人基础模型和通用视觉语言模型最本质的区别。3. 环境准备与快速上手3.1 对硬件和系统的基本要求由于 Skild S1 是预训练好的机器人基础模型普通开发者更多是通过 API 或 SDK 进行调用而不是从零训练。这意味着如果你使用的是官方云服务本地不需要高性能 GPU只需要能跑 Python 脚本、发送 HTTP 请求即可。如果你需要本地部署推理则需要一块显存较大的 GPU。机器人基础模型推理通常比语言模型更吃显存因为需要同时处理视频流和动作序列。以下环境配置以“通过 SDK 调用、本地跑 Python 示例”为例项目建议操作系统Ubuntu 20.04 / 22.04Windows 11WSL2也可Python3.9 及以上依赖库requests、numpy、opencv-python网络可访问模型服务端点公司内网或公网 API可选 GPU模型部署方提供本地无需 GPU3.2 安装基础依赖如果只是调用远端服务环境准备非常简单。创建一个虚拟环境并安装依赖python3 -m venv skild_env source skild_env/bin/activate pip install requests numpy opencv-python如果你需要解析视频、抽帧、压缩视频后再传给模型opencv-python 和 numpy 是必不可少的工具。3.3 获取访问凭证与配置实际使用 Skild S1 时通常需要一个 API Key 或者服务端点地址。在开发阶段你可以先在本地创建配置文件config.yaml或环境变量统一管理访问信息export SKILD_API_KEYyour-api-key-here export SKILD_ENDPOINThttps://api.skild.example.com这里要特别提醒不要把 API Key 硬编码在代码里更不要提交到 Git 仓库。推荐使用.env文件配合python-dotenv加载或者在 CI/CD 中用密钥管理服务注入。3.4 最小可运行示例发送视频并获取动作指令先看一个最小调用示例这个示例的逻辑是读取本地视频文件发送到 Skild S1 服务端拿到模型返回的动作序列。# 文件路径demo_skild.py import os import requests import json def load_video(file_path: str) - bytes: 读取视频文件为二进制数据 with open(file_path, rb) as f: return f.read() def send_video_to_skild(video_bytes: bytes, api_key: str, endpoint: str): 发送视频到 Skild S1获取动作指令 headers { Authorization: fBearer {api_key}, } # 在实际项目中可能需要先上传视频获取 URL再传给模型。 # 这里展示的是直接上传的简化写法。 files {video: (demo.mp4, video_bytes, video/mp4)} resp requests.post(endpoint, headersheaders, filesfiles, timeout60) resp.raise_for_status() return resp.json() if __name__ __main__: api_key os.environ.get(SKILD_API_KEY) endpoint os.environ.get(SKILD_ENDPOINT) if not api_key or not endpoint: raise RuntimeError(请先设置 SKILD_API_KEY 和 SKILD_ENDPOINT) video load_video(demo.mp4) result send_video_to_skild(video, api_key, endpoint) print(json.dumps(result, ensure_asciiFalse, indent2))预期输出结构类似下面这样字段名以官方文档为准{ task_description: 将红色方块从左侧抓起放到右侧, action_sequence: [ { timestamp: 0.0, joint_positions: [0.1, 0.2, -0.3, 0.5, 0.0, 0.1], gripper: close }, { timestamp: 0.5, joint_positions: [0.2, 0.3, -0.4, 0.6, -0.1, 0.2], gripper: hold } ], confidence: 0.93 }在真实项目中action_sequence可能是更高频的关节轨迹、末端位姿序列也可能是目标位置的 waypoint。具体格式取决于模型版本和 SDK 封装。4. 深入核心代码视频预处理与推理流程4.1 视频抽帧与压缩机器人基础模型对视频输入通常有两个要求分辨率不要过大否则计算量飙升。帧率不要过高否则信息冗余。因此在实际调用前我们通常会对视频做预处理统一分辨率、调整帧率、裁剪关键片段。下面是一段基于 OpenCV 的视频预处理代码# 文件路径video_preprocess.py import cv2 def preprocess_video(input_path: str, output_path: str, target_width: int 640, target_fps: int 10): 将输入视频统一缩放并抽帧保存。 :param input_path: 原始视频路径 :param output_path: 输出视频路径 :param target_width: 目标宽度高度按比例缩放 :param target_fps: 目标帧率 cap cv2.VideoCapture(input_path) if not cap.isOpened(): raise IOError(f无法打开视频文件: {input_path}) orig_fps cap.get(cv2.CAP_PROP_FPS) orig_width int(cap.get(cv2.CAP_PROP_FRAME_WIDTH)) orig_height int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT)) target_height int(orig_height * (target_width / orig_width)) fourcc cv2.VideoWriter_fourcc(*mp4v) writer cv2.VideoWriter(output_path, fourcc, target_fps, (target_width, target_height)) frame_interval max(1, round(orig_fps / target_fps)) frame_idx 0 while True: ret, frame cap.read() if not ret: break if frame_idx % frame_interval 0: resized cv2.resize(frame, (target_width, target_height)) writer.write(resized) frame_idx 1 cap.release() writer.release() print(f预处理完成{output_path} f分辨率 {target_width}x{target_height} f帧率 {target_fps} FPS)这段代码的核心逻辑并不复杂读取原始视频、按帧间隔抽帧、统一分辨率最后重新编码输出。之所以要“抽帧”而不是删除帧是为了保证视频时间轴连续模型仍然能理解动作的先后顺序。4.2 推理封装把视频变成机器人指令在实际工程中我们不希望每次调用都重复写 HTTP 请求的细节。更推荐封装一个SkildClient类方便统一处理认证、超时、错误重试和结果解析。# 文件路径skild_client.py import os import time import requests import numpy as np class SkildClient: Skild S1 客户端封装 负责视频上传、任务提交、结果轮询等逻辑 def __init__(self, api_key: str, endpoint: str): :param api_key: API 密钥 :param endpoint: 服务端点地址 self.api_key api_key self.endpoint endpoint.rstrip(/) self.session requests.Session() self.session.headers.update({ Authorization: fBearer {api_key}, }) def submit_video(self, video_path: str, task_hint: str ) - str: 提交视频任务返回任务 ID :param video_path: 本地视频路径 :param task_hint: 可选的任务提示比如目标物体名称 :return: task_id with open(video_path, rb) as f: files {video: (os.path.basename(video_path), f, video/mp4)} data {} if task_hint: data[task_hint] task_hint resp self.session.post( f{self.endpoint}/v1/tasks, filesfiles, datadata, timeout30, ) resp.raise_for_status() return resp.json()[task_id] def get_result(self, task_id: str, timeout: int 120): 轮询任务结果 :param task_id: 任务 ID :param timeout: 最大等待时间单位秒 :return: 模型输出的动作序列 start time.time() while time.time() - start timeout: resp self.session.get( f{self.endpoint}/v1/tasks/{task_id}, timeout10, ) resp.raise_for_status() data resp.json() status data.get(status, pending) if status succeeded: return data.get(result, {}) elif status failed: raise RuntimeError( f任务失败: {data.get(error, unknown error)} ) time.sleep(2) raise TimeoutError( f等待任务结果超时task_id{task_id} ) def video_to_action(self, video_path: str, task_hint: str ): 一步完成视频 - 动作指令 task_id self.submit_video(video_path, task_hint) print(f任务已提交task_id{task_id}) result self.get_result(task_id) return result使用方式# 文件路径run_inference.py from skild_client import SkildClient import os client SkildClient( api_keyos.environ[SKILD_API_KEY], endpointos.environ[SKILD_ENDPOINT], ) # 先做视频预处理 from video_preprocess import preprocess_video preprocess_video(raw_demo.mp4, demo_processed.mp4) # 提交推理 result client.video_to_action( video_pathdemo_processed.mp4, task_hint将桌上的苹果放进蓝色盒子, ) # 打印动作序列 for i, action in enumerate(result[action_sequence]): print(fStep {i}: {action})封装的好处是后续如果服务端接口从“同步返回”改为“异步任务 轮询”只需要在SkildClient内部修改无需改动上层业务代码。4.3 动作序列如何映射到真实机器人拿到action_sequence之后还有一个关键步骤把通用动作指令映射到具体机器人的控制器。这一步通常由机器人厂商的 SDK 或 ROS 节点完成。假设你使用的是 ROS 1 MoveIt可以将动作序列中的末端位姿发布到目标话题由 MoveIt 规划运动轨迹# 文件路径action_to_robot.py # 这是一个 ROS 节点示例需要结合具体机器人 SDK 调整 import rospy import moveit_commander import numpy as np def execute_action_sequence(action_sequence): 将动作序列发送给 MoveIt 执行 :param action_sequence: Skild S1 输出的动作序列 moveit_commander.roscpp_initialize(sys.argv) rospy.init_node(skild_action_executor, anonymousTrue) arm moveit_commander.MoveGroupCommander(arm_group) gripper moveit_commander.MoveGroupCommander(gripper_group) for action in action_sequence: # 动作序列中的位置可能是关节角度也可能是笛卡尔坐标 # 这里假设是末端位姿 [x, y, z, roll, pitch, yaw] target_pose action[end_effector_pose] arm.set_pose_target(target_pose) plan arm.go(waitTrue) arm.stop() arm.clear_pose_targets() # 控制夹爪 if action[gripper] close: gripper.set_named_target(close) elif action[gripper] open: gripper.set_named_target(open) gripper.go(waitTrue) moveit_commander.roscpp_shutdown()需要提醒的是不同机械臂的坐标系、运动学参数、安全限位都不一样。拿到 Skild S1 的动作输出后必须经过机器人控制器的安全校验关节限位、速度限制、碰撞检测不能直接执行。尤其在真实物理环境里先使用仿真环境如 Gazebo、Isaac Sim验证动作序列再上真机是更稳妥的开发方式。5. 开发过程中的高频问题与排查思路5.1 视频上传后返回 413 错误问题现象常见原因解决思路请求返回 413 Payload Too Large视频文件过大超过服务端限制压缩视频、降低分辨率、截取关键片段排查步骤查看视频文件大小ls -lh demo.mp4。如果文件超过 50MB先压缩再上传。使用ffmpeg快速压缩ffmpeg -i demo.mp4 -vf scale640:-2 -r 10 -b:v 500k demo_small.mp45.2 任务一直停留在 pending 状态问题现象常见原因解决思路提交任务后长时间 pending视频队列拥堵或视频内容无法被模型识别查看任务详情确认输入视频是否清晰建议先检查视频中目标物体是否清晰可见。光照太暗、物体遮挡严重时模型可能无法提取有效特征。可以先用少量真实场景视频测试确认输入质量。5.3 模型输出的动作序列抖动问题现象常见原因解决思路动作序列中相邻时刻的关节角度跳变剧烈视频帧率过低或模型本身输出不平滑对动作序列做平滑滤波或提高输入视频帧率平滑示例# 文件路径smooth_action.py import numpy as np def smooth_action_sequence(actions, window_size3): 对动作序列做滑动窗口平均减少抖动 :param actions: 动作序列每个元素是 dict包含 joint_positions :param window_size: 平滑窗口大小 positions np.array([a[joint_positions] for a in actions]) smoothed np.zeros_like(positions) half_window window_size // 2 for i in range(len(positions)): start max(0, i - half_window) end min(len(positions), i half_window 1) smoothed[i] np.mean(positions[start:end], axis0) smoothed_actions [] for i, action in enumerate(actions): new_action dict(action) new_action[joint_positions] smoothed[i].tolist() smoothed_actions.append(new_action) return smoothed_actions不过要注意平滑处理虽然可以减少抖动但可能会降低动作的精确度。在需要高精度插拔、对准的任务中建议在仿真环境先验证平滑后的效果。5.4 本地如何验证模型效果在没有真实机器人的情况下可以用仿真平台验证。常见选择包括Isaac Sim / Isaac LabNVIDIA 提供适合机器人学习和仿真验证。MuJoCo轻量、快速适合控制策略验证。GazeboROS 生态集成度高适合完整机器人系统验证。流程一般是把 Skild S1 输出的动作序列转换为仿真环境中的目标位姿或关节角度然后在仿真中观察是否能完成指定任务。6. 工程落地建议与最佳实践6.1 不要试图用 Skild S1 替代传统控制算法机器人基础模型擅长的是高层任务理解和动作生成但在底层控制上PID、MPC、力控等传统算法仍然不可或缺。更合理的架构是Skild S1 生成高层动作意图目标位置、轨迹、抓取策略。传统控制算法负责底层执行关节伺服、力控、避障。这种“AI 决策规划 传统控制执行”的分层架构在可解释性、安全性和稳定性和方面都更友好。6.2 构建属于自己的“视频提示词”数据集如果你在特定场景比如流水线装配、医疗辅助、仓储分拣中使用 Skild S1建议积累专有视频数据。数据质量直接决定模型在你场景下的表现。以下是采集视频数据集时的核心建议每个任务至少录制 10~20 段不同角度、不同光照、不同物体摆放位置的演示视频。视频中要完整展示任务全过程最好不要裁剪掉关键动作。同时记录任务对应的文本描述方便后续做多模态微调。数据管理上建议使用版本化存储比如 DVCData Version Control避免视频数据集体积膨胀后无法回溯版本。6.3 配置管理与密钥安全和调用任何云端 AI 服务一样API Key 的管理容易踩坑。推荐以下做法使用环境变量或.env文件不要硬编码在代码中。在生产环境使用密钥管理服务如 Vault、KMS 等。定期轮换 API Key避免泄露后长期暴露风险。给 API Key 设置最小权限只允许访问 Skild S1 推理服务不授予管理权限。# 文件路径config.py import os from dotenv import load_dotenv load_dotenv() SKILD_API_KEY os.getenv(SKILD_API_KEY) SKILD_ENDPOINT os.getenv(SKILD_ENDPOINT) if not SKILD_API_KEY or not SKILD_ENDPOINT: raise ValueError(缺少必要的环境配置请在 .env 中配置 SKILD_API_KEY 和 SKILD_ENDPOINT)6.4 日志记录与可观测性在机器人应用中可观测性往往比模型精度还重要。当机器人执行失败时你不仅需要知道“失败了”还要知道模型输出了什么动作序列机器人实际执行到了哪一步视觉传感器当时看到的是什么画面因此建议在调用链路中增加结构化日志import logging import json logger logging.getLogger(skild) logger.setLevel(logging.INFO) handler logging.StreamHandler() handler.setFormatter(logging.Formatter( %(asctime)s | %(levelname)s | %(message)s )) logger.addHandler(handler) def log_task(task_id, video_path, result): log_entry { event: skild_inference, task_id: task_id, video_path: video_path, action_count: len(result.get(action_sequence, [])), confidence: result.get(confidence), } logger.info(json.dumps(log_entry, ensure_asciiFalse))同时建议保存每一段输入视频、对应的模型输出和机器人最终执行结果包括成功/失败状态这些数据未来也可以用于微调模型或分析失败原因。6.5 安全与合规边界机器人基础模型涉及物理世界操作安全边界比普通软件更严格。以下几类场景必须格外谨慎涉及人身安全机器臂活动范围内有人时必须配置安全围栏、急停开关、力矩限制。涉及精密操作不建议在真实设备上直接测试模型输出的原始动作先仿真验证。涉及权限控制确保不是任何人都能调用机器人接口服务端需要做身份鉴权、操作审计。涉及数据隐私输入视频可能包含敏感环境信息应当设置访问控制避免视频数据泄露。在开发环境中可以先使用模拟输入如公开数据集视频验证流程再逐步切换到自己录制的真实视频。6.6 性能优化技巧如果你需要在生产中高频调用 Skild S1可以关注以下几个优化点优化维度具体手段视频压缩降低分辨率到 640x480 或更低减少网络传输耗时关键帧提取只上传包含关键动作的视频片段而不是整段录像并发控制合理控制并发请求数避免触发服务端限流结果缓存相同或相似任务可以直接缓存结果避免重复推理异步处理使用任务队列提交视频前端轮询结果提升用户体验7. 总结从“写代码控制机器人”到“给视频示范机器人”Skild S1 和“视频即提示词”这种范式本质上是在改变机器人开发者与机器人之间的交互方式。过去我们描述一个机器人任务需要用行为树、状态机、控制代码把“拿起杯子”拆解成成百上千行逻辑。而现在只需要录制一段视频模型就能输出对应的动作序列。这种变化与当年从“手写正则表达式”到“用自然语言提示词”的变化非常相似。但也要清醒地看到机器人基础模型并不会让传统控制算法消失也不会让 ROS、MoveIt、仿真平台失去价值。恰恰相反基础模型越强大底层控制、安全机制、仿真验证的重要性就越高。毕竟文本模型输出错误可以重新生成而机器人一旦执行错误动作代价可能直接是设备损坏甚至人员受伤。对于开发者来说现在是最好的学习时机熟悉“视频 → 动作序列 → 机器人控制”这条新链路。掌握视频预处理、任务提交、结果解析、动作平滑这些通用工程能力。积累特定场景的视频数据集这将是未来最重要的资产。重视仿真验证和安全边界为真机落地做好准备。如果你对机器人基础模型的实际调用和经验感兴趣不妨先从一个小实验开始用手机录制一段 10 秒的物体搬运视频走通“视频预处理 → 模型推理 → 动作序列解析”这条流水线。再逐步加入仿真验证甚至尝试部署到真实的机器人平台上。这个过程能帮你快速理解新范式的核心逻辑也会让你在实际项目中少走很多弯路。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价