< >
Home » ROS2与Gazebo11入门教程 » ROS2与Gazebo11入门教程-物理参数(Physics Parameters)

ROS2与Gazebo11入门教程-物理参数(Physics Parameters)

说明:

  • 介绍如何选择或调整与物理引擎相关的参数,而且主要会介绍Open Dynamics Engine(ODE)中的物理参数

概述

  • 本节教程首先会介绍适用于所有物理引擎的相关物理参数,例如real_time_factor和max_step_size。然后通过演示来说明如何使用解算器(solver)、约束(constraints)和摩擦(friction)参数。本节教程中参数的顺序遵循这里的sdformat规程定义

适用于所有物理引擎的参数

  • 这个小节中列出的参数均是在此处的标签下定义的。

  • 这些参数在所有物理引擎之间共用,包括:

    • type参数:用于设置动态引擎的类型。目前,Gazebo支持以下4个物理引擎:ode,bullet,simbody和dart。默认的物理引擎是ode。

    • max_step_size参数:用于设置可变时间步长解算器(例如simbody)在仿真过程中可以采用的最大时间步长。对于具有固定步长解算器的物理引擎(例如ODE),该参数就只是时间步长。Gazebo中此参数的默认值为0.001秒。

    • real_time_factor参数:用于设置仿真中的实时因子值,max_step_size参数值与real_time_update_rate参数值的乘积可用于设置real_time_factor参数值的上限。如果real_time_factor <1,则仿真要比实时更慢。

    • real_time_update_rate参数:此参数是仿真时间步长前进(更新)的频率。Gazebo中此参数默认值为1000Hz。此参数的默认值乘以max_step_size参数的默认值0.001秒,得到real_time_factor参数值1。如果将real_time_update_rate设置为0,则仿真会尽可能快地运行。如果Gazebo无法以所需的频率进行更新,则它会根据计算能力尽可能快地进行更新。

    • max_contacts参数:用于设置两个实体之间可以产生的最大接触数量。该参数值可以用嵌套在“碰撞(colllision)”元素下的max_contacts子元素覆盖。这有助于限制两个实体之间最大的接触数量,例如面与面之间的碰撞,这可能会牺牲准确性。max_contacts参数对于三边形(trimesh)物体特别有用。max_contacts参数的另一个好处是,它允许用户在开始时就分配用于存储接触的固定数量内存。由于分配了足够的内存来存储最大可能的接触数量,因此不会发生内存的重新分配。

ODE(Open Dynamics Engine)引擎的专用参数

  • 位于此处的ODE用户指南包括大多数物理相关参数的说明。必要时可以参考这个用户指南。

解算器参数

  • 元素solver是sdformat中嵌套在physics-> ode之下的一个元素,详见这个页面。

  • 其参数包括:

    • type参数:ODE物理引擎中解算器的类型。ODE有两种解算器类型:world和quick。“世界步(world step)”使用一种称为Dantzig的直接方法,而“快步(quick step)”使用一种迭代的Projected Gauss-Seidel(PGS)方法。如果可以解算出问题,“世界步”会给出一个准确的解算结果,而“快步”则取决于达到足够准确性的解算结果所需的迭代次数。

    • 下面两个视频分别显示了具有“世界步”和“快步”解算器的双摆锤仿真。显然,对于“世界步”类型的解算器,地面和双摆锤底座之间的接触是稳定的,而对于“快步”类型的解算器,地面与双摆锤底座之间的接触则是不稳定的(在每个时间步长内接触都会消失然后再出现)。

    • “世界步”仿真演示视频网址:https://youtu.be/vnVbyexorNQ

    • “快步”仿真演示视频网址:https://youtu.be/1ncEVDIP1Yo

    • min_step_size参数:可变时间步长解算器的每个时间步长前进(更新)的最短持续时间。固定时间步长的解算器会忽略此参数。此参数值必须小于physics元素下max_step_size指定的值。如果未指定此参数的值,则默认值是physics元素下max_step_size指定的值。

    • iters参数:每个时间步长中解算器运行的迭代次数。一般来说,迭代次数较大会产生更好的准确性,但会以仿真速度较慢为代价,但这一点并不能得到保证。请注意,此参数仅对ode的“快步”解算器有意义,“世界步”解算器不会使用此参数。

    • precon_iters参数:此参数仅适用于“快步”解算器。它是解算出问题之前用于预处理的迭代次数。默认情况下,预处理策略是禁用的,因此不会使用此参数。正如sdformat说明中所述,此参数是一个实验性的参数。

    • sor参数:即连续超松弛(Successive Over-Relaxation)参数。此参数仅用于“快步”解算器。

    • use_dynamic_moi_rescaling参数:用于启用受限方向上惯性矩动态缩放的标志。此功能的实现可以在这里找到。

约束参数

  • 元素constraints是sdformat中嵌套在physics->constraints下的一个元素,详见这个页面。

  • 其参数包括:

    • cfm参数:约束力混合(CFM)是一个方块对角矩阵。该参数会向待解算线性互补问题中的矩阵增加一个小的正值。有关cfm参数的详细说明请参见这里。当仿真不稳定时,尤其是具有间歇性接触的仿真,cfm应该是第一个要调节的参数。CFM通过将硬接触转换为软接触来稳定仿真。因此,如果用于评估解算结果的误差指标仍然使用违规的原始硬接触,则CFM可能会限制仿真的准确性。在这篇文章中图3-5给出了关于此限制的明确演示。归因于CFM始终是一个小的正值这一事实,此限制始终会被忽略。

    • erp参数:误差减小参数(ERP)用于指定在下一个仿真步骤中关节误差将被修复的比例。嵌套在joints元素下的本地ERP值会覆盖全局ERP值。有关erp的详细说明请参见这里。也存在关于erp,cfm和kp,kd参数如何等效的证据,即cfm和erp可以准确地仿真弹簧-阻尼器(减震器)的行为。

    • contact_max_correcting_vel参数:此参数与“碰撞(collision)”->“表面(surface)”->“接触(contact)”元素下的max_vel是相同的参数。参数contact_max_correcting_vel可以在全局范围内设置max_vel。给出下面这个.world世界文件作为示例:

<?xml version="1.0" ?>

<sdf version="1.6">

<world name="default">

<physics type="ode">

<ode>

<solver>

<type>world</type>

</solver>

<constraints>

<contact_max_correcting_vel>0.1</contact_max_correcting_vel>

<contact_surface_layer>0.0001</contact_surface_layer>

</constraints>

</ode>

<max_step_size>0.001</max_step_size>

</physics>

<gravity>0.0 0.0 -9.81</gravity>

<include>

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

</include>

<include>

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

</include>

<model name="sphere_1">

<pose>0.0 1.8 0.5 0.0 0.0 0.0</pose>

<link name="link_1">

<visual name="visual_sphere_1">

<geometry>

<sphere>

<radius>0.5</radius>

</sphere>

</geometry>

<material>

<script>Gazebo/WoodPallet</script>

</material>

</visual>

<collision name="collision_sphere_1">

<geometry>

<sphere>

<radius>0.5</radius>

</sphere>

</geometry>

<surface>

<contact>

<ode>

<max_vel>10</max_vel>

<min_depth>0.001</min_depth>

</ode>

</contact>

</surface>

</collision>

</link>

</model>

<model name="sphere_2">

<pose>0.0 0.0 0.5 0.0 0.0 0.0</pose>

<link name="link_2">

<visual name="visual_sphere_2">

<geometry>

<sphere>

<radius>0.5</radius>

</sphere>

</geometry>

<material>

<script>Gazebo/WoodPallet</script>

</material>

</visual>

<collision name="collision_sphere_2">

<geometry>

<sphere>

<radius>0.5</radius>

</sphere>

</geometry>

<surface>

<contact>

<ode>

<max_vel>1</max_vel>

<min_depth>0.01</min_depth>

</ode>

</contact>

</surface>

</collision>

</link>

</model>

</world>

</sdf>
  • 在上面的示例中,一个全局的contact_max_correcting_vel被定义为0.1。模型sphere_1的max_vel值为10,而模型sphere_2的max_vel值为1。每当模型sphere_1和sphere_2之间存在接触时,ODE都会选择形成接触的两个实体的max_vel最小值。在本例中,该接触的max_vel值为min(10,1)= 1;最后,该max_vel会被全局定义的contact_max_correcting_vel截断(覆盖),即max_vel等于min(1,0.1)= 0.1。

  • 可以通过下面这个网址观看ODE参数max_vel的仿真演示视频:https://youtu.be/U12uajzfJUY

  • 此仿真为碰撞中的两个球体将max_vel设置为三个不同的值。仿真开始时两个球体的接触穿透深度为0.5。如果设置max_vel = 0,则在穿透被校正后,两个球体不会弹开且速度为零。如果将max_vel设置为1,则顶部的红色球体将以不大于1的速度被反弹出去,max_vel=10的情况与之类似。这有助于防止仿真爆炸,尤其是在仿真校正某些接触穿透误差之后。

  • contact_surface_layer参数:此参数与“碰撞(collision)”->“表面(surface)”->“接触(contact)”元素下的min_depth是相同的参数。由于参数contact_surface_layer与contact_max_correcting_vel具有类似的截断(覆盖)策略,这里使用的演示示例与contact_max_correcting_vel使用的演示示例相同。在每个时间步长上,对模型sphere_1和sphere_2之间的穿透深度计算为depth参数值。 min_depth值由形成接触的两个实体之间的最小值决定,并进一步由全局参数contact_surface_layer的值所截断(覆盖)。在上面的示例中:min_depth=min(min(0.001,0.01),0.0001)=0.0001。在确定了min_depth值后,就可以用下面这个公式为每个时间步长更新两个实体之间的渗透深度:depth = max(depth-min_depth,0)。

  • 可以通过下面这个网址观看ODE中参数min_depth的仿真演示视频:https://youtu.be/LaSlY0cX7qU

  • 这个视频中显示了三种情形:最左侧的两个球体开始是是处于分离模式的,即在仿真开始时它们没有接触。顶部的红色球体由于重力作用而开始掉落并形成接触。在这种情形中,不会发生穿透,因此min_depth = 0.5在这种情形中不起任何作用。在第二种情形中,开始时两个球体有接触且穿透深度为0.7,min_depth = 0。因此,仿真会对穿透深度0.7进行校正(校正为0)。对于第三种情形,开始时两个球体有接触且穿透深度为0.7,min_depth = 0.5。因此,穿透深度将会通过计算depth = max(depth-min_depth,0)= 0.2进行更新,且仿真会对新的穿透深度0.2进行校正(校正为0.5)。最终两个球体会保持在穿透深度等于min_depth而停下来。

摩擦参数

  • 有关ODE中的扭转摩擦,请参考这个教程。

  • 每个表面的接触摩擦参数是在SDFormat的friction元素中指定的,该元素嵌套在“碰撞(collision)”->“表面(surface)”->“摩擦(friction)”之下,详见这个页面。

  • 其参数包括:

    • mu参数:沿第一摩擦方向的摩擦系数。

    • mu2参数:沿第二摩擦方向的摩擦系数。在大多数情况下,mu2与mu具有相同的值。

    • fdir1参数:该参数是一个三元组单位向量,用于指定与碰撞局部参考坐标系中mu相对应的第一摩擦方向的方向。

请输入图片描述

  • 上面这张图片显示了如何用金字塔模型来近似表示摩擦锥。图中对fdir1、mu和mu2的方向进行了标记。每当形成一个接触,就可以确定法线方向,并且通过fdir1的定义,可以轻松地使用第三个参数fdir2来构造接触坐标系,其中fdir2是法线和fdir1方向上单位向量的叉乘(向量积)。

  • slip1和slip2参数:碰撞局部坐标系中依赖于力的滑动方向1和2,单位是反阻尼系数的单位,即m/s/N或m/(sN)

  • 这些参数的解释取决于ODE解算器使用的摩擦模型,该模型由 -> -> 元素下的<friction_model>元素指定,其中<friction_model>元素的文档可以参阅这里。

  • 默认的摩擦模型是pyramid(即金字塔摩擦模型),该模型将摩擦约束解耦为两个可以独立解算的一维约束。这一点在下图中进行了说明。

  • 元素friction_model的有效值包括:

    • pyramid_model :(默认)摩擦约束被解耦为两个可以独立解算的一维约束。摩擦力极限是法向力与每个摩擦方向上无量纲系数mu和mu2的乘积。

    • box_model:摩擦力也被解耦为两个一维约束,其恒定摩擦力极限与法向力无关。对于此模型而言,系数mu和mu2的单位为牛顿,且代表每个摩擦方向上的最大摩擦力。

    • cone_model:此模型通过选择与接触点处的线速度平行的摩擦方向来解算耦合的动态摩擦约束。此模型仅使用参数。有关此模型功能的实现,请参见Gazebo拉取请求1522。

  • 圆锥体摩擦模型和金字塔摩擦模型的名称来源于对接触力可能指向的方向的几何解释,如下图所示。圆锥体/金字塔的角度由摩擦系数设定。

请输入图片描述

  • 固定法向力对应于圆锥体的一个圆形切片,可以表示任何方向上摩擦力大小的极限。对于金字塔模型,固定法向力对应于一个正方形切片,代表每个方向上的独立约束。圆锥体摩擦模型从物理上来说更加符合现实,但是在期望各向异性行为的某些情况下,例如分别对纵向和横向车轮摩擦进行建模时,金字塔模型很有用(请参见在Gazebo拉取请求2950中增加的WheelSlipPlugin插件)。

  • 箱体和圆锥体摩擦模型之间的差异可以使用friction_pyramid测试仿真世界进行可视化展示,该仿真世界含有一个方盒阵列,这些方盒被排列成一个圆形,且它们的初始速度方向都是朝向远离圆心方向的。若在该示例仿真世界文件中第15行指定的是cone_model,正如预期的一样,会导致这些方盒沿径向向外移动。

  • 可以通过下面这个网址观看圆锥体摩擦模型仿真演示视频:https://vimeo.com/327117996?from=outro-embed

  • 由于金字塔摩擦模型默认情况下使用仿真世界的X-Y轴作为其摩擦方向,因此某些方盒的速度方向与这些轴线并不平齐,且它们的行为也会有所不同。每个轴上的速度是单独进行处理的,拿初始速度方向与仿真世界坐标轴不成0、45或90度的方盒为例来说明,这一点最为明显。对于这些方盒来说,一个速度分量比另一个速度分量小得多,并且该速度分量会耗散为0,而另一个速度分量仍然会沿其前进方向继续移动。这些盒子会在平行于摩擦方向之一的方向上继续前进一段时间,然后才最终停下来。若在示例仿真世界文件中指定的是pyramid_model,则会展现出这种行为。

  • 可以通过下面这个网址观看金字塔摩擦模型仿真演示视频:https://vimeo.com/327118010?

接触参数

  • 元素contact是sdformat中嵌套在“碰撞(collision)”->“表面(surface)”->“接触(contact)”下的一个元素。

  • 其参数包括:

    • soft_cfm参数:即软约束力混合参数,它对使表面变软很有用。

    • soft_erp参数:即软误差减小参数,它对使表面变软很有用。

    • kp参数:即接触点的动态“刚度”当量系数。

    • kd参数:即接触点的动态“阻尼”当量系数。

  • 参数kp和kd可用于稳定两个实体之间的接触。当对“快步(quick step)”与“世界步(world step)”进行比较时,具有“快步”的双摆锤模型具有不稳定的间歇性接触。如果将kp和kd参数添加到地面和双摆锤底座之间的“冲撞(collision)”->“表面(surface)”->“接触(contact)”元素中,则该接触会变得稳定,如这个视频所示。

<collision name="col_plate_on_ground">

<pose>0 0 0.01 0 0 0</pose>

<geometry>

<cylinder>

<radius>0.8</radius>

<length>0.02</length>

</cylinder>

</geometry>

<surface>

<contact>

<ode>

<kp>1e15</kp>

<kd>1e13</kd>

</ode>

</contact>

</surface>

</collision>
  • max_vel参数:即接触的最大校正速度。如果下一个仿真步骤的预测速度大于此参数值,则该预测速度将会被此参数值截断(覆盖)。前面已演示了此参数与contact_max_correcting_vel参数的组合用法。

  • min_depth参数:如果穿透深度不大于min_depth参数值,则不会施加接触力。否则,将会施加接触力,以使用穿透深度减去min_depth的值来校正穿透的过深部分。剩余的min_depth穿透深度部分仍将会保留下来。

  • 可以在此处获取生成上述演示视频的所有仿真世界文件。

参考:

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

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


标签: ros2与gazebo11入门教程