参考文章
彻底解决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
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处理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
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