ROS 中setup.bash

2023-05-16

好久没写了,最近搞了辆小车,瞅了瞅ROS的相关内容,没有写ROS的内容,刚开始看,写的话基本就成了书本粘贴。。。不过最近由ROS引出来的一些Linux相关的东西,然后又回头撸了撸私房菜,还是有一些收获的。

先说一下此篇的起因,就是在创建了ROS 的workspace之后,需要将workspace中的setup.bash文件写入~/.bashrc 文件中,让其启动:
就像这个样子:

source /opt/ros/kinetic/setup.bash

这句的目的就是在开新的terminal的时候,运行这个setup.bash,而这个setup.bash的作用是让一些ROS* 开头的命令可以使用。同时还能够创建一些ROS开头的环境变量,比如:

ROS_PACKAGE_PATH

这个环境变量是一堆路径字符串:

ROS_PACKAGE_PATH="/opt/ros/kinetic/share"

用来表征ROS功能包路径,当你使用:

rospack find {packagename}

搜寻功能包所在的路径时,它会依据ROS_PACKAGE_PATH 所提供的功能包路径里去寻找,不在这个环境变量里的路径就不会去寻找了,即便你有这个功能包,也会显示找不到。

继续捯饬的过程中发现这么个现象:
假如我在~/.bashrc中加入这么一堆的source:

source /opt/ros/kinetic/setup.bash

source ~/catkin_ws/devel/setup.bash
source ~/robin_ws/devel/setup.bash

source ~/riki/tySDK/camport_ros-master/devel/setup.bash
source ~/riki/catkin_ws/devel/setup.bash

本来以为ROS_PACKAGE_PATH 会依次增加,把每一个功能包的路径都添加上,但是发现不是,貌似会有干扰。就是只有第一句的时候,ROS_PACKAGE_PATH="/opt/ros/kinetic/share" 加上后面的之后会变化,并不是加一句,增加一条,而是没有什么规律。。。
比如我只有这两句:

source /opt/ros/kinetic/setup.bash
source ~/catkin_ws/devel/setup.bash

的时候ROS_PACKAGE_PATH 是这样的:

robin@robin:~$ echo $ROS_PACKAGE_PATH
/home/robin/catkin_ws/src:/home/robin/robin_ws/src:/home/robin/riki/tySDK/camport_ros-master/src:/opt/ros/kinetic/share

但是,我再加一句:

source /opt/ros/kinetic/setup.bash

source ~/catkin_ws/devel/setup.bash
source ~/robin_ws/devel/setup.bash

再source一下:

robin@robin:~$ echo $ROS_PACKAGE_PATH
/home/robin/robin_ws/src:/home/robin/riki/tySDK/camport_ros-master/src:/opt/ros/kinetic/share

我的/home/robin/catkin_ws/src 竟然没了?!
一头雾水,猜测是不是这样source好多,他们之间会干扰,于是打开上面的setup.bash文件,看看究竟:

#!/usr/bin/env bash
# generated from catkin/cmake/templates/setup.bash.in

CATKIN_SHELL=bash

# source setup.sh from same directory as this file
_CATKIN_SETUP_DIR=$(builtin cd "`dirname "${BASH_SOURCE[0]}"`" > /dev/null && pwd)
. "$_CATKIN_SETUP_DIR/setup.sh"

整个_CATKIN_SETUP_DIR 其实就是获得当前正在执行的脚本的所在路径,然后第二句执行一下同路径下的setup.sh文件。
主要来解析一下这一句:

_CATKIN_SETUP_DIR=$(builtin cd "`dirname "${BASH_SOURCE[0]}"`" > /dev/null && pwd)

一步步拆解:
1、首先最内层的:${BASH_SOURCE[0]}
参见:https://www.cnblogs.com/sunfie/p/5943979.html
总体来说就是:BASH_SOURCE[0] , 取得当前执行的shell文件所在的路径及文件名。
举个栗子:比如你在~/test中有个test.sh文件,文件中有这么一句:echo ${BASH_SOURCE[0]}
运行结果是这样的:

robin@robin:~$ ./test/test.sh 
./test/test.sh

会输出路径加文件名。

2、"${BASH_SOURCE[0]}"
这句会把双引号内的东西全部转换成字符串。不过这里貌似${BASH_SOURCE[0]} 的结果输出本身就是字符串吧。。。

3、dirname "${BASH_SOURCE[0]}"
参考:http://man.linuxde.net/dirname
总结就是去除字符串中的文件名称,只留路径部分。测试一哈,还是我们的~/test中有个test.sh文件,文件中之前的那句改一改:

echo `dirname ${BASH_SOURCE[0]}`

输出结果变为:

robin@robin:~$ ./test/test.sh
./test

只有test.sh所在的路径了。

3

`dirname "${BASH_SOURCE[0]}"`

这步比上面多了对反引号。
参考:http://blog.csdn.net/jackyechina/article/details/52813007
总结就是:【`】,学名叫“倒引号”, 如果被“倒引号”括起来, 表示里面需要执行的是命令。
因为整个整体在双引号中,若不夹这个反引号,diename会被变成字符串,加上倒引号后,表征倒引号中的内容是一行命令,主要是指dirname命令

"`dirname "${BASH_SOURCE[0]}"`"

4

builtin cd "`dirname "${BASH_SOURCE[0]}"`"

参看:http://man.linuxde.net/builtin
主要意思就是使用shell内建的cd命令进入当前脚本所在的目录。

5

builtin cd "`dirname "${BASH_SOURCE[0]}"`" > /dev/null

此步多了个 > /dev/null
参看:https://zhidao.baidu.com/question/223779994.html
大概意思就是不要输出任何东西吧,我猜的。。。

6

&&

参看:http://blog.csdn.net/a627088424/article/details/20360107
前一条执行成功后,执行后面的命令。

7 pwk
参看:http://man.linuxde.net/pwd
显示用户当前工作目录的绝对路径。

_CATKIN_SETUP_DIR=$(builtin cd "`dirname "${BASH_SOURCE[0]}"`" > /dev/null && pwd)

所以整个语句流程就是取得本shell的绝对路径和名称,然后dirname去掉名称只留路径,然后进入此路径,同时将cd 的输出扔掉,不予显示。然后这步执行成功的话pwk出绝对路径然后赋值给_CATKIN_SETUP_DIR变量。

巴特!搞了这么久貌似还是没有找到为什么source之间会干扰。。。
后来又查询到底如何正规的修改环境变量:

export ROS_PACKAGE_PATH=${ROS_PACKAGE_PATH}:/home/robin/catkin_ws/src

直观上就是将环境变量再赋值一下,并在后面接上一段。。。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ROS 中setup.bash 的相关文章

  • Bash 脚本 - 迭代 find 的输出

    我有一个 bash 脚本 其中需要迭代 find 命令输出的每一行 但似乎我正在迭代 find 命令中的每个单词 以空格分隔 到目前为止我的脚本看起来像这样 folders find maxdepth 1 type d for i in f
  • MP4 到 DASH(bash 脚本)

    我有一个网站 用户可以在其中上传视频文件 我想使用 DASH 流式传输所有内容以获得自适应比特率流式传输 因此 我编写了一个 bash 脚本 由 cron 运行 将所有 mp4 文件转换为 DASH 但它无法正常工作 出了什么问题 例如 使
  • 使用 mkfifo 和传输流,这可能吗?

    我想执行一个 bash 脚本来执行以下操作 应用程序 ffmpeg 生成实时传输流 ts 文件 我需要处理这个实时流 执行解复用等 现在我知道这必须通过 FIFO 来完成 但这是我的任务 我需要重定向 ffmpeg 的输出以写入 fifo
  • `docker run` 输出到 bash 变量 - 奇怪的行为

    我看到一些奇怪的行为从docker run到 bash 变量中 简单的例子 bin bash PWD docker run rm ti ubuntu pwd 2 gt 1 also tried with PWD docker run wit
  • 自动检测log4j静态初始化错误的方法

    请注意 这更像是 Bash 问题 而不是 Java 问题 请参阅下面的注释 在每个类中配置log4j时 我们执行以下操作 public class Example private static final Logger log Logger
  • CentOS目录结构是树形的吗?

    CentOS 上有相当于树的东西吗 如果你的 Centos 系统上没有安装 tree 无论如何我通常建议服务器设置使用最小安装磁盘 你应该在命令行中输入以下内容 yum install tree y 如果没有安装 那是因为您没有正确的存储库
  • touch命令在一个目录下创建多个文件(不同名称)

    我想制作一个在 bash 中创建目录和文件结构的脚本 我尝试过这样的事情 mkdir p 1 2 touch 1 2 a b c a b c 应该是在一个命令或其他命令中创建的文件 但由于某种原因 结构是这样的 current folder
  • POSIX SH 构建循环变量,其元素包含空格

    这是我需要的代码 bin sh x1 a1 a2 x2 b1 b2 list SOMETHING for x in list do echo x done 以及我想要的输出 a1 a2 b1 b2 问题是 应该做什么SOMETHING是 我
  • 未找到命令“ember”

    看来我搞砸了 ember cli 安装 我已经使用 sudo 安装了 npm 但是在阅读了 npm 上 ember cli 和 sudo 的一些问题后 我按照此处的说明卸载并重新安装https gist github com isaacs
  • 如何将 bash 脚本的整个输出保存到文件

    我正在尝试将 bash 脚本的整个输出保存到文件中 我目前在代码开头有一个参数 ip 地址 如下所示 bin bash USAGE Usage 0
  • 如何显示 zsh 函数定义(如 bash“type myfunc”)?

    如何在 zsh 中显示函数的定义 type foo没有给出定义 在bash中 bash function foo echo hello bash foo hello bash type foo foo is a function foo e
  • bash 变量中的 Linux 鞭尾/对话框参数错误

    有人可以解释为什么下面的代码不起作用吗 我要疯狂地想找出答案 bin bash TEST M1 1 wire Interface ON echo TEST RESULT dialog title Config Modules State c
  • 从 PL/SQL 调用 shell 脚本,但 shell 以 grid 用户而非 oracle 身份执行

    我正在尝试使用 Runtime getRuntime exec 从 Oracle 数据库内部执行 shell 脚本 在 Red Hat 5 5 上运行的 Oracle 11 2 0 4 EE CREATE OR REPLACE proced
  • awk 子串单个字符

    这是columns txt aaa bbb 3 ccc ddd 2 eee fff 1 3 3 g 3 hhh i jjj 3 kkk ll 3 mm nn oo 3 我可以找到第二列以 b 开头的行 awk if substr 2 1 1
  • 语法错误:for 循环变量不正确

    我正在尝试编写一个可以在后台调高收音机音量的脚本 bin sh for i 80 i lt 101 i do amixer cset numid 1 i sleep 60 done 但我有问题 alarmclock vol sh 3 ala
  • 通过特定分隔符删除字符串

    我的文件中有几列 其中第二列有 分隔符 我想删除第二列中的第一个 第三个和第四个字符串 并将第二个字符串留在该列中 但我有正常的分隔符空间 所以我不知道 input 22 16050075 A G 16050075 A G 22 16050
  • 如何使用 bash 锁定文件

    我有一个任务从远程服务器同步目录 rsync av email protected cdn cgi l email protection srv data srv data 为了使其定期运行并避免脚本 reEnter 问题 我使用 rsyn
  • .profile 无法从 Mac 终端运行

    我有一个 profile 文件 我正在终端中读取并使用别名 但在某些时候 别名由于没有明确的原因而停止工作 其他命令仍在工作 为了快速修复 我删除了 rm 并在用户目录中重新创建了 profile 文件 我可以看到 至少在该目录中没有 ba
  • bash 中 :-(冒号破折号)的用法

    bash中这种风格的含义是什么 PUBLIC INTERFACE eth0 目的是什么 If PUBLIC INTERFACE存在且不为null 则返回其值 否则返回 eth0 实际上有一些记录在bash 手册页 http linux di
  • 如何在 Linux 中编写文本模式 GUI? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 当我编写脚本 程序时 我经常想弹出一个简单的文本 gui 来提示输入 我该怎么做 例如 来自 Shel

随机推荐

  • 使用VNC可视化Docker容器

    使用VNC可视化Docker容器 0 前言环境 xff1a 1 容器端配置1 1 启动Docker容器1 2 安装x111 3 安装桌面环境1 4 安装tightvncserver 2 配置VNC Server2 1 首先停止刚刚新建的虚拟
  • STM32 串口ISP下载方式解读

    xfeff xfeff http blog sina com cn s blog b09739ab0102v4rm html Flash Loader Demonstrator 下 载工具的安装 1 xff0e 硬件的连接和设置 串口ISP
  • with异常处理

    class A 39 39 39 此类的对象可以用 xff57 xff49 xff54 xff48 语句进行管理 39 39 39 def enter self print 34 已经进入with语句 34 return self def
  • telegram android 源码分析 (一)自动设置代理

    比如自动设置mtproxy代理 xff0c 冗长的代码我们怎么去找 xff1f 1 xff09 首先我们发现点代理链接能弹对话框 xff0c 们可以在strings xml中搜索得到 xff1a lt string name 61 34 U
  • NS3 的 ipv4-static-routing-test-suite 源码分析

    下面进行源码注释 xff1a End to end tests for Ipv4 static routing include 34 ns3 boolean h 34 include 34 ns3 config h 34 include 3
  • c语言向上取整计算方法

    用整数N 除以 M xff0c 要求向上取整数 1 xff09 int n 61 N 43 M 1 M xff1b 简化后就是 xff1a 2 xff09 int n 61 N 1 M 43 1 xff1b 最笨的办法 3 int n 61
  • 比std::qsort还快的快速排序(1千万整数1.7秒)——(快速排序栈溢出与递归优化)

    前几天发现老外的开源项目中事件队列中用的就是std qsort排序 xff0c 后续插入时候使用了堆方式 快速排序实际应用中是比堆排序要快的 xff0c 这主要是因为硬件层次会对数据执行高速缓存 xff0c 数据使用一二三级高速缓存比访问内
  • C#使用ProtoBuf

    1 Google ProtoBuf 经过测试 xff0c protobuf比json存储效率还是要高 xff0c 即时号称最快的fastjson也没有protobuf快 xff0c 这里为了使用 c 做一个客户端兼容 xff0c 所以也需要
  • 多线程如何实现高性能计数器(无锁)

    多线程协作免不了使用计数器 xff0c 通常的代码 xff0c c 43 43 一般会使用锁 xff0c 或者原子变量操作 xff1a std mutex mutexCounter int count void add std lock g
  • ubuntu18/20 下如何生成core文件

    ubuntu18 20 下如何生成core文件 一 设置 原理 xff1a https blog csdn net Sunnyside article details 118439302 原来在ubuntu14 ubuntu16上只需要一步
  • c++的字节序与符号位的问题

    看这样一道题 xff1a include lt stdio h gt int main void int w h int i 61 0xa1b2c3d4 char p 61 char amp i for int j 61 0 j lt 4
  • docker镜像之带vnc的ubuntu

    docker镜像 之 带vnc图形界面ubuntu 前言 xff1a 为了在图形界面中使用firefox xff0c 需要找一个带rdp或者vnc的ubuntu xff0c 最好是gnome的界面 xff0c 折腾了3天 xff0c 终于找
  • STM32中,关于中断函数调用全局变量的问题

    xfeff xfeff https blog csdn net leo liu006 article details 79334905 首先是问题的描述 xff1a 硬件单片机型号 xff0c STM32F103VET6 xff0c IDE
  • python使用selenium以及selenium-wire做质量与性能检测

    python天生就是适合用来做爬虫 xff0c 结合selenium真是如虎添翼 xff1b 1 安装库 pip install selenium pip install selenium wire 2 xff09 添加驱动 xff0c 比
  • 编写http workshop脚本从网页缓存里解析音乐

    前一篇文章 编写http workshop脚本从网站下载音乐 示范了如何使用HttpClient访问API 以及Json数据的解析 今天我们通过解析一个网页展示如何使用内置的LibXml2的功能解析HTML 提取我们关心的内容 这里随便搜了
  • pytorch环境搭建若干

    备注 xff1a 不要使用python3 11不支持 xff0c pip会说找不到合适的版本 xff1b python官网不提供旧版的下载了 xff0c 说是win7以后无法使用 xff0c 都是扯淡 xff0c 有其他地方可以下载pyth
  • ffmpeg常用方法

    FFmpeg 是一款开源的音视频处理工具 xff0c 可以处理各种格式的音视频文件 xff0c 并且可以进行格式转换 剪切 合并 添加水印等多种操作 下面是 FFmpeg 的一些常用命令及其用法 xff1a 视频转码 将一个视频文件转换为另
  • RFC2152 UTF-7 中文

    RFC2152 UTF 7 中文 翻译 xff1a 李静南 时间 xff1a 2006 03 29 EMAIL xff1a robin fox 64 sohu com 版权 xff1a 可以用于非商业用途自由转载 xff0c 但请保留本文档
  • 第九章0.4的CMakeLists.txt结构

    最开始看这一章的时候 xff0c 将CMakeLists txt部分跳过了 xff0c 没有看 后来看高博RGBD SLAM时候 xff0c 第一讲降到了cmake的用法 xff0c 发现有新的东西 xff0c 又回头看 xff1a 最原始
  • ROS 中setup.bash

    好久没写了 xff0c 最近搞了辆小车 xff0c 瞅了瞅ROS的相关内容 xff0c 没有写ROS的内容 xff0c 刚开始看 xff0c 写的话基本就成了书本粘贴 不过最近由ROS引出来的一些Linux相关的东西 xff0c 然后又回头