ROS2与Gazebo11入门教程-管理物理配置(Manage physics profiles)
说明:
- 介绍如何使用“预设管理器(Preset Manager)”界面存储物理参数配置并在这些物理配置之间进行切换
动机
- Gazebo中有许多影响物理仿真性能、准确性和通常行为的参数。有些参数是Gazebo支持的不同物理引擎共用的,例如“最大步长(maximum step size)”和“目标实时因子(target real time factor)”参数,而有些参数则不是共用的。物理预设管理器界面提供了一种方法以在一组物理参数之间轻松切换并将这些参数保存到SDF中
SDF用法
在SDF中,物理配置只是一个
元素。从SDF协议1.5版(在SDFormat版本3中被引入)开始,在一个世界仿真文件中允许使用多个物理引擎元素,但是这些物理引擎元素必须具有不同的name属性将它们区分开来。如果指定了多个物理引擎元素,则Gazebo会选择default属性设置为true的那个物理引擎元素。 如果未设置默认的物理配置,则Gazebo会选择第一个物理引擎元素。如果设置了多个默认配置,则Gazebo会选择设置为默认配置的第一个物理引擎元素。
在下面这个仿真世界示例(可在此处下载)中,将ode_200iters配置设置为默认配置,而ode_70iters和ode_500iters配置可以通过C++ API或gz命令行工具访问。下面是这个可下载的仿真世界示例的一段摘抄代码,显示了这些物理配置的值。
<sdf version="1.6">
<world name="preset_example">
<include>
<uri>model://sun</uri>
</include>
<gravity>3.0 0 -9.81</gravity>
<physics name="ode_70iters" type="ode">
<real_time_update_rate>1500</real_time_update_rate>
<ode>
<solver>
<type>quick</type>
<iters>70</iters>
</solver>
</ode>
</physics>
<physics name="ode_200iters" type="ode" default="true">
<ode>
<solver>
<type>quick</type>
<iters>200</iters>
</solver>
</ode>
</physics>
<physics name="ode_500iters" type="ode">
<ode>
<solver>
<type>quick</type>
<iters>500</iters>
</solver>
</ode>
</physics>
<!-- end physics presets, models and other world properties go here -->
API
如果要编写可以在不同物理配置之间进行切换的插件,则可以使用C++ API访问PresetManager来添加、删除物理配置以及在不同物理配置之间进行切换。还可以获取和设置物理配置参数和生成可以表达物理配置的SDF元素。
下面是一个示例PresetManager的代码片段,该代码可以编程方式构造组成上面SDF中示例仿真世界的两个物理配置:
physics::WorldPtr world = physics::get_world("default");
// Get the PresetManager object from the world
physics::PresetManagerPtr presetManager = world->PresetMgr();
// Create a new profile called "ode_70iters"
// It will be populated with the default physics parameters
// Many of the PresetManager functions return a boolean for error-checking
if (!presetManager->CreateProfile("ode_70iters"))
{
gzerr << "Couldn't create profile ode_70iters" << std::endl;
return -1;
}
// Create another profile
presetManager->CreateProfile("ode_200iters");
// Set the current profile to "ode_70iters"
presetManager->CurrentProfile("ode_70iters");
// Set the solver type to quickstep in the current profile, checking for errors
// SetCurrentProfileParam will change the current state of the physics engine
if (!presetManager->SetCurrentProfileParam("solver", "quick"))
{
gzerr << "Couldn't set parameter, did you pass a valid key/value pair?"
return -1;
}
// Set the number of iterations in the current profile to 70
presetManager->SetCurrentProfileParam("iters", 70);
// Set parameters in the other profile. These changes will be stored in
// presetManager but will not change the current state of the physics engine
presetManager->SetProfileParam("ode_200iters", "solver", "quick");
presetManager->SetProfileParam("ode_200iters", "iters", 200);
boost::any iters;
// Get the number of iterations from the current profile.
presetManager->GetCurrentProfileParam(iters, "iters");
// GetProfileParam and GetCurrentProfileParam currently return a boost::any,
// which must be casted to the correct type
gzmsg << "Iterations in current preset: " << boost::any_cast<int>(iters);
// Generate an SDF Element from the profile we constructed
sdf::ElementPtr odeQuickProfileSDF =
presetManager->GenerateSDFFromPreset("ode_70iters");
命令行界面
切换物理配置的一种更快、更便捷方法是使用命令行界面。
要用一个非默认配置启动上面创建的preset_example仿真世界,请使用以下命令启动Gazebo:
gazebo preset_example_sdf1_6.world --profile ode_70iters
- 对于快捷方式,请使用-o选项,命令如下:
gazebo preset_example_sdf1_6.world -o ode_70iters
也可以用gzserver替换gazebo以无头方式运行Gazebo(无图形客户端)。
Gazebo运行时,可以通过在另一个终端中使用gz physics命令来切换物理配置,命令如下所示:
gz physics --profile ode_200iters
gz physics -o ode_70iters
示例
- 下载preset_example_sdf1_6.world 世界文件(与上面显示的SDF示例相同)和bash脚本文件switch_profiles_sdf1_6.sh,该脚本文件的内容应该如下所示:
#!/bin/sh
set -x
gazebo --verbose preset_example_sdf1_6.world -o ode_200iters &
echo start with 200 iterations
sleep 5
gz physics -o ode_70iters
echo switch to 70 iterations
echo simulation will go unstable
sleep 5
echo switch back to 200 iterations
gz physics -o ode_200iters
echo reset world
gz world -r
echo open plot window to show link pitch and yaw angles
sleep 10
echo
for i in $(seq 5)
do
gz physics -o ode_500iters
sleep 5
gz physics -o ode_200iters
sleep 5
done
set +x
该脚本首先用ode_200iters物理配置启动Gazebo,然后切换到ode_70iters物理配置,而后仿真变得不稳定。然后,该脚本又切换回ode_200iters物理配置并重置仿真世界,然后在ode_200iters物理配置和ode_500iters物理配置之间进行5次切换,每次切换之间暂停5秒钟。
当绘制upper_link和lower_link的俯仰(Pitch)角和偏航(Yaw)角时,可以看出这两个物理配置之间的差异,因为对于理想的解算器,这些角度应该为零。
它们并不是完美的,但是经过500次迭代后这两个角的幅度值都较小,如下图所示:
这个仿真世界中的双摆锤模型的行为说明了两个物理配置之间的差异。经典的双摆锤由通过铰链关节连接的两个链节构成。其中一个链接通过另一个铰链关节固定在一个固定点上。
在本示例中,连接到固定点的链接要小得多,因此两个链接之间存在较大的惯性比,这很重要,因为较大的惯性比会导致迭代的Projected-Gauss Seidel解算器(Gazebo ODE解算器的默认设置))收敛非常慢(请参阅我们的会议论文(pdf)或DOI:10.2312/PE/vriphys/vriphys09/105-114(pdf))。
通过将重力加速度的x分量设置为3.0米每平方秒(m/s2),仿真世界会施加平行于铰链关节旋转轴(沿x方向)的一个恒定力。该摆锤通常应该仅会在YZ平面中移动,但由于缺少解算器收敛,因此侧向力会引起该摆锤在x方向上的摆动。
物理配置ode_70iters使用“快步(quickstep)”物理约束解算器,其速度更快而准确性较差。
该模型的大惯性比会导致约束解算器收敛缓慢,足以使仿真与剧烈摇摆的摆锤分开。
该物理配置还将运行时的实时因子设置为1.5,这意味着在这个物理配置处于活动状态时,仿真会以“快动作(fast motion)”方式运行。
物理配置ode_200iters和ode_500iters也使用“快步(quickstep)”解算器,但迭代次数增加,这给了解算器更多的收敛时间。因此,当切换物理配置时,可以看到摆锤的运动稳定在XZ平面中的来回运动上。
这个物理配置以1.0的实时因子运行,这意味着时间在仿真世界中的流逝速度与在现实世界中的流逝速度一样缓慢。
还可以看到物理参数更改在GUI中的反映。
在左面板的“世界(World)”选项卡下,单击“物理(Physics)”项,然后查看随脚本更改物理配置而发生的仿真世界物理属性变化情况。
必须关闭并重新打开菜单来刷新GUI。
- 可以以这个脚本为基础,用Gazebo物理库进行您自己的实验和物理配置!
参考:
获取最新文章: 扫一扫右上角的二维码加入“创客智造”公众号