草庐IT

并联四足机器人项目开源教程(五) --- 四足机器人相关书籍&论文研读

煜个头头 2023-04-09 原文


这个是本人在大三期间做的项目 ---- 基于MIT的Cheetah方案设计的十二自由度并联四足机器人,这个项目获得过两个国家级奖项和一个省级奖项。接下来我会将这个机器人的控制部分所有代码进行开源,并配有相关的教程博客,希望能够帮助到在学习相关领域知识或者进行项目开发的同学。

学习建议

自从MIT开源了Cheetah项目,网上出现了很多的论文解读,相关开源项目,也有很多人在原论文的基础上,对某个算法进行改进,发表了论文。对于初学者,建议从四足机器人的基础理论知识学起,再到Cheetah开源论文和其他算法改进的论文。Cheetah开源论文中有些算法细节描述不是很清楚,基本都可以通过查阅其他解读性的文章和论文,来进一步理解。
因为本人的水平有限,可能以下叙述会带有个人解读的偏见,也欢迎读者来与我联系交流:2250017028@qq.com

书籍列表

以下是我阅读过觉得比较有价值的书目,包含了四足机器人的基础理论,建议先看书籍进行知识储备,再看论文。书籍后期可以作为工具书进行查阅使用。
推荐学习路线:机械结构 -> 运动学建模及控制 -> 刚体动力学建模 -> 浮动基动力学
入门

  1. 《Legged-Robots-That-Balance》:讲述了弹簧倒立摆,动态控制,从单腿到双腿到四足机器人推广等算法,系统讲解了足式机器人工作的基本原理和思想,是四足机器人领域启蒙式读物。
  2. 《仿生四足机器人》 北理工出版:机械模型(弹簧腿)、正逆运动学、CGP控制思想等。

进阶

  1. 《Robot Dynamics Lecture Notes》:正逆运动学,浮动基座系统动力学与运动学,接触动力学
  2. 《Rigid Body Dynamics Algorithms》:空间向量代数、刚体系统动力学、刚体系统建模、正逆动力学、浮动基座动力学、接触动力学

论文列表

  1. 《MIT Cheetah 3: Design and Control of a Robust, Dynamic Quadruped Robot》:MIT Cheetah 3 开源论文
  2. 《Highly Dynamic Quadruped Locomotion via Whole-Body Impulse Control and Model Predictive Control》:MIT Cheetah mini开源论文
  3. 《XDog-新型电驱式四足机器人研制与测试》:宇树科技创始人的硕士学位论文,一套比较完整的四足开源方案,发表于MIT开源Cheetah项目之前,所以跟MIT所采用的结构框架不同,非常值得研读。
  4. 《Dynamic Locomotion in the MIT Cheetah 3 Through Convex Model-Predictive Control》:详细讲解了Cheetah项目中的MPC算法实现流程,包括动力学模型的建立和简化,MPC问题的创建以及QP求解。
  5. 《Passive Whole-body Control for Quadruped Robots: Experimental Validation over Challenging Terrain》:WBC算法在四足机器人上的应用,每个子任务讲的非常详细,可以用于理解WBC算法。

要点总结

下面的内容以Cheetah mini的控制架构及算法为例,进行展开叙述。

1. 控制架构

论文中给出的控制架构:

简化和总结后得到以下的控制架构:

  1. 在整个流程中,最核心的算法是MPC和WBIC算法,但在不使用WBIC算法的时候,单MPC算法也是可以正常工作的,只要将MPC计算所得的关节目标角度,角速度,前馈力矩直接输出到关节控制器即可。
  2. 因为状态估计是采用了传感器数据处理得到,与实际值存在有误差,在仿真环境中验证控制算法时,可以将该环节替换为读取仿真环境中绝对正确的测量数值

2. 步态规划(Gait Scheduler)

步态类型

四足机器人常用的步态有:stand,trot,walk等。
步态之间的属性区别在于运动周期,初始相位,转换相位

步态名称运动周期/s起始相位转换相位
Stand10(0.5, 0.5, 0.5, 0.5)1
Trot0.45(0, 0.5, 0.5, 0)0.5
Walk1(0.25, 0, 0.75, 0.5)0.75

运动周期:足端站立态 + 摆动态一次的时间之和。
相位:数值为0 - 1,代表一个运动周期内的各个腿部所处的状态
起始相位:每个腿部在切换到当前步态时的相位值。
转换相位:腿部从站立态切换为摆动态的相位值。

规划方式

Cheetah项目中采用的是贝赛尔曲线进行足端运动的路径规划。并且采用了动态的方法,执行流程如下:
贝塞尔曲线的详细介绍可以参考我的笔记:贝赛尔曲线学习

落足点计算
p s t e p , i = p h , i + T c ϕ 2 p ˙ c , d ⏟ R a i b e r t   H e u r i s t i c + z 0 ∣ ∣ g ∣ ∣ ( p ˙ c − p ˙ c , d ) ⏟ C a p t u r e   P o i n t p_{step,i}=p_{h,i}+\underbrace{\frac{T_{c_\phi}}{2}{\dot{p}}_{c,d}}_{Raibert \ Heuristic}+\underbrace{\sqrt{\frac{z_0}{||g||}}({\dot{p}}_c-{\dot{p}}_{c,d})}_{Capture \ Point} pstep,i=ph,i+Raibert Heuristic 2Tcϕp˙c,d+Capture Point ∣∣g∣∣z0 (p˙cp˙c,d)
T c ϕ 2 p ˙ c , d \frac{T_{c_\phi}}{2}{\dot{p}}_{c,d} 2Tcϕp˙c,d ----根据《Legged robots that balance》中的描述,足端按照该公式确定的落足点,会使运动为对称运动,加速度为0

z 0 ∣ ∣ g ∣ ∣ ( p ˙ c − p ˙ c , d ) \sqrt{\frac{z_0}{||g||}}({\dot{p}}_c-{\dot{p}}_{c,d}) ∣∣g∣∣z0 (p˙cp˙c,d) ----根据《Capture point: A step toward humanoid push recovery》中的描述,目标就是让落脚点趋近capture point,在该点腿部会获得平衡。

T c φ T_{c_\varphi} Tcφ ----理想状态下的stance态持续时间
z 0 z_0 z0 ----目标位置点的高度
p h , i p_{h,i} ph,i----腿i对应髋关节电机hip的位置

3. 状态估计(State Estimation)

在仿真环境中,机器人的世界坐标,速度大小和方向,都可以进行读取,并基于此对机器人进行控制。
但由于四足机器人的传感器都是安装在机器人上面,一般不存在有外部传感器,所以在实际运行中,机器人的全局信息需要由IMU等传感器数据进行复杂计算得到,并且难以避免累计误差,只能尽量减少。

卡尔曼滤波(Kalman Filter)

Cheetah项目中采用了卡尔曼滤波进行状态估计。卡尔曼滤波的作用在于对不同传感器的数据进行数据融合,利用观测量并结合系统的模型来对系统的状态进行估计

Cheetah分为以下两步进行状态估计:
航向估计(orientation):高频的IMU的gyro数据 + 低频的IMU加速度计数据(重力偏差值)-> 旋转矩阵 0 R b ^0R_b 0Rb
位置/速度估计:上述所得 0 R b ^0R_b 0Rb + 腿部电机数据(结合机器运动学公式) -> 世界坐标系下的位置/速度
详细公式参考论文《MIT Cheetah 3: Design and Control of a Robust, Dynamic Quadruped Robot 》中的“H. State Estimation”部分 。
卡尔曼滤波的公式推导:卡尔曼滤波

4. 关节控制器(Joint-Level Control)

Cheetah项目对关节电机的控制采用PD控制器 + 前馈力矩 τ \tau τ 的方式。
其中一共用到了两套控制器,一套用于计算前馈力矩,即补偿足端落点位置所需的力矩大小。一套用于控制各个电机逼近目标角度位置

前馈力矩的计算
τ f f , i = J i ⊤ Λ i ( B a i ,  ref  − J ˙ i q ˙ i ) + C i q ˙ i + G i \tau_{\mathrm{ff}, i}=\boldsymbol{J}_{i}^{\top} \boldsymbol{\Lambda}_{i}\left({ }^{\mathfrak{B}} \boldsymbol{a}_{i, \text { ref }}-\dot{\boldsymbol{J}}_{i} \dot{\boldsymbol{q}}_{i}\right)+\boldsymbol{C}_{i} \dot{\boldsymbol{q}}_{i}+\boldsymbol{G}_{i} τff,i=JiΛi(Bai, ref J˙iq˙i)+Ciq˙i+Gi
J i J_i Ji ----足部的雅可比矩阵
Λ i \Lambda _i Λi ----操作空间的惯性矩阵
B a i , r e f ^\mathfrak{B}a_{i,ref} Bai,ref ----参考加速度
q i q_i qi ----关节结构的向量
C i C_i Ci ----科里奥利矩阵
G i G_i Gi -----重力矩

τ i = J i ⊤ [ K p ( B p i ,  ref  − B p i ) + K d ( B v i , r e f − B v i ) ] + τ f f , i \boldsymbol{\tau}_{i}=\boldsymbol{J}_{i}^{\top}\left[\boldsymbol{K}_{p}\left({ }^{\mathfrak{B}} \boldsymbol{p}_{i, \text { ref }}-{ }^{\mathfrak{B}} \boldsymbol{p}_{i}\right)+\boldsymbol{K}_{d}\left({ }^{\mathfrak{B}} \boldsymbol{v}_{i, \mathrm{ref}}-{^\mathfrak{B}} \boldsymbol{v}_{i}\right)\right]+\boldsymbol{\tau}_{\mathrm{ff}, i} τi=Ji[Kp(Bpi, ref Bpi)+Kd(Bvi,refBvi)]+τff,i

电机输出力矩的计算
τ = K p ( q d e s − q i ) + K d ( q d d e s − q d i ) + τ i \boldsymbol{\tau}=\boldsymbol{K}_{p}\left(\boldsymbol{q}_{des}-\boldsymbol{q}_{i}\right)+\boldsymbol{K}_{d}\left(\boldsymbol{qd}_{des}-\boldsymbol{qd}_{i}\right)+\boldsymbol{\tau}_{ i} τ=Kp(qdesqi)+Kd(qddesqdi)+τi

5. MPC算法(Model Predictive Control)

在Cheetah项目中,MPC算法主要用于计算保持四足机器人正常运动的情况下,每条支撑腿的足端所需的输出力
MPC算法的公式推导参考我的学习笔记:手推MPC公式
其中,运动方程的建立将机器人看作单刚体模型:
[ I 3 … I 3 [ p 1 p c ] × … [ p 4 p c ] × ] ⏟ A F = [ m ( p ¨ c + g ) I G ω b ˙ ] ⏟ b \underbrace{\begin{bmatrix} I_3 &\dots & I_3 \\ [p_1 p_c]\times &\dots &[p_4 p_c]\times \end{bmatrix}}_{A} F=\underbrace{\begin{bmatrix} m(\ddot{p}_c+g )\\ I_G\dot{\omega _b} \end{bmatrix}}_b A [I3[p1pc]×I3[p4pc]×]F=b [m(p¨c+g)IGωb˙]

上式运用了基本的牛顿运动定律

  • 合力 = ma
  • 合力矩 = 惯量*角加速度

6. WBIC算法(Whole-Body Impulse Control)

WBIC算法中运用到了机器人的浮动基动力学模型,吸收了MPC计算得到数据以及机器人运动学模型所得数据。
WBIC的工作原理如下:

  1. 将机器人的运动分为多个任务,如触地控制任务,姿态控制任务,位置/速度控制任务等,并且任务具有优先级。
  2. 按照优先级的顺序,依次求解各个任务所需的电机前馈力矩输出公共解。
  3. 输出电机控制力矩

WBC的公式推导及应用可以参考我的学习笔记:
手推WBC公式
WBC控制的实际应用

有关并联四足机器人项目开源教程(五) --- 四足机器人相关书籍&论文研读的更多相关文章

  1. ruby-on-rails - rails : "missing partial" when calling 'render' in RSpec test - 2

    我正在尝试测试是否存在表单。我是Rails新手。我的new.html.erb_spec.rb文件的内容是:require'spec_helper'describe"messages/new.html.erb"doit"shouldrendertheform"dorender'/messages/new.html.erb'reponse.shouldhave_form_putting_to(@message)with_submit_buttonendendView本身,new.html.erb,有代码:当我运行rspec时,它失败了:1)messages/new.html.erbshou

  2. ruby-on-rails - 由于 "wkhtmltopdf",PDFKIT 显然无法正常工作 - 2

    我在从html页面生成PDF时遇到问题。我正在使用PDFkit。在安装它的过程中,我注意到我需要wkhtmltopdf。所以我也安装了它。我做了PDFkit的文档所说的一切......现在我在尝试加载PDF时遇到了这个错误。这里是错误:commandfailed:"/usr/local/bin/wkhtmltopdf""--margin-right""0.75in""--page-size""Letter""--margin-top""0.75in""--margin-bottom""0.75in""--encoding""UTF-8""--margin-left""0.75in""-

  3. ruby-on-rails - 'compass watch' 是如何工作的/它是如何与 rails 一起使用的 - 2

    我在我的项目目录中完成了compasscreate.和compassinitrails。几个问题:我已将我的.sass文件放在public/stylesheets中。这是放置它们的正确位置吗?当我运行compasswatch时,它不会自动编译这些.sass文件。我必须手动指定文件:compasswatchpublic/stylesheets/myfile.sass等。如何让它自动运行?文件ie.css、print.css和screen.css已放在stylesheets/compiled。如何在编译后不让它们重新出现的情况下删除它们?我自己编译的.sass文件编译成compiled/t

  4. ruby-on-rails - 如何从 format.xml 中删除 <hash></hash> - 2

    我有一个对象has_many应呈现为xml的子对象。这不是问题。我的问题是我创建了一个Hash包含此数据,就像解析器需要它一样。但是rails自动将整个文件包含在.........我需要摆脱type="array"和我该如何处理?我没有在文档中找到任何内容。 最佳答案 我遇到了同样的问题;这是我的XML:我在用这个:entries.to_xml将散列数据转换为XML,但这会将条目的数据包装到中所以我修改了:entries.to_xml(root:"Contacts")但这仍然将转换后的XML包装在“联系人”中,将我的XML代码修改为

  5. ruby - 检查 "command"的输出应该包含 NilClass 的意外崩溃 - 2

    为了将Cucumber用于命令行脚本,我按照提供的说明安装了arubagem。它在我的Gemfile中,我可以验证是否安装了正确的版本并且我已经包含了require'aruba/cucumber'在'features/env.rb'中为了确保它能正常工作,我写了以下场景:@announceScenario:Testingcucumber/arubaGivenablankslateThentheoutputfrom"ls-la"shouldcontain"drw"假设事情应该失败。它确实失败了,但失败的原因是错误的:@announceScenario:Testingcucumber/ar

  6. ruby-on-rails - Rails 3.2.1 中 ActionMailer 中的未定义方法 'default_content_type=' - 2

    我在我的项目中添加了一个系统来重置用户密码并通过电子邮件将密码发送给他,以防他忘记密码。昨天它运行良好(当我实现它时)。当我今天尝试启动服务器时,出现以下错误。=>BootingWEBrick=>Rails3.2.1applicationstartingindevelopmentonhttp://0.0.0.0:3000=>Callwith-dtodetach=>Ctrl-CtoshutdownserverExiting/Users/vinayshenoy/.rvm/gems/ruby-1.9.3-p0/gems/actionmailer-3.2.1/lib/action_mailer

  7. ruby-on-rails - 如何优雅地重启 thin + nginx? - 2

    我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server

  8. ruby - 在 jRuby 中使用 'fork' 生成进程的替代方案? - 2

    在MRIRuby中我可以这样做:deftransferinternal_server=self.init_serverpid=forkdointernal_server.runend#Maketheserverprocessrunindependently.Process.detach(pid)internal_client=self.init_client#Dootherstuffwithconnectingtointernal_server...internal_client.post('somedata')ensure#KillserverProcess.kill('KILL',

  9. ruby - 主要 :Object when running build from sublime 的未定义方法 `require_relative' - 2

    我已经从我的命令行中获得了一切,所以我可以运行rubymyfile并且它可以正常工作。但是当我尝试从sublime中运行它时,我得到了undefinedmethod`require_relative'formain:Object有人知道我的sublime设置中缺少什么吗?我正在使用OSX并安装了rvm。 最佳答案 或者,您可以只使用“require”,它应该可以正常工作。我认为“require_relative”仅适用于ruby​​1.9+ 关于ruby-主要:Objectwhenrun

  10. ruby - 无法让 RSpec 工作—— 'require' : cannot load such file - 2

    我花了三天的时间用头撞墙,试图弄清楚为什么简单的“rake”不能通过我的规范文件。如果您遇到这种情况:任何文件夹路径中都不要有空格!。严重地。事实上,从现在开始,您命名的任何内容都没有空格。这是我的控制台输出:(在/Users/*****/Desktop/LearningRuby/learn_ruby)$rake/Users/*******/Desktop/LearningRuby/learn_ruby/00_hello/hello_spec.rb:116:in`require':cannotloadsuchfile--hello(LoadError) 最佳

随机推荐