导航

ROS2学习日志:ROS2Cartgrapher使用与调试

Posted on 2020-05-03 23:05  dzyBK  阅读(2151)  评论(0编辑  收藏  举报

1.官源安装与试用

         由apt-get install安装ros-foxy-cartographer-ros、ros-foxy-turtlebot3、ros-foxy-turtlebot3-simulations及ros-foxy-webots-ros2(要求版本≥1.1.1)。

         (1)基于WebotsTurtlebot3Burger测试

source /opt/ros/foxy/setup.bash
ros2 launch webots_ros2_turtlebot robot_launch.py
ros2 launch turtlebot3_cartographer cartographer.launch.py use_sim_time:=true
ros2 run teleop_twist_keyboard teleop_twist_keyboard

         (2)基于GazeboTurtlebot3Burger测试

export TURTLEBOT3_MODEL=burger
source /opt/ros/foxy/setup.bash && source /usr/share/gazebo/setup.sh
ros2 launch turtlebot3_gazebo turtlebot3_world.launch.py
ros2 launch turtlebot3_cartographer cartographer.launch.py use_sim_time:=true
ros2 run turtlebot3_teleop teleop_keyboard
ros2 run nav2_map_server map_saver_cli -f /root/app/map

         (3)基于官方离线数据集测试:

         (4)官方使用手册说明:官方使用手册仍是基于ROS1的,但核心部分其实与ROS1或ROS2无关,如果读者还熟悉ROS1和ROS2,那可以无缝切换。使用手册中以下两部分是核心:

                  ROS服务:https://google-cartographer-ros.readthedocs.io/en/latest/ros_api.html#

                  参数配置:https://google-cartographer-ros.readthedocs.io/en/latest/configuration.html#

2.文件分析与精简

         于https://github.com/ros2/cartographer_ros下载cartographer_ros-1.0.9003.zip:https://github.com/ros2/cartographer_ros/archive/1.0.9003.zip。

         (1)删除~/cartographer_ros_msgs:该包是消息包,无需编译之而直接使用官源安装的,减少编译负担。

         (2)可选删除~/cartographer_rviz:该包仍是基于ROS1的,ROS2编译系统无法识别,编译时会直接跳过该包。

         (3)可选删除~/cartographer_ros外的所有文件和目录:这些文件和目录要么不是关注的重点要么仍是基于ROS1的,删除后,眼不见心不乱。

         (4)可选删除~/cartographer_ros/launch:该目录中的文件仍是基于ROS1的,但可以作为撰写ROS2Launch脚本的参考。

         (5)核心配置:~/cartographer_ros/CMakeLists.txt和~/cartographer_ros/cartographer_ros/CMakeLists,前者包含后者。

         (6)核心源码:~/cartographer_ros/*.h和~/cartographer_ros/*.cc

         (7)主函数文件:共12个文件含main函数

                node_main.cc:生成为结点cartographer_node

                offline_node_main.cc:

                occupancy_grid_node_main.cc:生成为结点ccupancy_grid_node 

                assets_writer_main.cc:

                pbstream_to_ros_map_main.cc:

                pbstream_map_publisher_main.cc:

                rosbag_validate_main.cc:

                rosbag_publisher_main.cc:

                start_trajectory_main.cc:

                trajectory_comparison_main.cc:

                node_grpc_main.cc:

                offline_node_grpc_main.cc:

3.源码修改与编译

         (1)解压核心源码到/root/app/ros2ex/ros2cart使之包含:cartographer_ros, configuration_files, ..., CMakeLists.txt, package.xml

         (2)根据需求修改相应的源码如对node_main.cc->Run添加:for(int k = 0; k < 10; ++k) printf("\n####################<Valid Modification>####################\n");

         (3)终端进入/root/app/ros2ex/out执行:colcon build --merge-install --base-path ..

         (4)测试修改的有效性:测试命令同前,启动后输出上面代码中的字符即表示成功。

         (5)根据需求修改其它的源文件或在搭建Qtcreator调试环境后再进行。

 4.配置精简与编译

         (1)备份/root/app/ros2ex/ros2cart/CMakeLists.txt为CMakeLists.bak,用于后续精简的参照。

         (2)修改CMakeLists.txt和package.xml中包名由cartographer_ros为ros2cart,以免与已有的包冲突。

         (3)精简CMakeLists.txt(主要是移除非必要的依赖和融合ros2cart/cartographer_ros/CMakeLists.txt中的两个结点),并使能用Qtcreator打开编译。

         注意:先执行source /opt/ros/foxy/setup.bash后再打开Qtcreator,以使Qtcreator获得相应的环境设置,否则无法编译通过。

         精简后的配置说明:

         (1)精简后的包(ros2cart)与已有的包(cartographer_ros)不冲突(即两者可以并存),这有利于交叉验证,确保后续对算法的优化朝正确的方向发展。

         (2)精简后的包(ros2cart)与已有的包(cartographer_ros)的除包名不同外,再者就是核心库名不同(前者为libros2cart.a后者为libcartographer_ros),尽管可以用相同的库名,但基于以下原因没有这么做。

                  原因1:采用了ROS2的--merge-install编译选项(ROS2官方包也是如此),这使得两个库必须位于同一目录(~/install/lib)内,若采用相同的库名,则只能存在其中一个。

                  原因2:库名不会被ros2run或ros2launch直接调用,所以不会影响使用端,使用端只会调用可执行程序,而可执行程序位于单独目录(目录名为包名),所以可以不修改可执行程序名。

                  原因3:原包中的CMakeLists.txt直接使用包名作为库名,由于只生成一个库且CMakeLists.txt中多处使用此库,所以使用包名作为库名的是一种好的方式,于是精简包也使用了包名作为库名。

         (3)CMakeLists.txt指定了编译输出路径和结果安装路径且都为/root/app/ros2ex/out,但安装路径仅对ROS2生效,所以Qtcreator只在/root/app/ros2ex/out中有输出而ROS2在/root/app/ros2ex/out和/root/app/ros2ex/out/install下都有输出。

         (4)当前版本(cartographer_ros2-1.0.9002)只生成三个结果:libcartographer_ros.a或libros2cart.a、cartographer_node、occupancy_grid_node。

         (5)基于ros2run或ros2launch启动任意编译工具编译的包:假设有手动编译包名为XXX,编译安装在/root/app/ros2ex/out/install,复制libcartographer_ros.a或libros2cart.a到/root/app/ros2ex/out/install/lib,复制cartographer_node和occupancy_grid_node到/root/app/ros2ex/out/install/lib/XXX。如此操作之后,ros2run或run2launch就可以通过包XXX来启动以上复制到XXX包的结点,已验证此操作具有通用性。于是,Qtcreator的编译结果可以映射为ROS2的编译结果或复制替换ROS2的编译结果,然后通过ROS2来启动。

         (6)精简包测试:修改opt/ros/foxy/share/turtlebot3_cartographer/launch中cartographer.launch.py和occupancy_grid.launch.py中的cartographer_ros为ros2cart,然后使用与前面相同的命令即可启动精简包。

5.Qtcreator调试说明

        

6.ROS服务详细

        

7.参数配置详细