在跑第四讲建图部分的时候,确实这一讲的作业没什么难度,就是单纯的调代码,自上次被恶心到摆烂了一周,今天实在是良心说不过去,赶紧学一学,,,
以下为正文:
版本:Ubuntu20.04 + noetic + proto 3.6.1
图1.建图环节流程图 图2.定位环节流程图
(图片来源自--深蓝学院多传感器融合课程--课件PPT-第四讲)
这一讲的任务主要是跑通该框架,但是由于定位环节代码中只给出了已知初始位姿的定位方法,所以还需要对matching进行修改和填补完成在任意时刻的定位(这一部分我就不放了,我打算第二遍学这个课程的时候再细究,欢迎持续关注(doge)),先说跑mapping代码时候遇到的问题。
问题1:error: ‘std::string_view’ has not been declared
只要提示类似的命名空间中缺少**成员这样类似的问题,大概率是C++的版本不够,需要去CMakeLists中进行修改,只需要将以下两行中的代码中的C++14(有些是C++11)调整为C++17
add_definitions(-std=c++17)
set(CMAKE_CXX_FLAGS "-std=c++17")
有时候会出现自己的电脑不匹配C++版本的报错,有时候是自己的版本不适配C++17,太旧了导致,有个博主提供了linux查看自己编译器支持的C++版本的办法。
问题2:For frame [/map]: Frame [/map] does not exist && [ERROR]:No tramsform for odometry from "/map" to "map".
出现这个的问题,仍然与我们的ros版本有关,这里具体错误的贴图我就不放了,我的几次记录博客基本上都会再提一次这个问题,由于我们是Ubuntu20.04和ros-noetic版本,所以使用的tf变换方式是基于坐标变换 tf2 版本的,而tf2不支持带"/"的topic,所以要在代码中发布和订阅话题的cpp文件,以及对应的rviz话题中去掉topic中的"/",例如修改
nh.param<std::string>("/odom_topic", odom_topic, "/laser_odom");
为
nh.param<std::string>("odom_topic", odom_topic, "laser_odom");
注意,此处仅为修改示例,源码中可能有不同。ros和C++的新手宝宝要注意,修改的时候要修改的是话题,千万别把所有带"/"的代码都改了(比如文件路径,,,),要先看看错误是什么再改,不然容易越改越错。
问题3:rviz窗口中出现:unknow frame map
这个问题,应该是在tf变换中的代码出现了一些问题导致的(上次也有类似的问题,但是上次是warning,这次是ERROR),在我的电脑上运行完全不影响建图和轨迹,但是由于内存不够造,所以我的代码还是会跑到2/3就崩掉,导致只有初始位置的关键帧输出,map和scan数据保存不下来(我觉得应该就是因为保存全局地图的时候,给我卡没了,,)。所以这个问题的解决办法,目前我还没找到,但是既然不影响我运行(甚至命令窗口都没报错),那就是没什么大问题,我就当没错的来0.0。
目前只是作为记录,将课程过一遍,跑通代码就好,第二遍学习的时候我会更新一下设备(升级内存呜呜呜)然后结合理论,深入的研究和调试,并且分享和记录,欢迎大家一起学习!