腿足机器人之二- 运动控制概览
腿足机器人之二运动控制概览
- 高层运动规划
- MPC
- RL
- 中层逆运动学和逆动力学
- 底层执行器控制
- 传感器校正
上一篇博客是腿足机器人的骨架和关节的机械和电气组件,关节不仅需要通过机械设计实现复杂的运动能力,还必须通过电子组件和控制系统来精确控制这些运动。
和人类类似,本篇博客介绍腿足机器人运动系统的设计,机器人关节的控制系统是其运动的大脑,负责解读传感器反馈并向执行器发送指令,以精确调节位置、速度和扭矩。这一系统由传感器、控制器和执行器共同工作,确保运动控制的准确性和效率。
腿足机器人的所有运动,最终都会反应在对关节的控制上,大体上关节的运动一般采用运动学和强化学习两类方法,如运动学逆解算法用于规划关节角度(如肘式/膝式腿的几何求解),强化学习(RL)优化步态生成,如NVIDIA Isaac Lab端侧部署方案。
机器人上的各个传感器连续监测关节的位置、速度及其他相关参数,并向控制器提供反馈。控制器将这一反馈与期望的设定值进行比较,生成纠正信号以调整关节的运动。这种反馈回路允许实时调整,确保关节即使在外部干扰或负载变化的情况下也能准确地遵循预定轨迹。
闭环控制系统提供高精度和稳定性,非常适合需要精确定位和运动控制的应用,如机器人手术和制造过程。
早期机器人运动控制以波士顿波力Spot机器人为典型代表,其采用的PD+前馈控制技术,可以见第三篇博客。
而当前较新主流腿足机器人运动控制以PD+MPC/强化学习为主,流程大致可以分为高层运动规划、中层逆运动学与逆动力学以及底层执行器控制三层。本篇博客先概览简要介绍各个部分,以建立top-down机器人运动控制的整体概念。
一个完整的动作流程大致如下:
传感器数据(IMU、关节编码器、力传感器)→ MPC规划/RL规划 → 逆运动学 → 关节目标角度 → PD控制器 → 电机驱动信号
高层运动规划
在接收到运动指令(行走、奔跑)之后,高层算法(模型预测控制(MPC)或者强化学习(RL)算法)负责全局规划,底层PD确保实时跟踪,两者协同实现动态运动。
MPC
在奔跑/行走的动作规划和控制中,高层运动规划模块主要完成步态生成和轨迹生成两部分。其运行频率在50-100Hz(每10-20ms规划一次)。
对于步态生成则可基于机器人动力学模型,滚动规划未来几步的质心(CoM)轨迹和足端接触力,确保动态平衡,在行走的时候,计算支撑多边形内的零力矩点(ZMP)位置,防止跌倒。躯干姿态和加速度可以使用IMU测量,足端接触力科使用六轴力传感器测量,关节的角度和速度使用关节编码器测量。
对于轨迹生成包括足端轨迹和质心轨迹,足端轨迹指的是规划摆动退的抛物线轨迹(奔跑时)或直线轨迹(行走时),质心轨迹是指通过简化模型(如倒立摆模型)生成质心高度和水平位置的变化曲线。
以ANYmal机器人为例

传感器数据--->MPC估计--->生成$\theta_{desired}$--->PD控制器--->电机驱动
- MPC层:每50ms计算一次未来0.5秒的足端轨迹和接触力
- PD层:以1kHz频率跟踪关节角度,公式:
τ = K p ( θ d e s i r e d − θ ) + K d ( θ ˙ d e s i r e d − θ ) \tau =K_p(\theta_{desired}-\theta) + K_d(\dot \theta_{desired}-\theta) τ=Kp(θdesired−θ)+Kd(θ˙desired−θ)
模型预测控制存在如下挑战:
| 挑战 | 解决方案 |
|---|---|
| 模型不准确 | 自适应控制(如在线参数估计) + 鲁棒PD参数 |
| 执行器延迟 | 提高控制频率 + 预测滤波(如卡尔曼滤波) |
| 地面接触突变 | 阻抗控制(调节PD的 K p K_p Kp为虚拟刚度, K d K_d Kd为虚拟阻尼) |
| 实时计算资源限制 | 简化模型(如单刚体模型) + 代码优化(定点运算、并行计算) |
| 齿轮箱背隙、电机饱和等非线性问题 | 通过前馈和抗饱和策略避免性能下降 |
| 多关节联动导致力矩耦合 | 结合解耦控制或全状态反馈(如LQR) |
| 地面反作用力突变 | 力传感器反馈 + 自适应阻抗控制(动态调整 K p K_p Kp, K d K_d Kd) |
RL
强化学习的目标是通过试错学习最优策略(Policy),其输出形式取决于具体任务和算法设计。在腿足机器人中,RL的输出通常分为两类:
| 输出类型 | 描述 | 示例 | 优点 | 缺点 |
|---|---|---|---|---|
| 直接关节控制 | RL策略直接输出各关节的目标角度或扭矩,无需中间计算 | 策略网络输出12个关节的目标角度(对应机器人自由度) | 1.无需依赖精确的动力学模型,RL通过仿真学习直接优化关节动作; 2.适合复杂动作(如翻滚、跳跃),传统模型难以精确建模 | 1. 需要大量训练数据,计算成本高 2.可解释性差,难以手动调整策略 |
| 高层指令生成 | RL输出末端执行器轨迹(如足端位置)或质心运动指令,需通过IK转换为关节角度 | RL规划足端轨迹,再通过逆运动学求解关节角度 | 1.结合传统控制方法(如IK),提高稳定性和可解释性 2.减少RL策略的复杂度(输出维度更低) | 依赖逆运动学求解的准确性,可能受模型误差影响 |
上面的两种在业界都有案例,比如OpenAI的Dactyl机械手通过RL直接控制关节扭矩实现灵活操作,而MIT Cheetah 3通过RL优化足端轨迹,再通过IK控制关节。也有在RL+IK的基础上再结合MPC的混合架构,如适应复杂地形的波士顿动力Atlas机器人。
RL方法的一个挑战是获得训练数据,在机器人行走之前,采集数据的成本是高昂的,所以一般训练都是先基于仿真环境,在在仿真中定义奖励函数(如前进速度、能量效率、姿态稳定性),然后通过PPO或SAC算法优化策略模型预测结果,然后再迁移到实际的环境中。
| 挑战 | 解决方案 |
|---|---|
| RL训练效率低 | 使用仿真-现实迁移(Sim2Real)技术,结合域随机化(Domain Randomization) |
| IK求解不唯一 | 引入优化目标(如最小能量、关节力矩平滑),通过QP求解唯一解 |
| 实时性不足 | 部署轻量化神经网络(如TinyML),推理加速框架tensorRT,或使用分层控制(高频PD + 低频RL更新) |
现代系统(如ANYmal、Unitree)倾向于结合RL高层规划与传统控制(IK+PD),兼顾学习能力与实时可靠性。
中层逆运动学和逆动力学
运动学关注的是机器人在不受外力影响时的运动状态,如位置、速度和加速度。而动力学则考虑在实际运动过程中力和扭矩如何影响机器人的运动,这包括了对刚体的质量分布及其与关节相互作用的分析。这两个领域是理解机器人如何与外界相互作用并执行任务的基础,对优化机器人的设计和功能至关重要。
在高层中主要是机器人质心规划,逆运动学(IK)是将质心轨迹和足端轨迹映射到各关节角度。例如,给定足端目标位置 ( x , y , z ) (x,y,z) (x,y,z),根据足端轨迹方程(如抛物线轨迹,根据 v v v水平速度, h h h抬腿高度, T T T摆动时间)求解髋、膝、踝关节的角度 ( θ h i p , θ k n e e , θ a n k l e ) (\theta_{hip}, \theta_{knee}, \theta_{ankle}) (θhip,θknee,θankle),这可以使用雅可比矩阵或者数值优化方法(如梯度下降)实时计算求解。
逆动力学则是计算关节所需要的力矩 τ \tau τ,满足运动学和动力学约束:
τ = M ( q ) q ¨ + C ( q , q ˙ ) q ˙ + G ( q ) + J T F e x t \tau = M(q) \ddot q + C(q,\dot q)\dot q + G(q) +J^{T}F_{ext} τ=M(q)q¨+C(q,q˙)q˙+G(q)+JTFext
其中 M M M是惯性矩阵, C C C是科氏力, G G G是重力, J J J是雅可比矩阵, F e x t F_{ext} Fext是地面反作用力。
底层执行器控制
腿足机器人的驱动器控制算法(如PID和PD)是实现其运动稳定性和动态响应的核心技术。
PID/PD):跟踪高层指令,实现高频率(1-10kHz,即每0.1~1ms更新一次)的精确执行。
以PD控制为例,为了跟踪关节目标角度 q d e s i r e d q_{desired} qdesired和速度 q ˙ d e s i r e d \dot q_{desired} q˙desired,需要给电机一定的力矩,其计算如下:
τ f b = K p ( q d e s i r e d − q a c t u a l ) + K d ( q ˙ d e s i r e d − q ˙ a c t u a l ) \tau_{fb}=K_p(q_{desired}-q_{actual})+K_d(\dot q_{desired}-\dot q_{actual}) τfb=Kp(qdesired−qactual)+Kd(q˙desired−q˙actual)
由于机器人自重、惯性带来的影响,可以加上逆动力学计算的理想力矩 τ f f \tau_{ff} τff,则最终的力矩可以表示为:
τ = τ f f + τ f b \tau = \tau_{ff} + \tau_{fb} τ=τff+τfb
这一力矩通过液压阀或者电机驱动器转为物理动作。
传感器校正
开篇提到一个完整动作流程的第一步是传感器的数据获取,然后才是估计姿态,这是因为传感器有噪声、环境也不确定性,此外还有动态系统的随机性。这里使用到的是概率机器人理论(后续博客揭示),这里简要看一下。
腿足机器人需要实时估计自身姿态(如躯干角度、关节位置)和运动状态(如速度、加速度),但传感器数据(IMU、编码器、力传感器)通常包含噪声。其核心思想是先不参考传感器数据,会有一个先验状态,然后结合传感器对状态进行修正,使用到的方法有卡尔曼滤波、粒子滤波等。
此外在腿足机器人动态环境中运动时,需考虑障碍物位置、地面摩擦系数等不确定性因素。概率方法用于增强规划的鲁棒性,会使用概率路线图(Probabilistic Roadmap, PRM)、蒙特卡洛树搜索(Monte Carlo Tree Search, MCTS)等方法评估候选路径和不同动作序列成功的概率。
概率方法的核心作用
| 控制流程 | 概率方法 | 解决的问题 |
|---|---|---|
| 状态估计 | 卡尔曼滤波、粒子滤波 | 传感器噪声与动态不确定性 |
| 运动规划 | PRM、MCTS | 环境障碍物与地形不确定性 |
| 强化学习 | 随机策略、熵正则化 | 探索-利用权衡与策略鲁棒性 |
| 模型预测控制 | 高斯过程、随机MPC | 动力学模型误差与外部干扰 |
| 足地交互 | 贝叶斯估计、概率摩擦锥 | 接触状态与地面特性不确定性 |
相关文章:
腿足机器人之二- 运动控制概览
腿足机器人之二运动控制概览 高层运动规划MPCRL 中层逆运动学和逆动力学底层执行器控制传感器校正 上一篇博客是腿足机器人的骨架和关节的机械和电气组件,关节不仅需要通过机械设计实现复杂的运动能力,还必须通过电子组件和控制系统来精确控制这些运动。…...
【MySQL】基础篇
1. MySQL中的NULL值是怎么存放的? MySQL的compact行格式中会用【NULL值列表】来标记值为NULL的列,NULL值不会存储在行格式中的真实数据部分。 NULL值列表会占用1字节空间,当表中所有字段都被定义成NOT NULL,行格式中就不会有NULL值…...
vscode环境搭建
目录 一、安装VSCode 二、安装Python 三、安装Anaconda(可选,但推荐) 四、安装深度学习相关库 五、配置VSCode 六、 结果可视化 一、安装VSCode 访问官网下载:从VSCode官方网站下载适合你操作系统的安装包。安装:运行安…...
tp whereOr用法2
有时候会用到多个whereOr 可以用闭包来完成查询 Db::name(table_name)->whereOr([[age,null,],[age,,]])->select();Db::name(table_name)->whereOr([[birthday,null,],[birthday,,]])->select();这两个是OR(或)关系 Db::name(table_name)->whereOr([[age,nul…...
前端面试题目---页面抖动的原因、如何避免、如何解决
前端页面抖动是一个常见且影响用户体验的问题,下面将从抖动发生的场景、解决办法以及预防措施三个方面进行详细阐述。 页面抖动发生的场景 1. 元素尺寸动态变化 图片加载:当页面中图片的宽高没有预先设定,在图片加载完成后,其实…...
Spring Boot整合DeepSeek实现AI对话(API调用和本地部署)
本篇文章会分基于DeepSeek开放平台上的API,以及本地私有化部署DeepSeek R1模型两种方式来整合使用。 本地化私有部署可以参考这篇博文 全面认识了解DeepSeek利用ollama在本地部署、使用和体验deepseek-r1大模型 Spring版本选择 根据Spring官网的描述 Spring AI是一…...
DeepSeek 的 API 服务引入 WPS Office
以下是将 DeepSeek 的 API 服务引入 WPS Office 的通用集成教程。以调用 DeepSeek 的 AI 功能(如文本生成、数据分析)为例,假设你需要通过 WPS 的宏或插件调用外部 API: 准备工作 注册 DeepSeek 账号并获取 API Key 访问 DeepSe…...
在Vue中,JavaScript数组常用方法,添加,插入,查找,删除等整理
在Vue中,JavaScript数组常用,添加,插入,查找,删除等整理 1.splice()方法可以直接修改原数组,通过指定要删除元素的索引来删除它。 例: let index // 要删除的元素的索引; this.array.splice(i…...
树莓派上 基于Opencv 实现人脸检测与人脸识别
一,需求 基于树莓派4b,usb1080p摄像头,实现人脸检测与人脸识别。尝试了海陵科的模组和百度的sdk。海陵科的模组无法录入人脸,浪费了100多块钱。百度的sdk 在树莓派上也无法录入人脸,官方解决不了。最后只能用opencv自…...
Unity 接入Tripo 文生模型,图生模型
官方网站:https://www.tripo3d.ai/app/home自行注册账号并且登陆下载Unity插件:https://cdn-web.tripo3d.ai/plugin/tripo-unity.zip申请apikey: https://platform.tripo3d.ai/api-keys使用(后续过程就按照第二步下载的插件里面的…...
Redis常见数据结构
目录 基本介绍 特点: 全局命令 数据类型: String Hash List Set Zset 基本介绍 Redis是一个在内存中存储数据的中间件,可作为数据库,缓存,消息队列等。 特点: 持久化:Redis会把数据存储在内存中…...
fps动作系统9:动画音频
文章目录 音频单播放音频文件也是可以的,只不过是2d声音。创建音频蓝图cue(音效)音量乘数 衰减(空间效果)音量自然声音内部半径衰减距离 空间化双声道 绑定到动画动画序列轨道 音频 单播放音频文件也是可以的,只不过是2d声音。 创建音频蓝图 cue(音效…...
十四、GitLab 流水线自动化部署之 Windows Server
一、软件下载 本文章采用 Windows 版本的 Gitlab Runner 客户端,下载地址参考如下: 链接:https://pan.baidu.com/s/1nktWQGR4toRpgzEn9Qj3kQ?pwd0p1d 提取码:0p1d --来自百度网盘超级会员V7的分享 二、环境安装 1、Java 环境…...
数据库数据恢复—MongoDB丢失_mdb_catalog.wt文件导致报错的数据恢复案例
MongoDB数据库存储模式为文档数据存储库,存储方式是将文档存储在集合之中。 MongoDB数据库是开源数据库,同时提供具有附加功能的商业版本。 MongoDB中的数据是以键值对(key-value pairs)的形式显示的。在模式设计上,数据库受到的约束更少。这…...
mysql8.0使用MGR实现高可用与利用MySQL Router构建读写分离MGR集群
MGR是MySQL Group Replication的缩写,即MySQL组复制。 在以往,我们一般是利用MySQL的主从复制或半同步复制来提供高可用解决方案,但这存在以下几个比较严重的问题: 主从复制间容易发生复制延迟,尤其是在5.6以前的版本…...
基于Ubuntu2404搭建k8s-1.31集群
k8s 1.31 环境初始化安装Container安装runc安装CNI插件部署k8s集群安装crictl使用kubeadm部署集群节点加入集群部署Calico网络配置dashboard 本实验基于VMware创建的Ubuntu2404虚拟机搭建k8s 1.31版本集群,架构为一主一从,容器运行时使用Container&#…...
Golang的图形编程应用案例
Golang的图形编程应用案例 一、Golang的图形编程概述 是一种高效、可靠且易于使用的编程语言,具有并发性和简洁性,因此在图形编程领域也有着广泛的应用。Golang的图形编程主要通过各种图形库来实现,其中最知名的是Go图形库(Ebiten…...
PostgreSQL 错误代码 23505 : ERROR: duplicate key value violates unique constraint
目录 1. 确认错误信息2. 检查数据3. 处理重复数据4. 检查唯一约束5. 添加唯一约束6. 使用事务处理并发操作7. 使用触发器8. 使用 ON CONFLICT 子句9. 重置序列10. 捕获异常并重试 错误代码 23505 是 PostgreSQL 中表示违反唯一约束(unique violation)的标…...
基于SpringBoot和PostGIS的省域“地理难抵点(最纵深处)”检索及可视化实践
目录 前言 1、研究背景 2、研究意义 一、研究目标 1、“地理难抵点”的概念 二、“难抵点”空间检索实现 1、数据获取与处理 2、计算流程 3、难抵点计算 4、WebGIS可视化 三、成果展示 1、华东地区 2、华南地区 3、华中地区 4、华北地区 5、西北地区 6、西南地…...
MySQL InnoDB引擎 MVCC
MVCC(Multi-Version Concurrency Control)即多版本并发控制,是 MySQL 的 InnoDB 存储引擎实现并发控制的一种重要技术。它在很多情况下避免了加锁操作,从而提高了数据库的并发性能。 一、原理 MVCC 的核心思想是通过保存数据在某…...
Java 语言特性(面试系列2)
一、SQL 基础 1. 复杂查询 (1)连接查询(JOIN) 内连接(INNER JOIN):返回两表匹配的记录。 SELECT e.name, d.dept_name FROM employees e INNER JOIN departments d ON e.dept_id d.dept_id; 左…...
Cursor实现用excel数据填充word模版的方法
cursor主页:https://www.cursor.com/ 任务目标:把excel格式的数据里的单元格,按照某一个固定模版填充到word中 文章目录 注意事项逐步生成程序1. 确定格式2. 调试程序 注意事项 直接给一个excel文件和最终呈现的word文件的示例,…...
C++初阶-list的底层
目录 1.std::list实现的所有代码 2.list的简单介绍 2.1实现list的类 2.2_list_iterator的实现 2.2.1_list_iterator实现的原因和好处 2.2.2_list_iterator实现 2.3_list_node的实现 2.3.1. 避免递归的模板依赖 2.3.2. 内存布局一致性 2.3.3. 类型安全的替代方案 2.3.…...
springboot 百货中心供应链管理系统小程序
一、前言 随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱,百货中心供应链管理系统被用户普遍使用,为方…...
MongoDB学习和应用(高效的非关系型数据库)
一丶 MongoDB简介 对于社交类软件的功能,我们需要对它的功能特点进行分析: 数据量会随着用户数增大而增大读多写少价值较低非好友看不到其动态信息地理位置的查询… 针对以上特点进行分析各大存储工具: mysql:关系型数据库&am…...
连锁超市冷库节能解决方案:如何实现超市降本增效
在连锁超市冷库运营中,高能耗、设备损耗快、人工管理低效等问题长期困扰企业。御控冷库节能解决方案通过智能控制化霜、按需化霜、实时监控、故障诊断、自动预警、远程控制开关六大核心技术,实现年省电费15%-60%,且不改动原有装备、安装快捷、…...
反射获取方法和属性
Java反射获取方法 在Java中,反射(Reflection)是一种强大的机制,允许程序在运行时访问和操作类的内部属性和方法。通过反射,可以动态地创建对象、调用方法、改变属性值,这在很多Java框架中如Spring和Hiberna…...
涂鸦T5AI手搓语音、emoji、otto机器人从入门到实战
“🤖手搓TuyaAI语音指令 😍秒变表情包大师,让萌系Otto机器人🔥玩出智能新花样!开整!” 🤖 Otto机器人 → 直接点明主体 手搓TuyaAI语音 → 强调 自主编程/自定义 语音控制(TuyaAI…...
SiFli 52把Imagie图片,Font字体资源放在指定位置,编译成指定img.bin和font.bin的问题
分区配置 (ptab.json) img 属性介绍: img 属性指定分区存放的 image 名称,指定的 image 名称必须是当前工程生成的 binary 。 如果 binary 有多个文件,则以 proj_name:binary_name 格式指定文件名, proj_name 为工程 名&…...
【JVM面试篇】高频八股汇总——类加载和类加载器
目录 1. 讲一下类加载过程? 2. Java创建对象的过程? 3. 对象的生命周期? 4. 类加载器有哪些? 5. 双亲委派模型的作用(好处)? 6. 讲一下类的加载和双亲委派原则? 7. 双亲委派模…...
