< >
Home » ROS2与Gazebo11入门教程 » ROS2与Gazebo11入门教程-重力补偿(Gravity compensation)插件

ROS2与Gazebo11入门教程-重力补偿(Gravity compensation)插件

说明:

  • 介绍如何在Gazebo中使用模型插件进行重力补偿,以及如何对内置的PID关节控制器进行补充完善

前提条件

  • 学习完了“插件101”一节教程

  • 学习完了从源代码安装Gazebo教程

  • 安装可选的DART 物理引擎和工具集(physics and utilities) (libdart11-utils-urdf-dev)

概述

  • 重力补偿是一种用于减轻重力对机器人行为影响作用的技术。机器人模型及其当前配置被用于估算作用在机器人各个链接上的重力以及平衡它们所需的关节作用力。理想情况下,重力补偿可以抵消重力引起的加速度,同时使机器人可以承受其他外力作用。

  • 下面将会从使用PID反馈控制一个线性执行器上的0.1千克块体开始,以了解重力补偿如何改善控制。

PID控制

  • P控制(比例控制)

  • 用暂停仿真-u选项启动Gazebo,并插入Mass on rails模型

请输入图片描述

  • 选中该模型并拖出打开右面板以显示关节控制界面

  • 打开Position选项卡并将目标位置设置为1.0,将比例增益(proportional gain)设置为2.0,并将其它增益设置为0.0,如下图所示

请输入图片描述

  • 不暂停仿真(即运行仿真)

  • 一旦块体(mass)由于该模型中的执行器摩擦作用而停止,请在左面板中检查mass链接的位姿(pose)属性

  • 该块体已经移动了,但是远远没有达到目标位置。如果加大增益,该块体会在更靠近目标的位置上停下来。但是,加大增益也会增加该块体振荡的幅度和使其稳定所需的时间,如下图所示

请输入图片描述

绘图

  • 为创建您自己的与上图类似的图形,需要执行以下操作:

  • 确保仿真已暂停并且时间重置为零。

  • 单击“窗口(Window)”菜单下的“绘图(plot)”菜单项。

  • 选择“模型(MODELS)”选项卡。

  • 展开模型树以找到块体(mass)模型的位置:mass_on_rails> mass>Pose>Position。

  • 单击并将Z元素拖动到绘图画布上。

  • 设置关节控制器参数,并且取消暂停仿真。

  • 要将不同参数的新轨迹(traces)添加到图形中,需执行以下操作:

    • 暂停仿真。
    • 重置仿真(Ctrl-R)。
    • 设置新的关节控制器增益并取消暂停仿真。

请输入图片描述

  • PD控制(比例-微分控制)

  • 通过使用微分增益,可以消除振荡,同时保持较高的比例增益。比例单元与控制器误差(本例中为位置)相对,而微分单元则与控制器误差的变化率(本例中为速度)相对。微分单元可以提供线性阻尼。

  • 在忽略摩擦、执行器动态等的情况下,具有PD控制的示例系统可以建模为阻尼谐波振荡器。比例增益和微分增益分别对应于该链接页面上的变量“ k”和“ c”。

  • 可以通过适当设置增益来选择系统的自然频率(固有频率)和阻尼比。这里选择阻尼比为1和10rad/s的固有频率。在质量为0.1kg的情况下,相应的比例增益和微分增益分别为10和2。

  • 如果系统阻尼不足,则更大值的固有频率通常会更快地趋于平衡,并产生更快的振荡。更大值的阻尼比则会减少并最终消除振荡,但是阻尼比太大或太小都会减慢收敛速度。阻尼比为1时会产生临界阻尼:对于给定的固有频率,有可能的最快收敛速度而不发生振荡。

      1. 将比例增益和微分增益分别设置为10.0和2.0。
      1. 重置仿真(Ctrl-R)。
  • 现在,该块体会相对较快地在目标位置附近停下来。但是,由于还能观察到一些稳态误差,因此仍有改进空间。

  • PID控制(比例-积分-微分控制)

  • 控制器中的积分单元可以消除稳态误差。积分单元对控制器误差随时间的总和作出响应,因此积分单元会随时间增大幅度,直到消除稳态误差或者达到某个阈值(在Gazebo中目前为+-1)为止。

  • 将比例增益、积分增益和微分增益分别设置为10.0、1.0和2.0,并再次重置仿真。

  • 现在,该块体几乎完全停在目标位置上。下图显示了PD控制和PID控制示例中块体随时间变化的位置对比情况。

请输入图片描述

  • 调节PID控制器时必须小心。例如,如果将PID增益分别设置为10.0、1.0和0.0而不是上面的值,则该块体将会剧烈振荡

重力补偿

  • 现在PID控制器在mass_on_rails系统上表现良好。但是,它需要依赖于高的增益,而这可能是用户所不希望的,例如,如果想要控制器合规。在有些情况下,重力补偿可以提供一种方法,在不完全牺牲控制器性能的情况下降低PID增益

演示

  • 对于mass_on_rails系统而言,重力是控制器必须克服的主要因素。 因此,如果添加重力补偿(GC),则可以降低PID增益,而且仍然可以让块体停在目标位置附近。

  • 在Gazebo中以暂停仿真模式打开示例仿真世界,命令为:

gazebo -u --verbose worlds/gravity_compensation.world
  • 将目标位置设置为1.0,并将比例增益、积分增益和微分增益分别设置为0.4、0.0和0.4

取消暂停仿真

  • 通过重力补偿,尽管PID增益较低,但块体仍稳定在目标位置附近。由于积分单元为零,并且模型包含摩擦力,因此控制器会有一些稳态误差

请输入图片描述

  • 使用插件

  • 下面这段来自gravity_compensation.world世界文件的代码块显示了它是如何调用该插件的:

<include>

<uri>model://mass_on_rails</uri>

<plugin name="gravity_compensation" filename="libGravityCompensationPlugin.so">

<uri>model://mass_on_rails</uri>

</plugin>

</include>
  • include代码块告知Gazebo向该仿真世界添加一个模型,而URI指出了要添加哪个模型。plugin代码块告知Gazebo为该模型运行重力补偿插件(更外面的plugin代码块)。plugin代码块需要其自身模型的URI,而该模型恰好就是计算重力和补偿关节作用力时使用的那个模型。

  • 通过将代码块替换为代码块并添加必要的属性和元素,可以直接在世界文件中定义模型。

  • 只要代码块中的模型包含了代码块模型中的所有关节,则世界文件的代码块和代码块中的URI不必相匹配。

模型误差

  • 当应用于物理机器人时,重力补偿可能会表现出不同程度的误差,具体误差大小取决于模型与物理机器人之间的差异。使用不同插件和仿真模型的能力对于研究模型误差的影响作用很有用。例如,如果预期的实际块体可能与模型块体不同,则可以更新仿真中的模型,同时在插件中使用旧的模型。
1. 右键单击该模型,并选择“编辑模型(Edit Model)”菜单项。    
2. 在左面板中的“模型(Model)”选项卡下,双击mass链接并将其质量设置为0.09。
3. 退出模型编辑器,在出现提示时保存该模型。
4. 选中该模型,并再次输入关节控制器参数。
5. 取消暂停仿真。
  • 这样,控制器会大大超过目标位置,这是因为它在插件模型中的重量更大。因此,如果质量估算中的0.01kg误差是实际的,可以考虑增加一个积分单元和/或加大PID增益。

请输入图片描述

Robonaut

  • 重力补偿可以很容易地扩展到更复杂的系统中。下面的GIF显示了带重力补偿和不带重力补偿的Robonaut 2模型。左边的Robonaut通过重力补偿可以保持其姿势,而右边的Robonaut则会让其手臂垂下放在两侧。

请输入图片描述

  • 您自己如果要运行此示例,请用下面这个世界文件启动Gazebo:
<?xml version="1.0"?>

<sdf version="1.5">

<world name="default">

<include>

<uri>model://ground_plane</uri>

</include>

<include>

<uri>model://sun</uri>

</include>

<include>

<uri>model://r2_description</uri>

<name>r2_grav_comp</name>

<pose>0 -2 0 0 0 0</pose>

<plugin name="gravity_compensation" filename="libGravityCompensationPlugin.so">
        
<uri>model://r2_description</uri>

</plugin>

</include>

<include>

<uri>model://r2_description</uri>

<pose>2 0 0 0 0 -1.57</pose>

</include>

</world>

</sdf>

参考:

纠错,疑问,交流: 请进入讨论区点击加入Q群

获取最新文章: 扫一扫右上角的二维码加入“创客智造”公众号


标签: ros2与gazebo11入门教程