Cartographer与Cartographer_ros完美编译运行

本文档详细介绍了在Ubuntu系统中如何创建工作空间、安装ROS依赖、配置rosdep、下载cartographer和cartographer_ros源码,以及安装abseil库。通过一步步的指令,指导用户成功编译和安装Cartographer,并解决可能出现的libgflags编译错误问题,确保Cartographer的完整安装和运行。

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

创建工作空间 进入工作空间安装rosdep先决依赖

mkdir -p ~/cartographer_ws/src 
sudo apt install python3-pip python-pip -y

在这里插入图片描述
安装配置rosdep

##换源建议换阿里源+中科大ROS源
##安装rosdep 使用小鱼的rosdepc完美安装
pip3 install rosdepc
sudo rosdepc init
rosdepc update

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
安装编译cartographer的必要依赖

sudo apt install -y python-wstool python-rosdep ninja-build 

在这里插入图片描述
从gitee上下载cartographer和cartographer_ros的源码 我这里随便找了两个人的下载了一下

cd ~/cartographer_ws/src 
git clone https://gitee.com/c1h2/cartographer_ros.git
git clone https://gitee.com/Coxhuang/cartographer.git

在这里插入图片描述

###进入安装abseil
sudo apt-get install stow -y
cd ~/cartographer_ws/src/cartographer/scripts
./install_abseil.sh

在这里插入图片描述

cd ~/cartographer_ws
##这里的话会把依赖都安装上包括lua glog protobuf等
sudo rosdep install --from-paths src --ignore-src --rosdistro=${ROS_DISTRO} -y
##编译安装cartographer 这里等待10分钟即可安装成功
catkin_make_isolated --install --use-ninja
source install_isolated/setup.bash

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
到这里就完美安装成功了。

附: (我没遇到过这个问题 如果遇到这个问题解决方法如下)

#在执行 "catkin_make_isolated --install --use-ninja" 时候,报出如下关于libgflags的错误。

/usr/local/lib/libgflags.a: error adding symbols: Bad value 
collect2: error: ld returned 1 exit status
ninja: build stopped: subcommand failed.
<== Failed to process package 'cartographer_rviz':

#解决
#重新编译libgflags,在编译的时候使用 "export CXXFLAGS="-fPIC" && cmake .. && make VERBOSE=1" 代替 cmake .. ,具体操作如下:

git clone https://github.com/gflags/gflags
cd ~/gflags
mkdir build
cd build 
export CXXFLAGS="-fPIC" && cmake .. && make VERBOSE=1
make -j
sudo make install

#然后重新 "catkin_make_isolated --install --use-ninja",并接着下边的操作完成cartographer的编译与运行。
<think>我们之前已经讨论过关于`collect_metrics`标志重复定义的问题。根据用户反馈,他们尝试查找该标志的定义位置但失败。现在,结合用户提供的引用[1]中的信息(关于安装版本的选择),我们可能需要从版本兼容性角度深入分析。 ### 问题根源 引用[1]提到安装特定版本的cartographer(1.0.0)和cartographer_ros(1.0.0)。但请注意: 1. **Cartographer核心库**在早期版本中可能未将`collect_metrics`作为原生配置项 2. **Cartographer_ROS**在ROS2分支中可能自行定义了该标志(导致重复) ### 解决方案(更新版) #### 步骤1:确认版本兼容性 - 检查当前安装的cartographer版本: ```bash cd ~/cartographer_ws/src/cartographer git log -1 --oneline ``` - 若版本低于2.0.0(如1.0.0),则需升级: ```bash git checkout master # 或明确切换到支持ROS2的版本 git pull ``` #### 步骤2:修正重复定义(手动修改) - **定位重复定义文件**(用户反馈查找失败): ```bash grep -rn "DEFINE_.*(collect_metrics" ~/cartographer_ws/src/cartographer_ros/ ``` 典型输出: ``` src/offline_node.cpp:120:DEFINE_bool(collect_metrics, false, "Enable metrics collection"); src/node_main.cpp:42:DEFINE_bool(collect_metrics, false, "Enable metrics collection"); ``` - **注释重复行**(保留一处即可): - 在`node_main.cpp`中保留(作为主入口) - 在`offline_node.cpp`中注释掉`DEFINE_bool(collect_metrics,...)`行 #### 步骤3:使用参数传递替代(推荐) 修改`offline_node.cpp`中调用方式: ```diff - cartographer_ros::ScopedRosLogSink ros_log_sink; - cartographer_ros::RunOfflineNode(FLAGS_configuration_directory, FLAGS_configuration_basename, FLAGS_bag_filenames, FLAGS_load_state_filename, FLAGS_collect_metrics); + auto options = cartographer_ros::LoadOptions(FLAGS_configuration_directory, FLAGS_configuration_basename); + options.collect_metrics = FLAGS_collect_metrics; // 从标志读取值 + cartographer_ros::RunOfflineNode(options, ...); // 传递options对象 ``` #### 步骤4:验证安装依赖 引用[1]提到避免重复安装proto3(ROS冲突)。执行: ```bash # 检查protobuf版本 protoc --version # 应为3.0.0以上 # 若冲突则卸载系统protobuf sudo apt remove libprotobuf-dev protobuf-compiler ``` ### 预防措施 1. **统一版本管理**: ```bash # 在workspace中固定版本 cd ~/cartographer_ws/src wstool set -t src cartographer_ros --git https://github.com/ros2/cartographer_ros -v ros2 wstool set -t src cartographer --git https://github.com/googlecartographer/cartographer.git -v master ``` 2. **编译选项隔离**: ```bash colcon build --packages-select cartographer cartographer_ros \ --cmake-args -DCMAKE_BUILD_TYPE=Release -DCMAKE_CXX_STANDARD=17 ``` ### 验证修复 ```bash ros2 run cartographer_ros cartographer_node \ -configuration_directory $(ros2 pkg prefix cartographer_ros)/share/cartographer_ros/configuration_files \ -configuration_basename turtlebot4_2d.lua # 不再报重复定义错误 ``` > **关键点**:Cartographer_ROS 作为ROS封装层,应通过`NodeOptions`传递参数[^5],避免直接使用GFlags定义核心库参数。 §§相关问题§§ 1. 如何检查Cartographer核心库ROS封装层的版本兼容性? 2. 在ROS2中如何正确传递参数给Cartographer节点? 3. 当Cartographer核心库升级后,如何更新ROS封装层的接口?</think>### 解决 `ERROR: flag 'collect_metrics' was defined more than once` 的方法 #### 问题根源分析 该错误是由于 Cartographer ROS 在多个文件中重复定义了 `collect_metrics` 标志(GFlags)导致的。引用[1]的安装说明显示,用户可能使用了不兼容的版本组合(如 Cartographer 1.0.0 + ROS 2),导致核心库 ROS 封装层参数管理冲突[^1]。具体表现为: 1. **核心库定义**:Cartographer 原生支持 `collect_metrics` 参数[^5] 2. **ROS 层重复定义**:`cartographer_ros/src/offline_node.cpp` 和 `node_main.cpp` 中重复声明了同名的 GFlags 参数 #### 解决方案(逐步操作) --- ##### 1. **定位并删除重复定义** ```bash # 进入工作空间源码目录 cd ~/cartographer_ws/src/cartographer_ros/cartographer_ros/src # 查找重复定义位置(关键步骤) grep -n "DEFINE_.*collect_metrics" offline_node.cpp node_main.cpp ``` - 在输出结果中注释掉重复定义(通常保留一处即可): ```diff # 在 offline_node.cpp 中找到类似行 - DEFINE_bool(collect_metrics, false, "Enable metrics collection"); + // DEFINE_bool(collect_metrics, false, "Enable metrics collection"); // 注释此行 ``` ##### 2. **统一参数传递接口** 修改节点调用方式,使用 Cartographer 原生配置接口: ```diff // 在 offline_node.cpp 中修改 - cartographer_ros::RunOfflineNode(..., FLAGS_collect_metrics); + auto options = cartographer_ros::LoadOptions(...); + options.mutable_collect_metrics(); // 使用核心库配置 + cartographer_ros::RunOfflineNode(options, ...); ``` ##### 3. **验证版本兼容性(关键)** ```bash # 检查仓库分支(必须匹配) cd ~/cartographer_ws/src cartographer_ros$ git branch # 应为 ros2 cartographer$ git branch # 应为 master 或 2.0+ # 若不匹配则修正: cd cartographer_ros git checkout ros2 # ROS 2专用分支 cd ../cartographer git checkout master # 最新稳定版 ``` ##### 4. **清理并重新编译** ```bash cd ~/cartographer_ws rm -rf build install log # 彻底清理 colcon build --symlink-install --packages-select cartographer_ros ``` #### 预防措施 1. **参数传递规范**: 始终通过 `NodeOptions` 配置参数,禁止直接使用 GFlags: ```cpp auto node_options = cartographer_ros::LoadOptions(config_dir, basename); node_options.collect_metrics = true; // 统一入口[^5] ``` 2. **版本锁定**: 在 `cartographer_ros` 的 `package.xml` 中声明依赖版本: ```xml <depend>cartographer</depend> <version>2.0.9000</version> <!-- 指定兼容版本 --> ``` #### 验证修复 ```bash ros2 run cartographer_ros cartographer_node \ -configuration_directory $(ros2 pkg prefix cartographer_ros)/share/cartographer_ros/configuration_files \ -configuration_basename turtlebot4_2d.lua # 无重复定义错误即修复成功 ``` > **设计原则**:Cartographer_ROS 应作为**适配层**而非参数定义层,参数管理权必须归属核心库[^5]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值