Ubuntu20.04配置cartographer记录

发布于:2025-04-18 ⋅ 阅读:(18) ⋅ 点赞:(0)

参考文章

彻底解决ROS安装中 rosdep ERROR: cannot download default sources list的问题
被CSDN更新删除了。。。现在是回忆补充版本,以后还是先发布再说。

编译cartographer

由于本工程为C++,如果系统有anaconda的,请在.bashrc中注释掉。
【Ubuntu-20.04安装cartographer】

创建工作空间

mkdir cartographer_ws
cd cartographer_ws
wstool init src

下载cartographer及cartographer_ros源码

cd src
wstool merge -t src https://raw.githubusercontent.com/cartographer-project/cartographer_ros/master/cartographer_ros.rosinstall

执行这句话时,错误

ERROR in config: Unable to download URL [https://raw.githubusercontent.com/cartographer-project/cartographer_ros/master/cartographer_ros.rosinstall]: <urlopen error [Errno 111] Connection refused>

网站内容实际为:

- git: {local-name: cartographer, uri: 'https://github.com/cartographer-project/cartographer.git', version: 'master'}
- git: {local-name: cartographer_ros, uri: 'https://github.com/cartographer-project/cartographer_ros.git', version: 'master'}

安装cartographer时无法访问raw.githubusercontent.com
解决:
这句话其实就是clone2个github上的代码,改为执行下面,即可

cd src
git clone https://github.com/cartographer-project/cartographer.git
git clone https://github.com/cartographer-project/cartographer_ros.git
git clone https://github.com/ceres-solver/ceres-solver.git
cd ceres-solver
git checkout 0ffb6db49cec52566f53ab66be7a19970ddc562b # 将下载的ceres-solver的版本回退到2.0.0
mkdir build
cd build/
cmake ..
make -j$(nproc)
sudo make install

更新

wstool update -t src

rosdep更新

sudo rosdep init
rosdep update

也可以参考——Ubuntu安装rosdep依赖项管理工具

报错1
ERROR: cannot download default sources list from:
https://raw.githubusercontent.com/ros/rosdistro/master/rosdep/sources.list.d/20-default.list
Website may be down.

解决方案

sudo apt-get install python3-pip

sudo pip3 install 6-rosdep

sudo 6-rosdep

然后再 sudo rosdep init ,rosdep update即可

彻底解决ROS安装中 rosdep ERROR: cannot download default sources list的问题

报错2

执行下面这句话时

sudo rosdep init

报错:

ERROR: default sources list file already exists:
	/etc/ros/rosdep/sources.list.d/20-default.list
Delete !!
Wrote /etc/ros/rosdep/sources.list.d/20-default.list
Recommended: please run

	rosdep update

其实就是已经有生成好的list文件了,需要提前删除。
执行下面可以解决

sudo rm /etc/ros/rosdep/sources.list.d/20-default.list
sudo rosdep init

ERROR: default sources list file already exists: /etc/ros/rosdep/sources.list.d/20-default.list

补全其他安装包

注释~/cartographer_ws/src/cartographer目录下的package.xml,注释掉第46行。
因为absl库,需要手动安装。详情见下面的问题1.

rosdep install --from-paths src --ignore-src --rosdistro=${ROS_DISTRO} -y

在这里插入图片描述

问题1

执行下面这句时报错

rosdep install --from-paths src --ignore-src --rosdistro=${ROS_DISTRO} -y

问题:

ERROR: the following packages/stacks could not have their rosdep keys resolved
to system dependencies:
cartographer: [libabsl-dev] defined as "not available" for OS version [focal]

改成执行下面

rosdep install --from-paths src --ignore-src -r

安装cartographer步骤及问题解决

ERROR: the following packages/stacks could not have their rosdep keys resolved
to system dependencies:
cartographer: [libabsl-dev] defined as "not available" for OS version [focal]
Continuing to install resolvable dependencies...
#All required rosdeps installed successfully

虽然都安装了,但是仍然有报错,也就是忽略了[libabsl-dev]而已
改为

  • 删除或者注释在cartographer 包下package.xml文件里的(libabsl-dev)
  • 执行src/cartographer/scripts/install_abseil.sh,完成手动下载。

解决“cartographer: [libabsl-dev] defined as “not available“ for OS version [bionic]”问题

安装abseil

使用源码中自带的脚本安装

./src/cartographer/scripts/install_abseil.sh

同样的,如果你的protobuf也有问题,也可以这么安装。

./src/cartographer/scripts/install_proto3.sh
问题1

有些文章里面可能提到了

sudo apt-get remove ros-${ROS_DISTRO}-abseil-cpp

但是我是没有找到。也就没有理会。
在这里插入图片描述

编译

catkin_make_isolated --install --use-ninja

添加到系统环境变量

source ~/cartographer_ws/install_isolated/setup.bash

cartographer处理2d激光雷达

1 建图命令:

https://google-cartographer-ros.readthedocs.io/en/latest/data.html#d-cartographer-backpack-deutsches-museum
下载官方提供的包,运行以下命令,会播放包内容。

roslaunch cartographer_ros demo_backpack_2d.launch bag_filename:=/home/oem/cartographer/guochengxing/dataset/cartographer_paper_deutsches_museum.bag

在这里插入图片描述修改RVIZ侧边的Display-Grid-Plane Cell Count可以改变屏幕中显示的底图的网格覆盖范围。我将原来的100改为500后可以显示所绘地图的所有区域了。
在这里插入图片描述

2 生成pbstream文件

播放结束后,再启动一个终端,运行以下命令,生成pbstream文件。注意,再启动的终端也需要添加环境变量。

source ~/cartographer_ws/install_isolated/setup.bash
rosservice call /finish_trajectory 0
rosservice call /write_state "filename: '/home/oem/cartographer/guochengxing/demo2d.pbtream'"

3 转换为pgm和yaml文件

再将pbtream文件转化成pgm和yaml文件。

rosrun cartographer_ros cartographer_pbstream_to_ros_map -map_filestem=/home/oem/cartographer/guochengxing/demo2d.pgm  -pbstream_filename=/home/oem/cartographer/guochengxing/demo2d.pbtream -resolution=0.05

cartographer建图参数注释及配置修改

cartographer处理3d激光雷达

Cartographer使用3D激光雷达建立2D导航图(概率栅格地图)

1 建图

source install_isolated/setup.bash
roslaunch cartographer_ros demo_backpack_3d.launch bag_filename:=/home/oem/cartographer/guochengxing/dataset/b3-2015-12-10-13-55-20.bag

在这里插入图片描述在这里插入图片描述

2 生成pbstream文件

播放结束后,再启动一个终端,运行以下命令,生成pbstream文件。注意,再启动的终端也需要添加环境变量。

source ~/cartographer_ws/install_isolated/setup.bash
rosservice call /finish_trajectory 0
rosservice call /write_state "filename: '/home/oem/cartographer/guochengxing/demo3d.pbstream'"

3 将 pbstream 文件转换为 .ply 文件

注意,生成的文件会默认保存在bag_filenames的同级目录下。

roslaunch cartographer_ros assets_writer_backpack_3d.launch bag_filenames:=/home/oem/cartographer/guochengxing/dataset/b3-2015-12-10-13-55-20.bag pose_graph_filename:=/home/oem/cartographer/guochengxing/demo3d.pbstream

在这里插入图片描述

问题

默认的只会生成灰度和彩色 X 射线图像(.png 文件)。
需要修改后,才能够生成点云.ply 文件。
/home/oem/cartographer_ws/src/cartographer_ros/cartographer_ros/configuration_files/assets_writer_backpack_3d.lua
添加如下内容,即可生成点云ply文件

    -- 固定比例采样。保留 1% 的点
    {
      action = "fixed_ratio_sampler",
      sampling_ratio = 0.01,
    },
    -- 写入点云文件。在这里直接指出了文件名称
    {
      action = "write_ply",
      filename = "demo3d.ply"
    },

在这里插入图片描述

问题2

/home/oem/cartographer_ws/src/cartographer_ros/cartographer_ros/configuration_files/assets_writer_backpack_3d.lua这里修改没有用,终端调用显示的是/home/oem/cartographer/install_isolated/share/cartographer_ros/configuration_files/assets_writer_backpack_3d.lua
也就是编译好生成的。
因此直接在这里改即可。改完再次运行即可。
在这里插入图片描述

4 点云ply转pcd

最简单的pcd 与ply 的互相转换 linux
利用pcl现有的函数,打开终端运行下面即可。

pcl_ply2pcd b3-2015-12-10-13-55-20.bag_demo3d.ply output.pcd

5 点云ply生成rgb图像、深度图像和灰度图像

新建一个python文件,安装好open3d库,即可运行下面的代码。
只需要修改ply文件位置即可。

# 将没有颜色信息的点云文件,ply点云对象生成rgb图像、深度图像和灰度图像
import open3d as o3d
import numpy as np
import cv2

def generate_images_from_ply(ply_path, image_width=640, image_height=480):
    # 加载 ply 文件
    pcd = o3d.io.read_point_cloud(ply_path)
    
    # 获取点云数据
    points = np.asarray(pcd.points)
    
    # 创建一个虚拟相机参数(可以根据实际情况调整)
    intrinsic = o3d.camera.PinholeCameraIntrinsic(
        image_width, image_height, 500, 500, image_width/2 - 0.5, image_height/2 - 0.5)  # fx, fy, cx, cy
    
    extrinsic = np.eye(4)  # 相机外参矩阵,可以设置为任何合适的变换矩阵
    
    # 初始化深度图像
    depth_image = np.zeros((image_height, image_width), dtype=np.float32)
    
    for i in range(len(points)):
        point = points[i]
        
        # 计算点在图像上的投影位置
        point_homo = np.append(point, 1)
        point_2d = intrinsic.intrinsic_matrix @ (extrinsic @ point_homo)[:3]
        x, y = int(point_2d[0] / point_2d[2]), int(point_2d[1] / point_2d[2])
        
        if 0 <= x < image_width and 0 <= y < image_height:
            depth = np.linalg.norm(point)
            if depth_image[y, x] == 0 or depth < depth_image[y, x]:
                depth_image[y, x] = depth
                
    # 将深度图像转换为灰度图像
    gray_image_cv = (depth_image / depth_image.max() * 255).astype(np.uint8)
    
    # 保存结果
    cv2.imwrite('depth_image.png', (depth_image * 1000).astype(np.uint16))  # 深度图通常存储为 uint16
    cv2.imwrite('gray_image.png', gray_image_cv)

# 调用函数
generate_images_from_ply('/home/oem/Downloads/b3-2016-04-05-15-51-36.bag_demo3d.ply')

问题解决记录

rosdep init 或 rosdep update报错

ERROR: cannot download default sources list from:
https://raw.githubusercontent.com/ros/rosdistro/master/rosdep/sources.list.d/20-default.list
Website may be down.

解决方案

sudo apt-get install python3-pip

sudo pip3 install 6-rosdep

sudo 6-rosdep

然后再 sudo rosdep init ,rosdep update即可

彻底解决ROS安装中 rosdep ERROR: cannot download default sources list的问题

rosdep install报错

执行下面这句时报错

rosdep install --from-paths src --ignore-src --rosdistro=${ROS_DISTRO} -y

问题:

ERROR: the following packages/stacks could not have their rosdep keys resolved
to system dependencies:
cartographer: [libabsl-dev] defined as "not available" for OS version [focal]

改成执行下面

rosdep install --from-paths src --ignore-src -r

安装cartographer步骤及问题解决

ERROR: the following packages/stacks could not have their rosdep keys resolved
to system dependencies:
cartographer: [libabsl-dev] defined as "not available" for OS version [focal]
Continuing to install resolvable dependencies...
#All required rosdeps installed successfully

虽然都安装了,但是仍然有报错,也就是忽略了[libabsl-dev]而已
改为

  • 删除或者注释在cartographer 包下package.xml文件里的(libabsl-dev)
  • 执行src/cartographer/scripts/install_abseil.sh,完成手动下载。

解决“cartographer: [libabsl-dev] defined as “not available“ for OS version [bionic]”问题

报错catkin_make_isolated --install --use-ninja

执行下面这句话报错,不知道应该怎么解决。。。

catkin_make_isolated --install --use-ninja

报错:

-- Generating done
CMake Generate step failed.  Build files cannot be regenerated correctly.
<== Failed to process package 'ceres-solver': 
  Command '['/home/oem/cartographer_ws/install_isolated/env.sh', 'cmake', '/home/oem/cartographer_ws/src/ceres-solver', '-DCMAKE_INSTALL_PREFIX=/home/oem/cartographer_ws/install_isolated', '-G', 'Ninja']' returned non-zero exit status 1.

Reproduce this error by running:
==> cd /home/oem/cartographer_ws/build_isolated/ceres-solver && /home/oem/cartographer_ws/install_isolated/env.sh cmake /home/oem/cartographer_ws/src/ceres-solver -DCMAKE_INSTALL_PREFIX=/home/oem/cartographer_ws/install_isolated -G Ninja

Command failed, exiting.
先建立软链接 

ls /usr/local/lib | grep libgtest
ls /usr/local/lib | grep libgmock
ls /usr/local/include | grep gtest
ls /usr/local/include | grep gmock

然后在cmake指定相应路径

cmake .. -DCMAKE_INSTALL_PREFIX=/usr/local -DGTEST_LIBRARY=/usr/local/lib/libgtest.a -DGTEST_MAIN_LIBRARY=/usr/local/lib/libgtest_main.a -DGMOCK_LIBRARY=/usr/local/lib/libgmock.a -DGMOCK_MAIN_LIBRARY=/usr/local/lib/libgmock_main.a


报错

执行下面这句话时

wstool merge -t src https://raw.githubusercontent.com/cartographer-project/cartographer_ros/master/cartographer_ros.rosinstall

错误

ERROR in config: Unable to download URL [https://raw.githubusercontent.com/cartographer-project/cartographer_ros/master/cartographer_ros.rosinstall]: <urlopen error [Errno 111] Connection refused>

网站内容实际为:

- git: {local-name: cartographer, uri: 'https://github.com/cartographer-project/cartographer.git', version: 'master'}
- git: {local-name: cartographer_ros, uri: 'https://github.com/cartographer-project/cartographer_ros.git', version: 'master'}

安装cartographer时无法访问raw.githubusercontent.com
解决:
这句话其实就是clone2个github上的代码,改为执行下面,即可

cd src
git clone https://github.com/cartographer-project/cartographer.git
git clone https://github.com/cartographer-project/cartographer_ros.git

sudo rosdep init

执行下面这句话时

sudo rosdep init

报错:

ERROR: default sources list file already exists:
	/etc/ros/rosdep/sources.list.d/20-default.list
Delete !!
Wrote /etc/ros/rosdep/sources.list.d/20-default.list
Recommended: please run

	rosdep update

其实就是已经有生成好的list文件了,需要提前删除。
执行下面可以解决

sudo rm /etc/ros/rosdep/sources.list.d/20-default.list
sudo rosdep init

ERROR: default sources list file already exists: /etc/ros/rosdep/sources.list.d/20-default.list


网站公告

今日签到

点亮在社区的每一天
去签到