【Gazebo入门教程】第八讲 Gazebo中的日志与回放
前言:在之前的Gazebo教程中,我们系统的学习了如何使用Gazebo进行机器人模型的创建、仿真环境的创建,并随着一个又一个的实例完成了对于SDF建模和可视化建模两种建模手段的使用,最后通过对于控制器插件的研究和与ROS系统的连接,搭建起来整个仿真世界与真实世界的桥梁,本节博客,也是整个入门教程中的最后一节(暂时),将会重点讲述Gazebo中的日志与回放方法,辅助我们进行研究和学习。
一、日志记录
1. 日志内容介绍
- 日志简介:Gazebo的日志文件常存储于压缩文件
.log
中,其中主要包含的是“世界状态”的变化,初始状态的描述包括仿真世界内一切事物的完整信息,从场景(Scene)到存在的实体。运行之后,每次仿真发生变化,新的世界状态都会被记录,具体内容如下:
- 仿真数据(例如当前模拟时间,物理迭代次数等);
- 场景内每个模型的状态(当然也包含模型内的每个链接和关节的状态),所谓状态,指的就是一些信息,比如瞬时姿态,速度,加速度,力等等;
- 当前世界内光源的位置;
2. 日志记录
- 2.1 GUI记录:
\qquad
1. 开始仿真,点击右侧上方的Log Data
图标,或者使用Ctrl + D
:
\qquad
2. 存储位置:默认在~/.gazebo/log
下,可以通过下图中的```Browse````进行修改:
\qquad
3. 开始录制后,字节数量随着模型和光源的移动进行增长(静止时不变),记录完毕后,打开
\qquad
Recordings
,可看到生成路径state.log
,目录名按时间生成。
- 2.2 命令行记录:
\qquad
1. 命令行可以记录任意时间仿真日志,例如用如下指令开启Gazebo,记录random_velocity.world
:
gazebo -r --record_path ~/logs/random_velocity worlds/random_velocity.world
\qquad
2. 命令行可通过gazebo --help
查看多种后缀的功能,具体如下:
-p arg
或--play arg
: 播放一个日志文件-r
或--record
:从Gazebo
打开到关闭的期间,记录日志--record_encoding arg
: 日志数据的压缩编码格式。选项为zlib
(默认),bz2
和txt
\qquad
3. 测试:当Gazebo成功关闭时,日志才会终止,故可以通过ls
目录查看是否生成日志state.log
:
ls ~/logs/random_velocity/
- 2.3 部分仿真记录:
\qquad
1. 概念:在任意时间点触发日志记录,主要通过gz log
工具
\qquad 2. 使用方法:新建终端,使用如下命令:
# 开始记录
gz log -d 1
# 停止记录
gz log -d 0
# 查看gz log的其他选项
gz log --help
二、日志回放
-
注意:当前并不支持使用GUI 进行回放日志,故这里只介绍使用命令行工具的方法;
-
命令行方法:使用
gz log
工具处理日志文件,其中-u
指启动暂停的日志:
gz log -s -f ~/.gazebo/log/2022-08-23T024149.945167/gzserver/state.log
- 日志中的世界描述如下:
<?xml version='1.0'?>
<gazebo_log>
<header>
<log_version>1.0</log_version>
<gazebo_version>7.0.0~pre1</gazebo_version>
<rand_seed>10622214</rand_seed>
<log_start>43 380000000</log_start>
<log_end>69 651000000</log_end>
</header>
<chunk encoding='txt'><![CDATA[
<sdf version ='1.6'>
<world name='default'>
(...)
<light name='sun' type='directional'>
(...)
</light>
<model name='ground_plane'>
(...)
</model>
<model name='double_pendulum_with_base'>
(...)
</model>
</world>
</sdf>]]></chunk>
--- Press space to continue, 'q' to quit ---
- 使用空格后可以逐步浏览之后状态(只有改变的信息):
<chunk encoding='txt'><![CDATA[
<sdf version='1.6'>
<state world_name='default'>
<sim_time>43 380000000</sim_time>
<real_time>43 478499228</real_time>
<wall_time>1453763389 677873530</wall_time>
<iterations>43380</iterations>
<model name='double_pendulum_with_base'><pose>1.140 -1.074 -0.000 0.000 -0.000 0.000 </pose><scale>1.000 1.000 1.000</scale><link name='base'><pose>1.13998 -1.07367 -0.00000 0.00000 0.00000 -0.00042 </pose><velocity>-0.0000 0.0000 -0.0005 0.0004 0.0030 0.0001 </velocity></link><link name='lower_link'><pose>1.38969 -1.79815 1.41059 -2.45351 0.00000 -0.00042 </pose><velocity>0.0042 -0.2557 0.2659 1.9694 0.0048 0.0001 </velocity></link><link name='upper_link'><pose>1.13999 -1.07367 2.10000 2.33144 -0.00000 -0.00042 </pose><velocity>0.0063 -0.0008 -0.0005 -0.3739 0.0032 0.0001 </velocity></link></model><model name='ground_plane'><pose>0.000 0.000 0.000 0.000 -0.000 0.000 </pose><scale>1.000 1.000 1.000</scale><link name='link'><pose>0.00000 0.00000 0.00000 0.00000 -0.00000 0.00000 </pose><velocity>0.0000 0.0000 0.0000 0.0000 -0.0000 0.0000 </velocity></link></model></state></sdf>
]]></chunk>
--- Press space to continue, 'q' to quit ---
总结
- 内容:本篇博客主要介绍了Gazebo中的日志与回放功能,帮助我们在学习和实际仿真中提高效率,并降低调试成本,本篇教程也是入门教程中的最后一节,希望大家都能有所收获,未来的RVIZ教程敬请期待。
- 注意:本文参考了Gazebo官方网站以及古月居中的Gazebo有关教程、知乎Bruce的教程等,主要目的是方便自行查询知识,巩固学习经验,无任何商业用途。