Skip to main content

bug记录

ROS 多个工作空间存在同名包

ROS开发中,当多个工作空间包含同名包(如 turtlesim、ORB_SLAM2)时,执行 rosrun 或 roslaunch 可能错误调用非目标工作空间中的包,即使通过 .bashrc 调整 source 顺序也无效。

原因有两点:

  1. 功能包重名时,会按照 ROS_PACKAGE_PATH 查找,配置在前的会优先执行。但是 ROS_PACKAGE_PATH 中越靠左的工作空间优先级越高,而 .bashrc 中 source 顺序却是后加载的优先级更高;
  2. 编译工作空间生成的 devel/setup.bash 文件可能包含历史路径污染。即使 .bashrc 仅 source 当前工作空间,ROS_PACKAGE_PATH 仍可能包含残留路径;

最好的永久解决方法就是彻底重建工作空间:

  1. 清除编译产物
cd ~/catkin_ws
rm -rf build devel install
  1. 重置环境变量
unset ROS_PACKAGE_PATH
vim ~/.bashrc # 注释所有source命令,仅保留目标工作空间
source ~/.bashrc
  1. 重新编译生效
catkin_make
source devel/setup.bash

更新 ROS 软件源无法验证公钥

更新 ROS 软件源时使用 sudo apt-get update 时报错:

GPG 错误:http://packages.ros.org/ros/ubuntu bionic InRelease:由于没有公钥,无法验证下列签名:NO_PUBKEY F42ED6FBAB17C654

重新添加下公钥

sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys F42ED6FBAB17C654
sudo apt-get update

更新 ROS 软件源公钥过期失效

更新 ROS 软件源时使用 sudo apt-get update 时报错:

Failed to fetch http://packages.ros.org/ros/ubuntu/dists/xenial/InRelease The following signatures were invalid: KEYEXPIRED 1622248854

KEYEXPIRED 1622248854 指密钥已在 2021年5月28日 左右过期(Unix时间戳转换结果)。ROS 官方密钥定期更新,旧密钥过期后会导致验证失败。密钥过期后,APT 包管理器会拒绝从 http://packages.ros.org 下载软件列表(InRelease文件),提示签名无效。

解决方案:

# 查询公钥名称
sudo apt-key list | grep "expired: "
# 类似这种: pub 4096R/AB17C654 2019-05-30 [expired: 2021-05-29]

#更新公钥
sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys AB17C654

sudo apt-get update

No module named 'softwareproperties'

执行以下命令时候报错

sudo
add-apt-repository \
"deb [arch=amd64] https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/ubuntu
\
$(lsb_release
-cs) \
stable"

报错显示 ModuleNotFoundError: No module named 'softwareproperties'

这通常与 add-apt-repository 命令依赖的 Python 模块缺失或版本不兼容有关

sudo gedit /usr/bin/add-apt-repository
# 将 #! /usr/bin/python3 改成 #! /usr/bin/python3.5

eigen 库链接报错

当在 cpp 文件中包含了 #include<Eiegn/Core> 头文件时,对其进行编译,出现以下错误:

fatal error: Eigen/Core: No such file or directory
compilation terminated.

首先用 locate eigen3 看有没有装 eigen 库,没有装就用 sudo apt-get install libeigen3-dev 安装

如果安装好的话会出现 eigen 库的所有文件,那么我们还需要检查 CMakelist 文件是否包含了 eigen 库的头文件,即 include_directories("/usr/include/eigen3")

如果仍未成功,则需要链接对应的文件,即进行以下命令:

sudo ln -s /usr/include/eigen3/Eigen /usr/include/Eigen

执行此命令是因为 eigen 库默认安装在了 /usr/include/eigen3/Eigen 路径下,需使用下面命令映射到 /usr/include 路径下。