教程七 cartographer建图教程
ugv02使用教程
- 序章 基于ros2开发ugv02功能目录
- 教程一 树莓派基于ros2开发ugv02底盘初始化操作
- 教程二 基于vscode的树莓派远程开发教程
- 教程三 底盘控制教程
- 教程四 手柄遥控教程
- 教程五 ugv02使用雷达教程
- 教程六 cartographer建图教程
- 教程七 nav2导航教程
- 教程八 建图与导航同时进行教程
功能包简介
Cartographer是一个开源的SLAM(Simultaneous Localization and Mapping)库,用于在机器人或移动设备上进行实时建图和定位。它由Google开发并在ROS(Robot Operating System)中得到广泛应用。
Cartographer使用多个传感器(如激光雷达、惯性测量单元和相机)来获取环境的感知数据,并通过SLAM算法将这些数据融合在一起,实现同时定位和建图。它能够在未知环境中实时生成高质量的地图,并提供准确的机器人定位信息。
例程
安装cartographer
使用apt安装cartographer
sudo apt install ros-humble-cartographer sudo apt install ros-humble-cartographer-ros
检查安装情况
ros2 pkg list | grep cartographer
输出下面字样则表示安装成功
cartographer_ros cartographer_ros_msgs
创建功能包
进入工作空间
cd */ugv02/src
创建功能包
ros2 pkg create ugv02_cartographer
创建launch、config文件夹
cd ugv02_cartographer mkdir config launch
编写cartographer建图配置
在ugv02_cartographer/config目录下创建建图配置文件cartographer_2d.lua文件。
include "map_builder.lua" include "trajectory_builder.lua" options = { map_builder = MAP_BUILDER, trajectory_builder = TRAJECTORY_BUILDER, map_frame = "map", -- 地图帧的名称 tracking_frame = "laser_link", -- 跟踪帧的名称 published_frame = "base_link", -- 发布帧的名称 odom_frame = "odom", -- 里程计帧的名称 provide_odom_frame = true, -- 是否提供里程计帧 publish_frame_projected_to_2d = false, -- 是否发布2d姿态 use_pose_extrapolator = false, use_odometry = false, -- 是否使用里程计 use_nav_sat = false, -- 是否使用导航卫星 use_landmarks = false, -- 是否使用地标 num_laser_scans = 1, -- 激光雷达的数量 num_multi_echo_laser_scans = 0, -- 多回波激光雷达的数量 num_subdivisions_per_laser_scan = 1, -- 每个激光扫描的细分数量 num_point_clouds = 0, -- 点云的数量 lookup_transform_timeout_sec = 0.2, -- 查找变换的超时时间(秒) submap_publish_period_sec = 0.3, -- 子地图发布周期(秒) pose_publish_period_sec = 5e-3, -- 姿态发布周期(秒) trajectory_publish_period_sec = 30e-3, -- 轨迹发布周期(秒) rangefinder_sampling_ratio = 1., -- 测距仪采样比率 odometry_sampling_ratio = 1., -- 里程计采样比率 fixed_frame_pose_sampling_ratio = 1., -- 固定帧姿态采样比率 imu_sampling_ratio = 1., -- IMU采样比率 landmarks_sampling_ratio = 1., -- 地标采样比率 } MAP_BUILDER.use_trajectory_builder_2d = true -- 是否启动2D SLAM TRAJECTORY_BUILDER_2D.submaps.num_range_data = 35 -- 2D轨迹构建器中子地图的范围数据数量 TRAJECTORY_BUILDER_2D.min_range = 0.1 -- 限制在雷达最小扫描范围,比机器人半径小的都忽略 TRAJECTORY_BUILDER_2D.max_range = 3.5 -- 限制在雷达最大扫描范围 TRAJECTORY_BUILDER_2D.missing_data_ray_length = 5. -- 限制在雷达最大扫描范围 TRAJECTORY_BUILDER_2D.use_imu_data = false -- 是否使用IMU数据 TRAJECTORY_BUILDER_2D.use_online_correlative_scan_matching = true -- 是否使用实时回环检测扫描匹配 TRAJECTORY_BUILDER_2D.motion_filter.max_angle_radians = math.rad(0.1) -- 1.0改成0.1,提高对运动的敏感度 POSE_GRAPH.constraint_builder.min_score = 0.65 -- 0.55改成0.65,Fast csm的最低分数,高于此分数才进行优化。 POSE_GRAPH.constraint_builder.global_localization_min_score = 0.7 --0.6改成0.7,全局定位最小分数,低于此分数则认为目前全局定位不准确 return options
在路径src/ugv02_cartographer/launch/下新建cartographer.launch.py文件,接下来将开始编写启动cartographer建图节点的launch文件。
import os from launch import LaunchDescription from launch.substitutions import LaunchConfiguration from launch_ros.actions import Node from launch_ros.substitutions import FindPackageShare def generate_launch_description(): # 定位功能包 pkg_share = FindPackageShare(package='ugv02_cartographer').find('ugv02_cartographer') #配置节点启动信息 use_sim_time = LaunchConfiguration('use_sim_time', default='true') # 地图的分辨率 resolution = LaunchConfiguration('resolution', default='0.05') # 地图的发布周期 publish_period_sec = LaunchConfiguration('publish_period_sec', default='1.0') # 配置文件夹路径 configuration_directory = LaunchConfiguration('configuration_directory',default= os.path.join(pkg_share, 'config') ) # 配置文件 configuration_basename = LaunchConfiguration('configuration_basename', default='cartographer_2d.lua') #声明节点 cartographer_node = Node( package='cartographer_ros', executable='cartographer_node', name='cartographer_node', output='screen', parameters=[{'use_sim_time': use_sim_time}], arguments=['-configuration_directory', configuration_directory, '-configuration_basename', configuration_basename]) cartographer_occupancy_grid_node = Node( package='cartographer_ros', executable='cartographer_occupancy_grid_node', name='cartographer_occupancy_grid_node', output='screen', parameters=[{'use_sim_time': use_sim_time}], arguments=['-resolution', resolution, '-publish_period_sec', publish_period_sec]) #启动文件 ld = LaunchDescription() ld.add_action(cartographer_node) ld.add_action(cartographer_occupancy_grid_node) return ld
打开src/ugv02_cartographer/CmakeLists.txt,添加安装指令,使编译后系统能找到这些文件。
install( DIRECTORY config launch DESTINATION share/${PROJECT_NAME} )
编译
返回工作空间并编译
cd ~/ugv02 colcon build
运行测试
新开一个终端页面,进入工作空间,source一下,以及启动*教程五 ugv02使用雷达教程中的雷达(确保串口已授权)
cd ~/ugv02 source ./install/setup.bash ros2 launch ldlidar_stl_ros2 ld19.launch.py
新开一个终端页面,进入工作空间,source一下,以及启动建图
cd ~/ugv02 source ./install/setup.bash ros2 launch ugv02_cartographer cartographer.launch.py
在装有ubuntu系统及ros2的电脑(虚拟机)中,确保该电脑与树莓派连接了同一个网络或wifi,新开一个终端。
rviz2
点击rviz左下角的add按钮,在rviz中添加控件以显示地图
地图效果如下
接下来你可以按照*教程五 ugv02使用雷达教程在rviz中添加雷达点云数据显示及车辆坐标系,接着参照*教程三 底盘控制教程控制小车移动,观察建图效果和过程。
当你觉得图建的差不多的时候,使用以下命令保存地图。
先安装地图管理功能包。
sudo apt install ros-humble-nav2-map-server
运行地图保存命令最后一个参数为地图路径及名字。
ros2 run nav2_map_server map_saver_cli -f ./map