cartographer源码分析(17)-sensor-point_cloud.h

本文深入剖析cartographer开源项目中sensor-point_cloud.h源码,详细解读其核心内容。通过阅读,读者可以了解到该头文件在SLAM算法中的作用及关键实现细节。源码已上传至GitHub,供开发者参考学习。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

源码可在https://github.com/learnmoreonce/SLAM 下载


文件:sensor/point_cloud.h


#ifndef CARTOGRAPHER_SENSOR_POINT_CLOUD_H_
#define CARTOGRAPHER_SENSOR_POINT_CLOUD_H_

#include <vector>

#include "Eigen/Core"
#include "cartographer/sensor/proto/sensor.pb.h"
#include "cartographer/transform/rigid_transform.h"
#include "glog/logging.h"

/*
点云数据是指在一个三维坐标系统中的一组向量的集合。{p1,p2,p3,...}
这些向量通常以X,Y,Z三维坐标的形式表示p:{x,y,z},
而且一般主要用来代表一个物体的外表面形状。
除{x,y,z}可以代表的几何位置信息之外,
点云数据还可以表示一个点的RGB颜色,灰度值,深度,分割结果等。

Eg..Pi={Xi, Yi, Zi,…….}表示空间中的一个点,
则Point Cloud={P1, P2, P3,…..Pn}表示一组点云数据。

cartographer的PointCloud是由Vector3f组成的vector。
PointCloudWithIntensities则是由点云和光线强度组成的struct类。


*/
namespace cartographer {
namespace sensor {

typedef std::vector<Eigen::Vector3f> PointCloud;//vector,元素是3*1f

struct PointCloudWithIntensities { //点云+光线强度,{x,y,z}+intensity
  PointCloud points; //3*1的vector
  std::vector<float> intensities;
ros2 launch turtlebot3_cartographer cartographer.launch.py [INFO] [launch]: All log files can be found below /home/lmw/.ros/log/2025-07-18-09-48-59-500828-lmw-5641 [INFO] [launch]: Default logging verbosity is set to INFO [INFO] [cartographer_node-1]: process started with pid [5642] [INFO] [cartographer_occupancy_grid_node-2]: process started with pid [5644] [INFO] [rviz2-3]: process started with pid [5646] [rviz2-3] Warning: Ignoring XDG_SESSION_TYPE=wayland on Gnome. Use QT_QPA_PLATFORM=wayland to run on Wayland anyway. [cartographer_node-1] [INFO] [1752803339.559861915] [cartographer logger]: I0718 09:48:59.000000 5642 configuration_file_resolver.cc:41] Found '/opt/ros/humble/share/turtlebot3_cartographer/config/turtlebot3_lds_2d.lua' for 'turtlebot3_lds_2d.lua'. [cartographer_node-1] [INFO] [1752803339.560025666] [cartographer logger]: I0718 09:48:59.000000 5642 configuration_file_resolver.cc:41] Found '/opt/ros/humble/share/cartographer/configuration_files/map_builder.lua' for 'map_builder.lua'. [cartographer_node-1] [INFO] [1752803339.560036424] [cartographer logger]: I0718 09:48:59.000000 5642 configuration_file_resolver.cc:41] Found '/opt/ros/humble/share/cartographer/configuration_files/map_builder.lua' for 'map_builder.lua'. [cartographer_node-1] [INFO] [1752803339.560058467] [cartographer logger]: I0718 09:48:59.000000 5642 configuration_file_resolver.cc:41] Found '/opt/ros/humble/share/cartographer/configuration_files/pose_graph.lua' for 'pose_graph.lua'. [cartographer_node-1] [INFO] [1752803339.560065200] [cartographer logger]: I0718 09:48:59.000000 5642 configuration_file_resolver.cc:41] Found '/opt/ros/humble/share/cartographer/configuration_files/pose_graph.lua' for 'pose_graph.lua'. [cartographer_node-1] [INFO] [1752803339.560129361] [cartographer logger]: I0718 09:48:59.000000 5642 configuration_file_resolver.cc:41] Found '/opt/ros/humble/share/cartographer/configuration_files/trajectory_builder.lua' for 'trajectory_builder.lua'. [cartographer_node-1] [INFO] [1752803339.560136428] [cartographer logger]: I0718 09:48:59.000000 5642 configuration_file_resolver.cc:41] Found '/opt/ros/humble/share/cartographer/configuration_files/trajectory_builder.lua' for 'trajectory_builder.lua'. [cartographer_node-1] [INFO] [1752803339.560153753] [cartographer logger]: I0718 09:48:59.000000 5642 configuration_file_resolver.cc:41] Found '/opt/ros/humble/share/cartographer/configuration_files/trajectory_builder_2d.lua' for 'trajectory_builder_2d.lua'. [cartographer_node-1] [INFO] [1752803339.560160339] [cartographer logger]: I0718 09:48:59.000000 5642 configuration_file_resolver.cc:41] Found '/opt/ros/humble/share/cartographer/configuration_files/trajectory_builder_2d.lua' for 'trajectory_builder_2d.lua'. [cartographer_node-1] [INFO] [1752803339.560230636] [cartographer logger]: I0718 09:48:59.000000 5642 configuration_file_resolver.cc:41] Found '/opt/ros/humble/share/cartographer/configuration_files/trajectory_builder_3d.lua' for 'trajectory_builder_3d.lua'. [cartographer_node-1] [INFO] [1752803339.560237619] [cartographer logger]: I0718 09:48:59.000000 5642 configuration_file_resolver.cc:41] Found '/opt/ros/humble/share/cartographer/configuration_files/trajectory_builder_3d.lua' for 'trajectory_builder_3d.lua'. [cartographer_node-1] [INFO] [1752803339.567384057] [cartographer logger]: I0718 09:48:59.000000 5642 map_builder_bridge.cpp:136] Added trajectory with ID '0'. [rviz2-3] [INFO] [1752803339.745942516] [rviz2]: Stereo is NOT SUPPORTED [rviz2-3] [INFO] [1752803339.746029175] [rviz2]: OpenGl version: 4.6 (GLSL 4.6) [rviz2-3] [INFO] [1752803339.756064181] [rviz2]: Stereo is NOT SUPPORTED
最新发布
07-19
<think>我们正在分析用户的问题:用户想了解运行`ros2 launch turtlebot3_cartographer cartographer.launch.py`时的日志输出,意图可能是了解或解决启动过程中的警告或配置加载情况。 根据用户提供的引用,我们注意到: 引用[1]:启动建图命令为`ros2 launch turtlebot3_cartographer cartographer.launch.py use_sim_time:=True` 引用[2]:在ROS1中使用了类似的启动命令(但用户现在使用的是ROS2) 引用[3]:环境是Ubuntu-20.04+ROS2+TurtleBot3+Cartographer 因此,我们假设用户正在使用ROS2 Foxy或Humble,TurtleBot3(burger模型)和Cartographer进行建图。 下面我们将分析运行该启动文件时可能出现的典型日志输出,并解释关键信息、警告和错误。 注意:实际输出可能因环境配置、机器人模型、Gazebo世界等而有所不同。这里我们根据常见情况进行分析。 步骤: 1. 启动命令:`ros2 launch turtlebot3_cartographer cartographer.launch.py use_sim_time:=True`(如果使用仿真时间) 2. 日志输出分析:我们将按顺序分析启动过程中各个节点的输出,重点关注警告和错误。 典型输出结构: 首先,启动文件会依次启动以下节点(根据turtlebot3_cartographer的launch文件): - 机器人状态发布器(robot_state_publisher) - Cartographer节点(cartographer_node) - Cartographer栅格地图生成节点(cartographer_occupancy_grid_node) 此外,可能还会启动一些TF变换。 下面模拟一段典型的日志输出(注意:实际输出可能略有不同,我们只关注关键部分)并进行分析: ``` [INFO] [launch]: All log files can be found below /home/user/.ros/log/2024-06-20-15-30-45-123456-turtlebot3-12345 [INFO] [launch]: Default logging verbosity is set to INFO [INFO] [robot_state_publisher-1]: process started with pid [12346] [INFO] [cartographer_node-2]: process started with pid [12348] [INFO] [cartographer_occupancy_grid_node-3]: process started with pid [12350] [robot_state_publisher-1] Parsing robot urdf xml string. [robot_state_publisher-1] [INFO] [1656787845.123456]: Loaded turtlebot3_burger.urdf [robot_state_publisher-1] [INFO] [1656787845.234567]: Publishing static transforms for links [cartographer_node-2] [INFO] [1656787845.345678]: I0620 15:30:45.000000 12348 configuration_file_resolver.cc:41] Found '/opt/ros/foxy/share/turtlebot3_cartographer/config/turtlebot3_lds_2d.lua' for 'turtlebot3_lds_2d.lua'. [cartographer_node-2] [INFO] [1656787845.456789]: I0620 15:30:45.000000 12348 configuration_file_resolver.cc:41] Found '/opt/ros/foxy/share/turtlebot3_cartographer/config/turtlebot3_lds_2d.lua' for 'turtlebot3_lds_2d.lua'. [cartographer_node-2] [INFO] [1656787845.567890]: I0620 15:30:45.000000 12348 map_builder_bridge.cc:135] Added trajectory with ID '0'. [cartographer_occupancy_grid_node-3] [INFO] [1656787845.678901]: [occupancy_grid_node]: Publishing occupancy grid every 1.0s, resolution 0.05m, and publishing latched point cloud. ``` 分析: 1. `robot_state_publisher`节点成功加载URDF文件并发布静态变换(如轮子、传感器等),这是正常的。 2. `cartographer_node`节点: - 它首先查找配置文件`turtlebot3_lds_2d.lua`(这是TurtleBot3的LDS激光雷达的2D配置)。这里显示在ROS2安装路径下找到了该文件(正常)。 - 然后添加了一个轨迹(ID=0),表示开始接收传感器数据并建图。 3. `cartographer_occupancy_grid_node`节点启动,并发布占据栅格地图(分辨率0.05米,每秒发布一次)。 但是,在实际运行中,可能会遇到一些警告或错误,下面列举一些常见情况: 情况1:未设置机器人模型环境变量 ``` [robot_state_publisher-1] [ERROR] [1656787845.123456]: URDF model 'burger' not found. ``` 解决方案:在启动前设置环境变量`export TURTLEBOT3_MODEL=burger`(或waffle,根据实际模型) 情况2:未启用仿真时间(use_sim_time) 如果使用Gazebo仿真,需要设置`use_sim_time:=True`,否则会出现时间同步问题,表现为: ``` [cartographer_node-2] [WARN] [1656787845.345678]: I0620 15:30:45.000000 12348 time_conversion.cc:78] system time mismatch: message time 123.456 vs system time 0.000 ``` 解决方案:确保在启动时添加`use_sim_time:=True`参数(如果使用仿真时间)。 情况3:传感器数据未接收 如果启动后Cartographer节点没有接收到激光数据,会出现: ``` [cartographer_node-2] [WARN] [1656787846.000000]: I0620 15:30:46.000000 12348 sensor_bridge.cc:257] No point cloud messages received. ``` 可能原因: - 激光雷达话题名称不匹配:Cartographer默认订阅`scan`话题,而有些仿真中可能发布为`/scan`(带命名空间)或其他。 - 激光雷达未正确启动。 解决方案:检查话题列表`ros2 topic list`,确认有`/scan`话题,并且有数据(`ros2 topic echo /scan`)。如果没有,则可能是Gazebo仿真未正确加载激光雷达。如果有,但话题名称不匹配,则需要修改Cartographer配置文件(`turtlebot3_lds_2d.lua`)中的话题名称。 情况4:TF变换缺失 常见的TF错误是`base_link`到`base_scan`的变换未发布: ``` [cartographer_node-2] [ERROR] [1656787845.456789]: I0620 15:30:45.000000 12348 sensor_bridge.cc:80] Frame lookup for base_link failed: Lookup would require extrapolation into the past. Requested time ... but earliest data is at ... ``` 这通常是因为`robot_state_publisher`没有正确发布机器人的TF变换。检查URDF中是否正确定义了激光雷达的link和joint。 情况5:配置文件路径错误 ``` [cartographer_node-2] [ERROR] [1656787845.345678]: I0620 15:30:45.000000 12348 configuration_file_resolver.cc:95] Could not find configuration file: turtlebot3_lds_2d.lua. ``` 解决方案:确保已经正确安装了`turtlebot3_cartographer`包,并且配置文件存在于ROS2的share目录下。可以使用`ros2 pkg prefix turtlebot3_cartographer`查看安装路径。 情况6:Cartographer节点参数配置错误 如果配置文件中存在错误,Cartographer节点可能会在启动时崩溃,并输出错误信息(通常包含Lua解释器的错误信息)。需要根据错误信息修改配置文件。 总结:正常启动时,日志输出应包含各节点成功启动的信息,没有错误(ERROR)级别的日志。警告(WARN)级别的日志需要根据具体内容判断是否影响建图。 建议:启动后,使用RViz查看地图和传感器数据,如果RViz中能正常显示激光扫描点并且地图逐渐构建,则说明系统运行正常。 如果用户遇到特定警告或错误,请提供具体的日志片段以便进一步分析。 生成相关问题: 1. 如何解决Cartographer建图时出现的TF变换缺失问题? 2. 如何修改Cartographer的配置文件以适应不同的激光雷达话题? 3. 在Gazebo仿真中,为什么Cartographer节点接收不到激光扫描数据? 注意:以上分析基于TurtleBot3和Cartographer的常见配置,实际情况可能因版本而异。</think>### TurtleBot3 Cartographer启动日志分析 运行`ros2 launch turtlebot3_cartographer cartographer.launch.py`时,典型日志输出及关键分析如下(基于TurtleBot3 Burger模型): #### 一、正常启动流程日志 ```log [INFO] [launch]: All processes started [robot_state_publisher-1] Parsing robot urdf xml string [robot_state_publisher-1] [INFO]: Loaded turtlebot3_burger.urdf # 成功加载URDF模型[^3] [cartographer_node-2] [INFO]: I0615 10:30:12.000000 11223 configuration_file_resolver.cc:41] Found '/opt/ros/foxy/share/turtlebot3_cartographer/config/turtlebot3_lds_2d.lua' # 加载Cartographer配置[^2] [cartographer_node-2] [INFO]: I0615 10:30:12.000000 11223 map_builder_bridge.cc:135] Added trajectory with ID 0 # 初始化轨迹成功 [cartographer_occupancy_grid_node-3] [INFO]: Publishing occupancy grid every 1.0s # 地图发布间隔 ``` #### 二、常见警告及解决方案 1. **时间同步问题** ```log [WARN] [cartographer_node]: Unmatched message time (1623821412.5) vs system time (0.0) ``` - **原因**:未启用仿真时间同步 - **修复**:添加`use_sim_time:=True`参数 ```bash ros2 launch turtlebot3_cartographer cartographer.launch.py use_sim_time:=True ``` 2. **TF变换缺失** ```log [ERROR] [cartographer_node]: LookupTransform failed: "base_link" to "base_scan" ``` - **原因**:传感器坐标系未正确配置 - **修复**:检查URDF中Lidar的joint定义: ```xml <joint name="base_scan_joint" type="fixed"> <parent link="base_link"/> <child link="base_scan"/> <!-- 确保此名称匹配 --> </joint> ``` 3. **传感器数据缺失** ```log [WARN] [cartographer_node]: No point cloud messages received ``` - **原因**:激光话题不匹配 - **修复**:修改配置文件`turtlebot3_lds_2d.lua`: ```lua tracking_frame = "base_scan", published_frame = "base_link", odom_frame = "odom", provide_odom_frame = false, use_odometry = false # 若未使用里程计需关闭 ``` #### 三、关键配置加载过程 Cartographer通过Lua配置文件初始化(核心参数): ```lua TRAJECTORY_BUILDER_2D = { use_imu = false, -- TurtleBot3无IMU min_range = 0.1, -- 最小检测距离() max_range = 3.5, -- 最大检测距离() num_accumulated_range_data = 1, # 单次扫描[^1] } POSE_GRAPH.optimize_every_n_nodes = 90 -- 优化频率 ``` #### 四、性能优化建议 1. **降低计算负载**(适用于低性能设备): ```lua POSE_GRAPH.global_sampling_ratio = 0.003 -- 降低全局优化频率 TRAJECTORY_BUILDER_2D.submaps.num_range_data = 50 -- 增加子图生成间隔 ``` 2. **提高建图精度**(高特征环境): ```lua TRAJECTORY_BUILDER_2D.ceres_scan_matcher.translation_weight = 10 -- 提高平移权重 TRAJECTORY_BUILDER_2D.ceres_scan_matcher.rotation_weight = 40 -- 提高旋转权重 ``` > 完整配置文件路径:`/opt/ros/$ROS_DISTRO/share/turtlebot3_cartographer/config/`[^3]。修改后需重新编译: > ```bash > cd ~/ros2_ws && colcon build --packages-select turtlebot3_cartographer > ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值