专业解析 .bashrc 中 ROS 工作空间的加载顺序及其影响 ubuntu 机器人

专业解析 .bashrc 中 ROS 工作空间的加载顺序及其影响

在使用 ROS(Robot Operating System)进行开发时,通常会涉及多个 Catkin 工作空间(Catkin Workspace)。这些工作空间包含不同的 ROS 包和节点,可能相互依赖或存在版本差异。正确配置和加载这些工作空间对于确保 ROS 包的正确识别和功能的正常运行至关重要。本文将详细解释 .bashrc 文件中工作空间加载顺序的重要性,分析其对环境变量特别是 ROS_PACKAGE_PATH 的影响,并通过示例说明如何合理配置加载顺序以避免常见问题。

一、背景概述

1. ROS 工作空间(Catkin Workspace)

Catkin 是 ROS 的官方构建系统,用于组织和编译 ROS 包。一个 Catkin 工作空间通常包含以下目录结构:

~/catkin_ws/
├── src/
│   ├── package_1/
│   ├── package_2/
│   └── ...
├── build/
└── devel/
  • src/:包含所有 ROS 包的源代码。
  • build/:CMake 构建文件生成目录。
  • devel/:编译后生成的开发环境,包含环境配置脚本 setup.bash

2. .bashrc 文件

.bashrc 是 Bash Shell 的配置文件,每次启动新的终端会话时都会执行。通过在 .bashrc 中添加 source 命令,可以自动加载 ROS 环境和多个工作空间的配置,从而简化开发流程。

二、工作空间加载顺序的重要性

1. setup.bash 的作用

每个 Catkin 工作空间的 devel/setup.bash 文件负责设置环境变量,尤其是 ROS_PACKAGE_PATH,以便 ROS 工具能够找到和使用该工作空间中的包。执行 source devel/setup.bash 会将该工作空间的路径优先级提升,使其包含的包在 ROS 系统中具有更高的优先级。

2. 多工作空间叠加(Overlay Workspaces)

当存在多个工作空间时,后加载的工作空间会覆盖先前加载的工作空间中相同名称的包。这意味着加载顺序直接影响 ROS 包的解析和优先级。例如,如果两个工作空间都包含 cv_bridge 包,最后加载的工作空间中的 cv_bridge 将被 ROS 系统优先识别。

3. 环境变量的累积和覆盖

  • ROS_PACKAGE_PATH:包含所有 ROS 包的搜索路径,顺序决定了包的优先级。后添加的路径优先级更高。
  • PATHLD_LIBRARY_PATHPKG_CONFIG_PATH 等:这些环境变量也会受到加载顺序的影响,可能导致库和可执行文件的冲突或版本不兼容。

三、常见问题分析

1. rospack find cv_bridge 无法找到包

用户在 .bashrc 中加载多个工作空间时,特别是将 source ~/pointcloudmap_ws/devel/setup.bash 放在最后,会导致 rospack find cv_bridge 无法找到 cv_bridge 包。这通常是因为:

  • 加载顺序问题:后加载的工作空间可能缺少 cv_bridge 包,或包含不同版本,覆盖了前面工作空间中的配置。
  • 错误的 ROS_PACKAGE_PATH 设置:手动添加路径时添加了包本身而非其父目录,导致 ROS 无法正确解析。

2. 环境变量冲突

加载多个工作空间时,若不同工作空间中存在相同名称的包或依赖不同版本的库(如 OpenCV),可能导致编译或运行时错误。

四、详细解决方案

1. 正确设置 ROS_PACKAGE_PATH

确保 ROS_PACKAGE_PATH 包含的是 ROS 包的父目录,而不是包本身的路径。例如:

  • 错误设置
    export ROS_PACKAGE_PATH=$ROS_PACKAGE_PATH:~/vision_opencv/cv_bridge
    
  • 正确设置
    export ROS_PACKAGE_PATH=$ROS_PACKAGE_PATH:~/vision_opencv
    

示例解释
假设 cv_bridge 位于 ~/vision_opencv/cv_bridge,则应将 ~/vision_opencv 添加到 ROS_PACKAGE_PATH,使 ROS 能在该目录下查找所有包。

2. 优化 .bashrc 中的工作空间加载顺序

加载多个工作空间时,建议将包含关键依赖包(如 cv_bridge)的工作空间放在最前面,其他工作空间按优先级递减的顺序加载。这样,关键包的版本优先级最高,避免被后加载的工作空间覆盖。

示例 .bashrc 配置

# >>> conda initialize >>>
# !! Contents within this block are managed by 'conda init' !!
__conda_setup="$('/home/lyb/anaconda3/bin/conda' 'shell.bash' 'hook' 2> /dev/null)"
if [ $? -eq 0 ]; theneval "$__conda_setup"
elseif [ -f "/home/lyb/anaconda3/etc/profile.d/conda.sh" ]; then. "/home/lyb/anaconda3/etc/profile.d/conda.sh"elseexport PATH="/home/lyb/anaconda3/bin:$PATH"fi
fi
unset __conda_setup
# <<< conda initialize <<<export JAVA_HOME=/usr/lib/jvm/default-java/jre# OpenCV 3.2.0 环境变量设置
export PATH=/usr/local/opencv3.2.0/bin:$PATH
export LD_LIBRARY_PATH=/usr/local/opencv3.2.0/lib:$LD_LIBRARY_PATH
export PKG_CONFIG_PATH=/usr/local/opencv3.2.0/lib/pkgconfig:$PKG_CONFIG_PATH# ROS 环境配置
source /opt/ros/noetic/setup.bash# 加载关键工作空间(包含 cv_bridge 的工作空间)
source ~/catkin_ws/devel/setup.bash# 加载其他工作空间,顺序从高优先级到低优先级
source ~/AutoPaintRobot/devel/setup.bash
source ~/demo_ros-control_ws/devel/setup.bash
source ~/ros_web/devel/setup.bash
source ~/ROS-Noetic-pr2/catkin_ws/devel/setup.bash
source ~/catkin_ws_1/devel/setup.bash
source ~/Orbbec_ws/devel/setup.bash
source ~/pointcloudmap_ws/devel/setup.bash# 添加 GCC 工具链和 Python 路径
export PATH=/home/lyb/gcc-arm-none-eabi-5_4-2016q2/bin:$PATH
export PATH=/usr/local/python3.10.14/bin:$PATH# 设置别名和其他环境变量
alias python='python3'# 添加 ROS 库路径
export PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/opt/ros/noetic/lib/pkgconfig

示例解释

  1. 加载 ROS 基础环境

    source /opt/ros/noetic/setup.bash
    

    这是 ROS Noetic 的全局配置,必须首先加载。

  2. 加载关键工作空间

    source ~/catkin_ws/devel/setup.bash
    

    假设 ~/catkin_ws 包含 cv_bridge,将其放在最前面,确保其包在 ROS_PACKAGE_PATH 中优先级最高。

  3. 加载其他工作空间

    source ~/AutoPaintRobot/devel/setup.bash
    source ~/demo_ros-control_ws/devel/setup.bash
    ...
    

    按照使用频率或依赖关系,从高优先级到低优先级依次加载。

  4. 环境变量设置

    export PATH=/usr/local/opencv3.2.0/bin:$PATH
    export LD_LIBRARY_PATH=/usr/local/opencv3.2.0/lib:$LD_LIBRARY_PATH
    export PKG_CONFIG_PATH=/usr/local/opencv3.2.0/lib/pkgconfig:$PKG_CONFIG_PATH
    

    确保自定义库路径优先于系统默认路径,避免版本冲突。

3. 避免手动设置 ROS_PACKAGE_PATH

依赖于 Catkin 工作空间的 setup.bash 自动管理 ROS_PACKAGE_PATH,避免手动干预,以减少配置冲突。若确实需要手动添加路径,确保添加的是包的父目录。

错误示例

export ROS_PACKAGE_PATH=$ROS_PACKAGE_PATH:~/vision_opencv/cv_bridge

正确示例

export ROS_PACKAGE_PATH=$ROS_PACKAGE_PATH:~/vision_opencv

4. 使用工作空间叠加(Overlay Workspaces)

Catkin 支持叠加多个工作空间,后加载的工作空间可以覆盖前加载的工作空间中的包。确保加载顺序符合优先级需求。

示例

假设有两个工作空间:

  • ~/catkin_ws:包含核心包,如 cv_bridge
  • ~/pointcloudmap_ws:包含自定义包,可能依赖 cv_bridge

加载顺序

  1. ~/catkin_ws:核心包优先加载
  2. ~/pointcloudmap_ws:自定义包加载,依赖于核心包
source ~/catkin_ws/devel/setup.bash
source ~/pointcloudmap_ws/devel/setup.bash

5. 示例 .bashrc 配置与解释

完整示例

# >>> conda initialize >>>
# !! Contents within this block are managed by 'conda init' !!
__conda_setup="$('/home/lyb/anaconda3/bin/conda' 'shell.bash' 'hook' 2> /dev/null)"
if [ $? -eq 0 ]; theneval "$__conda_setup"
elseif [ -f "/home/lyb/anaconda3/etc/profile.d/conda.sh" ]; then. "/home/lyb/anaconda3/etc/profile.d/conda.sh"elseexport PATH="/home/lyb/anaconda3/bin:$PATH"fi
fi
unset __conda_setup
# <<< conda initialize <<<export JAVA_HOME=/usr/lib/jvm/default-java/jre# OpenCV 3.2.0 环境变量设置
export PATH=/usr/local/opencv3.2.0/bin:$PATH
export LD_LIBRARY_PATH=/usr/local/opencv3.2.0/lib:$LD_LIBRARY_PATH
export PKG_CONFIG_PATH=/usr/local/opencv3.2.0/lib/pkgconfig:$PKG_CONFIG_PATH# ROS 基础环境配置
source /opt/ros/noetic/setup.bash# 加载包含关键依赖包的工作空间
source ~/catkin_ws/devel/setup.bash# 加载其他工作空间,按优先级递减顺序
source ~/AutoPaintRobot/devel/setup.bash
source ~/demo_ros-control_ws/devel/setup.bash
source ~/ros_web/devel/setup.bash
source ~/ROS-Noetic-pr2/catkin_ws/devel/setup.bash
source ~/catkin_ws_1/devel/setup.bash
source ~/Orbbec_ws/devel/setup.bash
source ~/pointcloudmap_ws/devel/setup.bash# 添加 GCC 工具链和 Python 路径
export PATH=/home/lyb/gcc-arm-none-eabi-5_4-2016q2/bin:$PATH
export PATH=/usr/local/python3.10.14/bin:$PATH# 设置别名和其他环境变量
alias python='python3'# 添加 ROS 库路径
export PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/opt/ros/noetic/lib/pkgconfig# 确保 `cv_bridge` 的父目录已在 ROS_PACKAGE_PATH 中
export ROS_PACKAGE_PATH=$ROS_PACKAGE_PATH:~/vision_opencv

示例解释

  1. Conda 初始化

    • 保持 Conda 环境的正确加载,不影响 ROS 环境配置。
  2. JAVA_HOME 设置

    • 设置 Java 环境变量,供需要 Java 的工具使用。
  3. OpenCV 3.2.0 环境变量设置

    • 手动指定 OpenCV 3.2.0 的路径,确保使用特定版本的 OpenCV。
    • 注意:若 ROS Noetic 默认使用 OpenCV 4,需谨慎管理版本冲突。
  4. 加载 ROS 基础环境

    • source /opt/ros/noetic/setup.bash:加载 ROS Noetic 的全局配置。
  5. 加载关键工作空间

    • source ~/catkin_ws/devel/setup.bash:包含核心依赖包,如 cv_bridge,优先加载以确保其包优先级最高。
  6. 加载其他工作空间

    • 按优先级递减顺序加载其他工作空间,避免覆盖关键依赖包。
  7. 添加工具链和 Python 路径

    • 将自定义工具链和 Python 版本添加到 PATH,确保使用特定版本。
  8. 设置别名和其他环境变量

    • 设置 python 别名为 python3,确保脚本使用正确的 Python 版本。
  9. 添加 ROS 库路径

    • 确保 ROS 库路径正确添加,避免库文件冲突。
  10. 确保 ROS_PACKAGE_PATH 正确

    • 添加 ~/vision_opencv,使 ROS 能正确查找 cv_bridge 包。

6. 验证配置

在修改 .bashrc 后,执行以下命令以使更改生效:

source ~/.bashrc

然后,验证 cv_bridge 是否可被识别:

rospack find cv_bridge

若返回正确的路径(例如 /home/lyb/catkin_ws/src/vision_opencv/cv_bridge),说明配置正确。

五、总结与最佳实践

1. 加载顺序策略

  • 核心工作空间优先:包含关键依赖包(如 cv_bridge)的工作空间应最先加载,确保其包在 ROS_PACKAGE_PATH 中优先级最高。
  • 叠加工作空间:后加载的工作空间在叠加时覆盖前加载的工作空间中的同名包,应根据需要安排加载顺序。

2. 环境变量管理

  • 避免手动修改 ROS_PACKAGE_PATH:依赖 setup.bash 自动管理,减少人为错误。
  • 处理库版本冲突:尽量使用 ROS 默认的库版本,避免手动指定不同版本的库,除非必要。
  • 统一使用 catkin 构建系统:避免混用过时的 rosbuild 构建系统,以减少依赖识别问题。

3. 工作空间维护

  • 保持工作空间整洁:定期清理不必要的包和依赖,减少潜在冲突。
  • 版本控制:使用 Git 等版本控制系统管理工作空间,方便回滚和协作。
  • 文档记录:记录各工作空间的用途、依赖和配置,便于维护和问题排查。

4. 参考资源

  • ROS 官方文档:Catkin Workspace
  • 社区支持:ROS Answers
  • 最佳实践指南:ROS Wiki - Best Practices

通过遵循上述指南和最佳实践,您可以有效管理多个 ROS 工作空间,避免常见的环境配置问题,确保 ROS 包的正确识别和功能的稳定运行。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/62769.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

第三方Cookie的消亡与Google服务器端标记的崛起

随着互联网用户对隐私保护的关注日益增强&#xff0c;各大浏览器正在逐步淘汰第三方Cookie。这一变革深刻影响了广告商和数字营销人员的用户跟踪和数据分析方式。然而&#xff0c;Google推出的服务器端标记技术为这一挑战提供了新的解决方案。 什么是第三方Cookie&#xff1f; …

SQL注入利用方式(实战Hack World 1)

一、布尔盲注利用 假如注入的网页能返回1或0的提示信息&#xff0c;我们可以写如下代码: select password from admin where username 1 or 11;#11是我们利用的逻辑点&#xff0c;我们能在此处进行一个判断&#xff0c;比如判断某个数据字段第几位上的字符是否为’ 1’&#…

nlp培训重点

SGD梯度下降公式&#xff1a; 当梯度大于0时&#xff0c;变小&#xff0c;往左边找梯度接近0的值。 当梯度小于0时&#xff0c;减去一个负数会变大&#xff0c;往右边找梯度接近0的值&#xff0c;此时梯度从负数到0上升 #coding:utf8import torch import torch.nn as nn impo…

Qt5语法的connect指定多个重载信号槽函数中的具体某一个

Qt5新语法的connect函数&#xff0c;使用起来更加简洁明了&#xff0c;但如果信号槽有同名的多个重载函数&#xff0c;只用类名和函数名就无法绑定&#xff0c;这时&#xff0c;可以使用qOverload来指定参数类型&#xff0c;例如&#xff1a; connect(ui->comboBox, qOverlo…

如何在Spark中使用gbdt模型分布式预测

这目录 1 训练gbdt模型2 第三方包python环境打包3 Spark中使用gbdt模型3.1 spark配置文件3.2 主函数main.py 4 spark任务提交 1 训练gbdt模型 我们可以基于lightgbm快速的训练一个gbdt模型&#xff0c;训练相对比较简单&#xff0c;只要把训练样本处理好&#xff0c;几行代码可…

38 基于单片机的宠物喂食(ESP8266、红外、电机)

目录 一、主要功能 二、硬件资源 三、程序编程 四、实现现象 一、主要功能 基于STC89C52单片机&#xff0c;采用L298N驱动连接P2.3和P2.4口进行电机驱动&#xff0c; 然后串口连接P3.0和P3.1模拟ESP8266&#xff0c; 红外传感器连接ADC0832数模转换器连接单片机的P1.0~P1.…

Python 【图像分类】之 PyTorch 进行猫狗分类功能的实现(Swanlab训练可视化/ Gradio 实现猫狗分类 Demo)

Python 【图像分类】之 PyTorch 进行猫狗分类功能的实现(Swanlab训练可视化/ Gradio 实现猫狗分类 Demo) 目录 Python 【图像分类】之 PyTorch 进行猫狗分类功能的实现(Swanlab训练可视化/ Gradio 实现猫狗分类 Demo) 一、简单介绍 二、PyTorch 三、CNN 1、神经网络 2、卷…

HTML5系列(7)-- Web Storage 实战指南

前端技术探索系列&#xff1a;HTML5 Web Storage 实战指南 &#x1f5c4;️ 致读者&#xff1a;本地存储的新纪元 &#x1f44b; 前端开发者们&#xff0c; 今天我们将深入探讨 HTML5 中的 Web Storage 技术&#xff0c;这是一个强大的本地存储解决方案&#xff0c;让我们能…

week 6 - SQL Select II

Overview 1. Joins 包括交叉连接&#xff08;Cross&#xff09;、内连接&#xff08;Inner&#xff09;、自然连接&#xff08;Natural&#xff09;、外连接&#xff08;Outer&#xff09; 2. ORDER BY to produce ordered output 3. 聚合函数&#xff08;Aggregate Functio…

算法训练营day23(二叉树09:修建二叉搜索树,有序数组转化为平衡二叉搜索树,二叉搜索树转化为累加树,二叉树专题总结)

第六章 二叉树part09今日内容&#xff1a;● 669. 修剪二叉搜索树 ● 108.将有序数组转换为二叉搜索树 ● 538.把二叉搜索树转换为累加树 ● 总结篇 详细布置 669. 修剪二叉搜索树 这道题目比较难&#xff0c;比 添加增加和删除节点难的多&#xff0c;建议先看视频理解。题目…

C语言操作符深度解析

目录 一、操作符的分类 1、算术操作符 1、1、 和- 1、2、* 1、3、/ 1、4、% 2、赋值操作符&#xff1a;和复合赋值 2、1、连续赋值 2、2、复合赋值符 3、单⽬操作符&#xff1a;、--、、- 3、1、和-- 3、1、1、前置 3、1、2、后置 3、2、1、前置-- 3、2、2、后…

打造高质量技术文档的关键要素(结合MATLAB)

在技术的浩瀚海洋中&#xff0c;一份优秀的技术文档宛如精准的航海图。它不仅是知识传承的载体&#xff0c;也是团队协作的桥梁&#xff0c;更是产品成功的幕后英雄。打造出色的技术文档并非易事&#xff0c;以下将从多个方向探讨如何做到这一点。 文章目录 方向一&#xff1a;…

《C++与人工智能:照亮能源可持续发展之路》

在全球对能源需求持续攀升以及对可持续发展日益重视的当下&#xff0c;如何有效解决能源领域的复杂问题成为了亟待攻克的关键挑战。而 C与人工智能技术的融合&#xff0c;正犹如一盏明灯&#xff0c;为能源管理、可再生能源预测等方面开辟出全新的路径&#xff0c;有力地推动着…

Python 深度学习框架之Keras库详解

文章目录 Python 深度学习框架之Keras库详解一、引言二、Keras的特点和优势1、用户友好2、多网络支持3、跨平台运行 三、Keras的安装和环境配置1、软硬件环境2、Python虚拟环境 四、使用示例1、MNIST手写数字识别 五、总结 Python 深度学习框架之Keras库详解 一、引言 Keras是…

【大语言模型】ACL2024论文-23 检索增强的多语言知识编辑

【大语言模型】ACL2024论文-23 检索增强的多语言知识编辑 目录 文章目录 【大语言模型】ACL2024论文-23 检索增强的多语言知识编辑目录摘要研究背景问题与挑战如何解决核心创新点算法模型实验效果&#xff08;包含重要数据与结论&#xff09;相关工作后续优化方向 后记 检索增强…

android user版本默认usb模式为充电模式

android插入usb时会切换至默认设置的模式&#xff0c;debug版本为adb&#xff0c;user版本为mtp protected long getChargingFunctions() {// if ADB is enabled, reset functions to ADB// else enable MTP as usual.if (isAdbEnabled()) {return UsbManager.FUNCTION_ADB;} e…

_C#_串口助手_字符串拼接缺失问题(未知原理)

最近使用WPF开发串口助手时&#xff0c;遇到一个很奇怪的问题&#xff0c;无论是主线程、异步还是多线程&#xff0c;当串口接收速度达到0.016s一次以上&#xff0c;就会发生字符串缺失问题并且很卡。而0.016s就一切如常&#xff0c;仿佛0.015s与0.016s是天堑之隔。 同一份代码…

CF Round988 题解报告

/***实力还是要努力 D 赛时我过了&#xff0c;就不讲了&#xff0c;毕竟我过的也大概是简单题&#xff1b; 代码&#xff1a; #include<iostream> #include<queue> using namespace std; #define int long long int t; int n,m,l; struct hurdle{int l,r,len; …

基于Python的猎聘网招聘数据采集与可视化分析

1.1项目简介 在现代社会&#xff0c;招聘市场的竞争日趋激烈&#xff0c;企业和求职者都希望能够更有效地找到合适的机会与人才。猎聘网作为国内领先的人力资源服务平台&#xff0c;汇聚了大量的招聘信息和求职者数据&#xff0c;为研究招聘市场趋势提供了丰富的素材。基于Pyt…

HTML 常用标签属性汇总一<input> 标签

1.可选的属性 DTD 指示此属性允许在哪种 DTD 中使用.SStrict, TTransitional, FFrameset。 属性 值 描述 DTD accept mime_type 规定通过文件上传来提交的文件的类型。 STF align ​​​​​​​ left center right middle bottom 不赞成使用。规定图像输入的对齐方式…