【学习笔记】ROS Gazebo map生成插件 collision_map_creator_plugin
背景:之前从Gazebo三维地图生成二维图片(
.png
)的方法主要是通过跑一遍SLAM,耗时费力,且效果不好。该插件可直接由.world
文件生成.png
文件。
一、参考资料
- Gazebo API官网:
- 源码:
- GitHub osfr:官方;
- Github tik0:在官方的基础上修改,含教程。
- 安装及使用:
- PX4与仿真入门教程-dronedoc-使用 Gazebo 插件创建地图(gazebo plugin):官方插件;
- PX4与仿真入门教程-dronedoc-使用 Gazebo 插件创建地图(ros包):使用整合(PX4)的ros包来实现,文档上的源码地址无效。
二、安装(官方插件)
-
安装依赖:
sudo apt-get install protobuf-compiler
-
下载和编译插件
git clone https://github.com/osrf/collision_map_creator_plugin cd collision_map_creator_plugin mkdir build cd build cmake ../ make
-
进行一些修改(直接执行会报错)
把collision_map_creator_plugin-master/msgs/CMakeLists.txt
中的set (msgs collision_map_request.proto ${PROTOBUF_IMPORT_DIRS}/vector2d.proto ${PROTOBUF_IMPORT_DIRS}/header.proto ${PROTOBUF_IMPORT_DIRS}/time.proto )
修改为
set (msgs collision_map_request.proto )
后,再重新编译(
make
一下)直接执行会报错:
[libprotobuf ERROR google/protobuf/descriptor_database.cc:57] File already exists in database: vector2d.proto
三、使用
-
先在
.world
文件中添加该插件
即在文末添加:<plugin filename="libcollision_map_creator.so" name="collision_map_creator"/>
-
把该插件添加至
GAZEBO_PLUGIN_PATH
环境
有两种方法:- 把该插件编译生成的文件添加至默认位置:
即,把libcollision_map_creator.so
文件添加至/opt/ros/kinetic/lib/
sudo cp ./libcollision_map_creator.so /opt/ros/kinetic/lib/
- 把编译文件的生成位置添加至环境变量:
GAZEBO_PLUGIN_PATH=$GAZEBO_PLUGIN_PATH:~/collision_map_creator_plugin/build/
- 把该插件编译生成的文件添加至默认位置:
-
使用Gazebo打开待处理的地图
gazebo ./cloister.world --verbose
其中
--verbose
参数能够显示启动的详细信息,看到加载插件的信息。
-
进行绘图
再开一个终端,执行./request_publisher "(-10,-10)(10,10)" 10 0.01 $(pwd)/cloister.png 255 office_desk::link::collision
其中,
"(-10,-10)(10,10)"
表示要建图的范围(单位:米),通常等于Gazebo中的栅格数;10
表示从多高的高度进行投影;0.01
地图分辨率,即每个像素代表0.01m;$(pwd)/cloister.png
生成地图图片的位置和名称office_desk::link::collision
被视为地面,以白色显示,其余位置以黑色(255-255=0)着色。
各参数详细释义参见Github
在gazebo的终端中可以看到建图的进度,
四、遇到问题
-
安装问题:
自己的电脑上make
总是报错,提示protobuf版本不匹配。未解决
问题细节参见之前的记录。 -
坐标选择问题:
存在生成地图坐标轴与图片(.png
)边界坐标轴不匹配的问题:未解决
五、生成用于导航的yaml文件
- yaml文件内容注释:
image: cloister.pgm # 像素图的文件名,支持.pgm和.png格式的图片 resolution: 0.050000 # 分辨率,当前表示一个像素点是0.05m origin: [-15.400000, -12.200000, 0.000000] # 像素图左下角在Gazebo世界坐标系下的坐标 negate: 0 # 默认0 occupied_thresh: 0.65 # 当像素占据的概率大于0.65时候认为是完全占据的 free_thresh: 0.196 # 当像素占据的概率小于0.196时候认为是完全空的
- 参数配置
image
:与当前路径下的图片文件保持一致resolution
:与三、4.
中分辨率参数保持相同origin
:根据三、4.
中生成图片的坐标范围和Gazebo中三维地图的坐标原点确定
例如:
- Gazebo地图:
- 图片生成指令
./request_publisher "(-10,-10)(10,10)" 10 0.01 $(pwd)/cloister.png 255 office_desk::link::collision
- 地图文件:
- 进行一步旋转(直接用Ubuntu的Image Viewer):
- 最终的yaml文件
image: cloister.png resolution: 0.010000 origin: [-10.000000, -10.000000, 0.000000] negate: 0 occupied_thresh: 0.65 free_thresh: 0.196