上一章介绍了Cartographer的安装运行及可能出现的问题,在文章的最后放上了一张自己建的实验室楼道图像,因为是ROS格式的地图,所以看起来并没有那么有立体感。为了更为直观的感受Cartographer3D建图的震撼效果,特地去钻研了下如何将Cartographer程序运行完毕得到的pbstream文件转换为点云文件进行查看,下面跟着我一起去摸索、体验3D建图的震撼与快乐吧!
说明:以下所有终端运行是建立在home目录下的工作空间carto_ws文件夹基础上,数据集放在home目录下的Downloads文件夹下。
第一步,下载官方数据集3D包
我用的是b3-2016-04-05-13-54-42.bag,可采用如下命令进行下载。
wget -P ~/Downloads https://storage.googleapis.com/cartographer-public-data/bags/backpack_3d/b3-2016-04-05-13-54-42.bag
附上其他数据集(3D)的下载方式:
(1)这个数据集是用来和上面那个搭配使用演示cartographer的纯定位功能。
wget -P ~/Downloads https://storage.googleapis.com/cartographer-public-data/bags/backpack_3d/b3-2016-04-05-15-52-20.bag
(2)这个数据集则是另一个3D包,我还暂时没有跑过。
wget -P ~/Downloads https://storage.googleapis.com/cartographer-public-data/bags/backpack_3d/with_intensities/b3-2016-04-05-14-14-00.bag
第二步,利用launch文件对数据集进行实时建图
终端指令如下:
roslaunch cartographer_ros demo_backpack_3d.launch bag_filename:=/home/jin/Downloads/b3-2016-04-05-13-54-42.bag
终端指令说明:指令中的/home/jin请替换成自己电脑下的home目录名称。
在建完数据集的地图后,Cartographer不会自己结束并保存地图,需要利用ROS的service服务进行手动保存,终端指令如下:
rosservice call /finish_trajectory "trajectory_id: 0"
rosservice call /write_state "filename:'b3-2016-04-05-13-54-42.bag.pbstream'
include_unfinished_submaps: false"
终端指令说明:指令中/finish_trajectory和/write_state为cartographer提供的服务名称,后面引号内的各个名称为相应参数,可以自行配置,我只是配置了指令2中的filename名称,以便后续可视化的运行。这里需要强调说明下:默认情况下,文件会保存在home目录下的.ros文件夹下,建议将该文件移动到home目录下的Downloads文件夹下以便统一管理,终端指令如下所示:
cd ~/.ros
sudo mv b3-2016-04-05-13-54-42.bag.pbstream ../Downloads
此时在Downloads文件夹下会有b3-2016-04-05-13-54-42.bag和b3-2016-04-05-13-54-42.bag.pbstream,做到这一步,小伙伴们可以查验下文件夹是否有这两个文件,以便后续可视化工作的顺利开展。
第三步,保存点云数据
首先,修改carto_ws/src/cartographer_ros/cartographer_ros/configuration_files/assets_writer_backpack_3d.lua文件,文件内容截图如下所示:
可以从截图中看到,与原来文件相比,我在最后部分的内容里增添了一个action以便后续启动相关launch文件后可以生成对应.ply文件。
{
action = "write_ply",
filename = "points.ply",
},
然后切换到/carto_ws文件夹下重新编译,并进行source刷新。
catkin_make_isolated --use-ninja
source devel_isolated/setup.bash
最后启用assets_writer_backpack_3d.launch文件生成.ply文件,终端指令如下:
roslaunch cartographer_ros assets_writer_backpack_3d.launch bag_filenames:=/home/jin/Downloads/b3-2016-04-05-13-54-42.bag pose_graph_filename:=/home/jin/Downloads/b3-2016-04-05-13-54-42.bag.pbstream
终端指令说明:bag_filenames和pose_graph_filename参数后面跟的路径名,请各位小伙伴换成自己电脑下的路径,也就是第二步里面提到的这两个文件。
运行完成后会有如下红字报错显示,此类属于正常现象。
可以查看carto_ws文件夹下是否出现.ply文件以及灰度和彩色的6张图片,如下图所示:
第四步,将点云数据可视化
方式一
利用pcl_ply2pcd将ply格式转换为pcd格式进行查看,即在终端输入如下命令:
pcl_ply2pcd b3-2016-04-05-13-54-42.bag_points.ply test1.pcd
方式二(推荐)
点开此处链接下载或者采用git clone的方式。
以下默认是将Cartographer的点云可视化库放在/carto_ws目录下的point_cloud_viewer-master文件夹下
git clone https://github.com/googlecartographer/point_cloud_viewer
1.下载Cartographer的点云可视化库进行转化显示,下载完成后进行编译安装。
(1)在编译之前,我们需要安装一些依赖,运行如下指令安装Rust:
curl https://sh.rustup.rs -sSf | sh
运行指令后若是显示curl: (6) Could not resolve host: sh.rustup.rs,建议挂下VPN再进行。
成功安装后截图如下所示:
(2)运行如下指令对所有子模块进行初始化:
git submodule update --init --recursive
若是运行该指令出现如下情形,导致错误,可以在当前目录下输入git init解决:
(3)最后 ,进行编译。
cargo build --release
编译时可能会出现问题,现在我将我碰到的问题与各位小伙伴分享,以便少走弯路。
问题一:
问题定位: (1)上一步初始化子模块步骤git submodule update --init --recursive没有成功。
(2)point_cloud_viewer-master/third_party/protobuf/文件夹为空。
解决方案:针对(1),回到上一步看看是否为未进行git init的原因。
针对(2),注意检查point_cloud_viewer-master/third_party/protobuf/路径下是否为空(因为采用手动下载可能导致某些文件夹丢失数据现象的出现),若是为空,请点击此链接下载对该文件夹进行补充。
编译安装成功截图如下所示:
2.利用build_octree工具生成可视化需要的点云图文件结构。
target/release/build_octree
/home/jin/Downloads/b3-2016-04-05-13-54-42.bag_points.ply
--output-directory /home/jin/cartographer/carto_viewer_ws/cloud/
终端指令说明:
第2个参数是前面生成的ply文件地址,--output-directory后面跟的第3个参数建议新建一个cloud文件夹放生成的点云图的各类文件以便管理。
温馨提示:在运行build_octree工具生成点云图时需要留有足够的内存空间,否则会失败,我这个在运行时文件夹直接膨胀到50多个G,在后面会慢慢缩减到10个G。
完成后如图所示,该文件夹下有各类文件:
3.利用sdl-viewer进行可视化
cd point_cloud_viewer-master/sdl_viewer/
sudo apt-get install libsdl2-dev
cargo build --release
../target/release/sdl_viewer /home/jin/cartographer/carto_viewer_ws/cloud
终端指令说明:指令1是进入下载的可视化库文件夹下的sdl_viewer文件夹,指令5后面跟的参数就是上一步新建的cloud文件夹路径。
当然,这里也有可能会出现相应问题。
问题二:
定位问题:当前环境下依赖sdl2未成功安装。
解决方案:当前目录下终端输入如下指令
sudo apt-get install libsdl2-dev
第五步,可视化效果图展示
当小伙伴们过五关斩六将进行到这一步时,就可以初步收获自己配置的成果啦!以下是我个人的效果图展示,后面会更新如何使用自己的数据集来建可视化3D图,希望各位小伙伴能多多支持!
温馨提示:
sdl2_viewer窗口可以使用键盘上的“上下左右”键进行旋转,用“WS”键控制缩放,用“AD”键控制左右平移。