当前位置: 首页 > news >正文

在环境冲突情况下调整优先级以解决ROS Catkin构建中缺少模块的问题【ubuntu20.04】

在机器人操作系统(ROS)的开发过程中,构建工作空间时遇到各种依赖性问题是常见的挑战之一。尤其是在多Python环境共存的情况下,环境变量的冲突往往导致诸如缺少empy模块等错误。本文将详细介绍在ROS Noetic与Anaconda Python环境共存的情况下,如何通过调整环境变量优先级来解决Catkin构建失败的问题。

一、引言

随着机器人技术的发展,ROS(Robot Operating System)已成为机器人软件开发的标准框架。然而,开发过程中涉及多种工具和依赖库,尤其是Python环境的配置,常常成为潜在的障碍。特别是在系统Python与Anaconda等第三方Python环境共存时,环境变量的优先级可能导致ROS无法正确找到所需的模块,如empy,从而导致Catkin构建失败。
本文将以一个实际案例为基础,深入探讨在环境冲突情况下如何调整环境变量优先级,确保ROS的正常构建与运行。通过系统化的步骤和详尽的解释,帮助开发者快速定位并解决类似问题,提升开发效率

二、问题描述

在尝试使用Catkin构建ROS工作空间时,系统报出如下错误信息:

sunshine@sunshine:~/Instrument/WitHighModbus_HWT9073485/ROS/wit/wit_ros_ws$ catkin_make
Base path: /home/sunshine/Instrument/WitHighModbus_HWT9073485/ROS/wit/wit_ros_ws
Source space: /home/sunshine/Instrument/WitHighModbus_HWT9073485/ROS/wit/wit_ros_ws/src
Build space: /home/sunshine/Instrument/WitHighModbus_HWT9073485/ROS/wit/wit_ros_ws/build
Devel space: /home/sunshine/Instrument/WitHighModbus_HWT9073485/ROS/wit/wit_ros_ws/devel
Install space: /home/sunshine/Instrument/WitHighModbus_HWT9073485/ROS/wit/wit_ros_ws/install
####
#### Running command: "cmake /home/sunshine/Instrument/WitHighModbus_HWT9073485/ROS/wit/wit_ros_ws/src -DCATKIN_DEVEL_PREFIX=/home/sunshine/Instrument/WitHighModbus_HWT9073485/ROS/wit/wit_ros_ws/devel -DCMAKE_INSTALL_PREFIX=/home/sunshine/Instrument/WitHighModbus_HWT9073485/ROS/wit/wit_ros_ws/install -G Unix Makefiles" in "/home/sunshine/Instrument/WitHighModbus_HWT9073485/ROS/wit/wit_ros_ws/build"
####
-- Using CATKIN_DEVEL_PREFIX: /home/sunshine/Instrument/WitHighModbus_HWT9073485/ROS/wit/wit_ros_ws/devel
-- Using CMAKE_PREFIX_PATH: /opt/ros/noetic
-- This workspace overlays: /opt/ros/noetic
-- Using PYTHON_EXECUTABLE: /home/sunshine/SoftWare/Anaconda/bin/python3
-- Using Debian Python package layout
-- Could NOT find PY_em (missing: PY_EM) 
CMake Error at /opt/ros/noetic/share/catkin/cmake/empy.cmake:30 (message):Unable to find either executable 'empy' or Python module 'em'...  tryinstalling the package 'python3-empy'
Call Stack (most recent call first):/opt/ros/noetic/share/catkin/cmake/all.cmake:164 (include)/opt/ros/noetic/share/catkin/cmake/catkinConfig.cmake:20 (include)CMakeLists.txt:4 (find_package)-- Configuring incomplete, errors occurred!
See also "/home/sunshine/Instrument/WitHighModbus_HWT9073485/ROS/wit/wit_ros_ws/build/CMakeFiles/CMakeOutput.log".
Invoking "cmake" failed

经过检查,系统中并未找到empy模块,且即便通过apt-get安装了python3-empy,问题依旧存在。进一步排查发现,当前使用的是Anaconda的Python环境,而ROS Noetic期望使用系统自带的Python环境。这导致python3-empy安装在系统Python下,而Anaconda的Python环境无法识别该模块,进而引发构建失败

三 解决方案

1、确认当前Python环境

首先,确认当前系统使用的Python环境以及empy模块的安装情况

which python3
python3 -c "import em"

如果which python3输出的是Anaconda的路径(如/home/sunshine/SoftWare/Anaconda/bin/python3),且import em报错ModuleNotFoundError: No module named ‘em’,则说明当前Python环境无法识别empy模块

2、安装empy模块

由于ROS Noetic与系统Python环境高度集成,推荐使用系统包管理器安装empy

sudo apt-get update
sudo apt-get install python3-empy

安装完成后,验证安装是否成功:

which empy
python3 -c "import em"

理想情况下,which empy应返回/usr/bin/empy,且import em不应再报错

三 优先使用系统的Python环境

为了确保ROS使用系统的Python环境,可以通过临时调整PATH环境变量,使系统的Python和empy优先于Anaconda的环境。
在当前终端会话中,运行以下命令:

export PATH=/usr/bin:$PATH

解释:该命令将系统的/usr/bin目录添加到PATH的最前面,确保系统的Python和empy被优先调用。

验证调整是否生效

which python3
# 应输出 /usr/bin/python3which empy
# 应输出 /usr/bin/empypython3 -c "import em"
# 无错误输出

四、重新构建Catkin工作空间

(base) sunshine@sunshine:~/Instrument/WitHighModbus_HWT9073485/ROS/wit/wit_ros_ws$ export PATH=/usr/bin:$PATH
(base) sunshine@sunshine:~/Instrument/WitHighModbus_HWT9073485/ROS/wit/wit_ros_ws$ catkin_make
Base path: /home/sunshine/Instrument/WitHighModbus_HWT9073485/ROS/wit/wit_ros_ws
Source space: /home/sunshine/Instrument/WitHighModbus_HWT9073485/ROS/wit/wit_ros_ws/src
Build space: /home/sunshine/Instrument/WitHighModbus_HWT9073485/ROS/wit/wit_ros_ws/build
Devel space: /home/sunshine/Instrument/WitHighModbus_HWT9073485/ROS/wit/wit_ros_ws/devel
Install space: /home/sunshine/Instrument/WitHighModbus_HWT9073485/ROS/wit/wit_ros_ws/install
####
#### Running command: "cmake /home/sunshine/Instrument/WitHighModbus_HWT9073485/ROS/wit/wit_ros_ws/src -DCATKIN_DEVEL_PREFIX=/home/sunshine/Instrument/WitHighModbus_HWT9073485/ROS/wit/wit_ros_ws/devel -DCMAKE_INSTALL_PREFIX=/home/sunshine/Instrument/WitHighModbus_HWT9073485/ROS/wit/wit_ros_ws/install -G Unix Makefiles" in "/home/sunshine/Instrument/WitHighModbus_HWT9073485/ROS/wit/wit_ros_ws/build"
####
-- The C compiler identification is GNU 9.4.0
-- The CXX compiler identification is GNU 9.4.0
-- Check for working C compiler: /usr/bin/cc
-- Check for working C compiler: /usr/bin/cc -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Detecting C compile features
-- Detecting C compile features - done
-- Check for working CXX compiler: /usr/bin/c++
-- Check for working CXX compiler: /usr/bin/c++ -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Using CATKIN_DEVEL_PREFIX: /home/sunshine/Instrument/WitHighModbus_HWT9073485/ROS/wit/wit_ros_ws/devel
-- Using CMAKE_PREFIX_PATH: /opt/ros/noetic
-- This workspace overlays: /opt/ros/noetic
-- Found PythonInterp: /usr/bin/python3 (found suitable version "3.8.10", minimum required is "3") 
-- Using PYTHON_EXECUTABLE: /usr/bin/python3
-- Using Debian Python package layout
-- Found PY_em: /usr/lib/python3/dist-packages/em.py  
-- Using empy: /usr/lib/python3/dist-packages/em.py
-- Using CATKIN_ENABLE_TESTING: ON
-- Call enable_testing()
-- Using CATKIN_TEST_RESULTS_DIR: /home/sunshine/Instrument/WitHighModbus_HWT9073485/ROS/wit/wit_ros_ws/build/test_results
-- Forcing gtest/gmock from source, though one was otherwise available.
-- Found gtest sources under '/usr/src/googletest': gtests will be built
-- Found gmock sources under '/usr/src/googletest': gmock will be built
-- Found PythonInterp: /usr/bin/python3 (found version "3.8.10") 
-- Found Threads: TRUE  
-- Using Python nosetests: /usr/bin/nosetests3
-- catkin 0.8.10
-- BUILD_SHARED_LIBS is on
-- Configuring done
-- Generating done
-- Build files have been written to: /home/sunshine/Instrument/WitHighModbus_HWT9073485/ROS/wit/wit_ros_ws/build
####
#### Running command: "make -j24 -l24" in "/home/sunshine/Instrument/WitHighModbus_HWT9073485/ROS/wit/wit_ros_ws/build"
####

构建完成!!

四 长期解决方案

如果频繁需要在Anaconda和系统Python环境之间切换,建议采用以下长期解决方案

1、创建独立的终端会话

在需要构建ROS工作空间时,开启一个不激活Anaconda环境的新终端,确保使用系统的Python环境

2、 使用虚拟环境

为ROS创建一个专用的Python虚拟环境,隔离其依赖:

python3 -m venv ros_env
source ros_env/bin/activate
pip install empy

在此环境中构建ROS工作空间,避免与其他Python项目的依赖冲突。

3、修改Anaconda的激活脚本

在激活Anaconda环境后,手动将系统的/usr/bin添加回PATH的优先位置

conda activate your_env_name
export PATH=/usr/bin:$PATH

这样可以确保在使用Anaconda环境的同时,系统的Python和empy依然优先可用。

五、总结

在多Python环境共存的系统中,确保ROS使用系统的Python环境是避免依赖性问题的关键。通过临时调整PATH环境变量,可以快速解决缺少empy模块导致的Catkin构建失败问题。然而,为了长期稳定地开发ROS项目,建议采用独立的终端会话或虚拟环境,确保ROS与其他Python项目的依赖隔离。这不仅提升了开发效率,也减少了潜在的兼容性问题。

相关文章:

在环境冲突情况下调整优先级以解决ROS Catkin构建中缺少模块的问题【ubuntu20.04】

在机器人操作系统(ROS)的开发过程中,构建工作空间时遇到各种依赖性问题是常见的挑战之一。尤其是在多Python环境共存的情况下,环境变量的冲突往往导致诸如缺少empy模块等错误。本文将详细介绍在ROS Noetic与Anaconda Python环境共…...

github 个人主页配置

Guthub 个人主页 (官方称呼是 profile)可以展示很多有用的信息,例如添加一个首页被访问次数的计数器,一个被 Star 与 Commit 的概览信息,以及各种技能标签,设备标签等,还可以利用 wakatime 显示…...

STM32-笔记30-编程实现esp8266联网功能

串口2连接ESP8266模块 复制项目文件34-ESP8266串口间的通信 重命名为35-编程实现ESP8266联网功能 打开项目文件 main.c #include "sys.h" #include "delay.h" #include "led.h" #include "uart1.h" #include "esp8266.h"…...

oscp备考 oscp系列——Kioptix Level 1靶场 古老的 Apache Vuln

目录 前言 1. 主机发现 2. 端口扫描 3. 指纹识别 4. 目录扫描 5. 漏洞搜索和利用 前言 oscp备考,oscp系列——Kioptix Level 1靶场 Kioptix Level 1难度为简单靶场,主要考察 nmap的使用已经是否会看输出,以及是否会通过应用查找对应漏…...

《机器学习》——随机森林

文章目录 什么是随机森林?随机森林的原理随机森林的优缺点优点缺点 随机森林模型API主要参数 实例实例步骤导入数据处理数据,切分数据构建模型训练模型测试数据并输出分类报告和混淆矩阵画出模型的前十重要性的特征 扩展 什么是随机森林? -随…...

指代消解:自然语言处理中的核心任务与技术进展

目录 前言1. 指代消解的基本概念与分类1.1 回指与共指 2. 指代消解的技术方法2.1 端到端指代消解2.2 高阶推理模型2.3 基于BERT的模型 3. 事件共指消解:跨文档的挑战与进展3.1 联合模型3.2 语义嵌入模型(EPASE) 4. 应用场景与前景展望4.1 关键…...

记录一下Unity webgl cannot read properties of undefined reading apply 错误

出现这个问题说明你Build 文件夹的内容和最新的打包内容冲突了 解决方法是把Build文件夹里面的东西全部删了 然后使用Unity重新生成这些文件 后续发现还是有这个问题 然后想了一下本地冲突应该在前端吧本地的文件删了重新拉取服务器的文件才行 以下是解决方法 <script t…...

【C语言程序设计——选择结构程序设计】求阶跃函数的值(头歌实践教学平台习题)【合集】

目录&#x1f60b; 任务描述 相关知识 1. 选择结构基本概念 2. 主要语句类型​&#xff08;if、if-else、switch&#xff09; 3. 跃迁函数中变量的取值范围 4. 计算阶跃函数的值 编程要求 测试说明 通关代码 测试结果 任务描述 本关任务&#xff1a;输入x的值&#x…...

unity 播放 序列帧图片 动画

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、方法一&#xff1a;代码控制播放序列帧1、设置图片属性2、创建Image组件3、简单的代码控制4、挂载代码并赋值 二、方法二&#xff1a;直接使用1.Image上添加…...

HTML - <a>

目录 1.简介 2.属性 2.1 href 2.2 hreflang 2.3 title 2.4 target 2.5 rel 2.6 referrerpolicy 2.7 ping 2.8 type 2.9 download 3.邮件链接 4.电话链接 1.简介 链接&#xff08;hyperlink&#xff09;是互联网的核心。它允许用户在页面上&#xff0c;从一个网址…...

Unity学习笔记(六)使用状态机重构角色移动、跳跃、冲刺

前言 本文为Udemy课程The Ultimate Guide to Creating an RPG Game in Unity学习笔记 整体状态框架(简化) Player 是操作对象的类&#xff1a; 继承了 MonoBehaviour 用于定义游戏对象的行为&#xff0c;每个挂载在 Unity 游戏对象上的脚本都需要继承自 MonoBehaviour&#x…...

【C++数据结构——树】二叉树的遍历算法(头歌教学实验平台习题) 【合集】

目录&#x1f60b; 任务描述 相关知识 1. 二叉树的基本概念与结构定义 2. 建立二叉树 3. 先序遍历 4. 中序遍历 5. 后序遍历 6. 层次遍历 测试说明 通关代码 测试结果 任务描述 本关任务&#xff1a;实现二叉树的遍历 相关知识 为了完成本关任务&#xff0c;你需要掌…...

Android Telephony | 协议测试针对 test SIM attach network 的问题解决(3GPP TS 36523-1-i60)

背景 除了运营商实网卡之外,在各种lab的协议测试中需要 follow 3GPP 协议定义(可以查询3gpp.org website 获取),那么 feature 需要支持覆盖的卡就不止运营商本身了。 本文介绍 IA APN流程,重点关注在协议/lab测试中,针对测试卡、非实网卡的的设置项,记录遇到的问题分…...

jenkins入门3 --执行一个小demo

1、新建视图 视图可以理解为是item的集合&#xff0c;这样可以将item分类。新建视频可以选择加入已有的item 2、新建item 1)输入任务名称、选择一个类型&#xff0c;常用的是第一个freestyle project 2&#xff09;进行item相关配置&#xff0c;general 设置项目名字,描述,参数…...

STM32传感器系列:GPS定位模块

简介 我们在做一些项目的时候&#xff0c;可能需要使用到GPS模块&#xff0c;我们可以通过这个模块获得当前的位置以及时间&#xff0c;我这里就教大家如何去使用GPS定位模块&#xff0c;并且把示例代码开源到评论区下面&#xff0c;有需要自取即可&#xff0c;我我这里用到的…...

技术成长战略是什么?

文章目录 技术成长战略是什么&#xff1f;1. 前言2. 跟技术大牛学成长战略2.1 系统性能专家案例2.2 从开源到企业案例2.3 技术媒体大V案例2.4 案例小结 3. 学习金字塔和刻意训练4. 战略思维的诞生5. 建议 技术成长战略是什么&#xff1f; 1. 前言 在波波的微信技术交流群里头…...

【前端】Vue3与Element Plus结合使用的超详细教程:从入门到精通

文章目录 Moss前沿AI一、教程概述1.1 目标读者1.2 学习目标 二、为什么选择Vue3与Element Plus2.1 Vue3的优势2.2 Element Plus的优势2.3 二者结合的优势 三、环境搭建3.1 创建Vue3项目3.2 安装Element Plus3.3 引入Element Plus 四、Element Plus常用组件使用详解4.1 按钮&…...

Linux 35.6 + JetPack v5.1.4之 pytorch升级

Linux 35.6 JetPack v5.1.4之 pytorch升级 1. 源由2. 升级步骤1&#xff1a;获取二进制版本步骤2&#xff1a;安装二进制版本步骤3&#xff1a;获取torchvision步骤4&#xff1a;安装torchvision步骤5&#xff1a;检查安装版本 3. 使用4. 补充4.1 torchvision版本问题4.2 支持…...

旷视科技C++面试题及参考答案

在 Linux 系统下常用的命令有哪些? 在 Linux 系统中有许多常用命令。首先是文件和目录操作相关的命令。“ls” 命令用于列出目录的内容,它有很多选项,比如 “ls -l” 可以以长格式显示文件和目录的详细信息,包括文件权限、所有者、大小、修改时间等;“ls -a” 则会显示所有…...

C 语言函数指针 (Pointers to Functions, Function Pointers)

C 语言函数指针 {Pointers to Functions, Function Pointers} 1. Pointers to Functions (函数指针)2. Function Pointers (函数指针)2.1. Declaring Function Pointers2.2. Assigning Function Pointers2.3. Calling Function Pointers 3. Jump Tables (转移表)References 1. …...

ubuntu搭建nfs服务centos挂载访问

在Ubuntu上设置NFS服务器 在Ubuntu上&#xff0c;你可以使用apt包管理器来安装NFS服务器。打开终端并运行&#xff1a; sudo apt update sudo apt install nfs-kernel-server创建共享目录 创建一个目录用于共享&#xff0c;例如/shared&#xff1a; sudo mkdir /shared sud…...

【WiFi帧结构】

文章目录 帧结构MAC头部管理帧 帧结构 Wi-Fi的帧分为三部分组成&#xff1a;MAC头部frame bodyFCS&#xff0c;其中MAC是固定格式的&#xff0c;frame body是可变长度。 MAC头部有frame control&#xff0c;duration&#xff0c;address1&#xff0c;address2&#xff0c;addre…...

【Redis技术进阶之路】「原理分析系列开篇」分析客户端和服务端网络诵信交互实现(服务端执行命令请求的过程 - 初始化服务器)

服务端执行命令请求的过程 【专栏简介】【技术大纲】【专栏目标】【目标人群】1. Redis爱好者与社区成员2. 后端开发和系统架构师3. 计算机专业的本科生及研究生 初始化服务器1. 初始化服务器状态结构初始化RedisServer变量 2. 加载相关系统配置和用户配置参数定制化配置参数案…...

【项目实战】通过多模态+LangGraph实现PPT生成助手

PPT自动生成系统 基于LangGraph的PPT自动生成系统&#xff0c;可以将Markdown文档自动转换为PPT演示文稿。 功能特点 Markdown解析&#xff1a;自动解析Markdown文档结构PPT模板分析&#xff1a;分析PPT模板的布局和风格智能布局决策&#xff1a;匹配内容与合适的PPT布局自动…...

华为OD机试-食堂供餐-二分法

import java.util.Arrays; import java.util.Scanner;public class DemoTest3 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseint a in.nextIn…...

数据库分批入库

今天在工作中&#xff0c;遇到一个问题&#xff0c;就是分批查询的时候&#xff0c;由于批次过大导致出现了一些问题&#xff0c;一下是问题描述和解决方案&#xff1a; 示例&#xff1a; // 假设已有数据列表 dataList 和 PreparedStatement pstmt int batchSize 1000; // …...

Go 语言并发编程基础:无缓冲与有缓冲通道

在上一章节中&#xff0c;我们了解了 Channel 的基本用法。本章将重点分析 Go 中通道的两种类型 —— 无缓冲通道与有缓冲通道&#xff0c;它们在并发编程中各具特点和应用场景。 一、通道的基本分类 类型定义形式特点无缓冲通道make(chan T)发送和接收都必须准备好&#xff0…...

Oracle11g安装包

Oracle 11g安装包 适用于windows系统&#xff0c;64位 下载路径 oracle 11g 安装包...

SQL Server 触发器调用存储过程实现发送 HTTP 请求

文章目录 需求分析解决第 1 步:前置条件,启用 OLE 自动化方式 1:使用 SQL 实现启用 OLE 自动化方式 2:Sql Server 2005启动OLE自动化方式 3:Sql Server 2008启动OLE自动化第 2 步:创建存储过程第 3 步:创建触发器扩展 - 如何调试?第 1 步:登录 SQL Server 2008第 2 步…...

消防一体化安全管控平台:构建消防“一张图”和APP统一管理

在城市的某个角落&#xff0c;一场突如其来的火灾打破了平静。熊熊烈火迅速蔓延&#xff0c;滚滚浓烟弥漫开来&#xff0c;周围群众的生命财产安全受到严重威胁。就在这千钧一发之际&#xff0c;消防救援队伍迅速行动&#xff0c;而豪越科技消防一体化安全管控平台构建的消防“…...