wstool ros空间管理工具

Posted zxzmnh

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了wstool ros空间管理工具相关的知识,希望对你有一定的参考价值。

查看ROS的默认空间: 使用以下命令可以查看ROS默认使用的工作空间:

$ echo $ROS_PACKAGE_PATH

1.wstool 用于从多个版本控制系统维护项目工作空间的命令行工具。wstool是一个操作ROS工作区的命令。 wstool取代了它的前身rosws。wstool提供了基于单个工作空间定义文件(.rosinstall)管理多个本地SCM存储库(支持git,mercurial,subversion,bazaar)的命令。wstool不是重写。它旨在重用大部分的rosws工具代码,从而生成与rosws使用的.rosinstall文件兼容的.rosinstall文件。wstool依赖于vcstools包,并且在过渡期间它还将依赖于rosinstall包(稍后将依赖于该依赖关系)。

1.1.安装 $ sudo apt-get install python-wstool $ sudo pip install -U wstool 1.2.从rosws和rosbuild的变化 rosbuild和rosws使用ROS_WORKSPACE环境变量来确定您正在使用的工作空间.

catkin从当前工作目录中确定这一点。 使用-t参数指定wstool的工作空间,wstool工作空间的根目录是catkin源目录的根目录:

~/ros_catkin_ws/ <-- Invoke catkin_make from here ├── src/ <-- Use this path for wstool -t │ ├── repository1/ │ │ ├── .git/ │ │ └── my_files │ ├── repository2/ │ │ ├── .git/ │ │ └── my_other_files │ └── .rosinstall ├── devel/ └── build/ rosws生成setup。* sh文件在使用命令“init”或“regenerate”调用时,而CMakeLists.txt则在传递选项“--catkin”时生成。 两者都对ROS生态系统具有隐含的依赖性。 wstool避免了这些依赖关系,并将其留给用户或其他工具(例如catkin)来创建这样的环境设置文件。同样,工作区覆盖由catkin而不是wstool管理。 这意味着您不应将工作区底层放在rosinstall文件中,或使用参考底图初始化工作区。

1.3.使用 wstool 1>在没有rosinstall文件的情况下初始化工作区

这将初始化一个空工作区。如果您有一个想要基于工作区的rosinstall文件,请跳过下面的rosinstall文件初始化工作区 $ wstool init src 如果要将rosinstall文件添加到工作区,请继续下面的“合并其他rosinstall文件”。 2>从rosinstall文件初始化工作区

如果您已初始化工作区,请跳过此步骤。如果要将rosinstall文件添加到工作区,请继续下面的“合并其他rosinstall文件” $ wstool init src PATH_TO_ROSINSTALL_FILE.rosinstall 如果要将rosinstall文件添加到工作区,请继续下面的“合并其他rosinstall文件” 3>合并其他rosinstall文件

对于要添加到工作区的每个rosinstall文件,请运行此命令 $ wstool merge -t src PATH_TO_ROSINSTALL_FILE.rosinstall 4>跟新工空间

创建工作区并添加存储库后,应更新它以下载最新版本。 $ wstool update -t src 1.4.wstool 命令 官方用法:

wstool CMD [ARGS] [OPTIONS] wstool将尝试从上下文推断安装路径 help 帮助提供命令帮助 init 将目录设置为工作空间 set 从工作区配置中添加或更改一个条目 merge 将您的工作区与另一个配置集合并 remove(rm)从工作区配置中删除条目,而不删除文件 scrape 以交互方式将所有找到的非托管VCS子文件夹添加到工作区 update (up) 更新(更新)更新或检查一些配置元素 info 一些条目的概述 status(st) 打印某些SCM控制条目中文件的更改状态 diff(di)在一些SCM控制的条目上打印差异 foreach 在给定条目中运行shell命令 2.rosinstall 使用rosinstall,你可以紧使用一个命令跟新各种SCM(SVN,Mercurial,git,Bazaar)多个文件夹。 rosinstall包提供了一个Python API,用于与源代码工作区以及一组命令行工具进行交互。 Rosinstall利用vcstools包进行源代码控制,并将其状态存储在.rosinstall文件中。 rosinstall是为了帮助ROS软件而开发的,但它没有ROS的安装依赖性。 它为ROS环境提供支持,因此在运行时对ROS进行了一些假设,但这些假设很容易被删除,即使没有安装ROS,rosws也能提供所有服务。 目标是大部分rosinstall有一天成为ROS不可知的工具。 rosinstall执行以下操作: 1.将所有URI合并到PATH中的新的或现有的.rosinstall文件中 2.检出或更新所有版本控制的URI 3.如果从源安装了ros堆栈,请在结帐或更新后调用rosmake。 4.生成/覆盖更新的安装文件

如果使用--catkin模式运行:

1.将所有URI合并到PATH中的新的或现有的.rosinstall文件中 2.检出或更新所有版本控制的URI 4.生成/覆盖更新的安装文件,并在根目录下创建CMakeLists.txt URI可以是远程.rosinstall文件的网址,本地.rosinstall文件,git,svn,bzr,hg URI 或其他(本地目录)以后的URI将影响早期URI的包。 2.1.安装 sudo apt-get install python-rosinstall pip install -U rosinstall pip install -U rosinstall_shellcompletion 2.2.Rosinstall文件格式 1.下面是一个示例rosinstall语法,其中包含大多数可能排列的示例:

  • svn: {local-name: some/local/path2, uri: /some/local/uri}

  • hg: {local-name: some/local/path3, uri: http://some/uri, version: 123}

  • git: {local-name: /some/local/aboslute/path, uri: http://some/uri, version: 123}

  • bzr: {local-name: some/local/path4, uri: http://some/uri, version: 123}

  • setup-file: local-name: /opt/ros/fuerte/setup.sh

  • other: local-name: /opt/ros/fuerte/share/ros 2.4.wstool 命令 -h, - help 显示此帮助消息并退出 -c, - catkin 声明这是一个catkin 编译。 --cmake-prefix-path=CATKINPP 在这里设置CMAKE_PREFIX_PATH,意味着--catkin --version 显示版本信息 --verbose 显示更多信息 -n, --nobuild 跳过ROS堆栈的编译步骤 --rosdep-yes 通过--rosdep-yes到rosmake --continue-on-error 持续检测错误 --delete-changed-uris 在更改之前删除目录的本地URI副本 --abort-changed-uris 如果检测到uri,则中止 --backup-changed-uris=BACKUP_CHANGED 在更改之前备份目录的本地副本uri到这个目录。 --diff 显示所有SCM条目的组合差异 --status 显示所有SCM条目的组合状态命令 --status-untracked 显示所有SCM条目的组合状态命令,还显示未跟踪的文件 -j JOBS, --parallel=JOBS 用于安装的并行线程数 --generate-versioned-rosinstall=GENERATE_VERSIONED 生成版本化的rosinstall文件 2.5.文档说明 背景 rosinstall工具[1]维护一组已排序的文件夹,基于.rosinstall文件,该文件指出所有本地文件夹,以及每个可能用于该文件夹的版本控制系统(vcs)和远程仓库的uri。

电气中这样的.rosinstall文件的示例如下所示:

.rosinstall in ros env

  • other: {local-name: /opt/ros/electric/ros}

  • other: {local-name: /opt/ros/electric/stacks}

  • svn: {local-name: some/local/path, uri: some/uri, version: 123} rosinstall还为shell初始化生成一组文件,定义了一个工作环境。 这些是setup.sh,setup.bash,setup.zsh。 必不可少的是setup.sh,在电气中看起来像这样:

setup.sh in ros env

distro-dependent lines

export ROS_ROOT=/opt/ros/electric/ros export PATH=$ROS_ROOT/bin:$PATH export PYTHONPATH=$ROS_ROOT/core/roslib/src:$PYTHONPATH if [ ! "$ROS_MASTER_URI" ] ; then export ROS_MASTER_URI=http://localhost:11311 ; fi

lines depending on all of .rosinstall

export ROS_PACKAGE_PATH=some/local/path:/opt/ros/electric/stacks rosinstall永远不会读取setup.sh,每次rosinstall成功运行时都会覆盖它,因此到目前为止它不能在rosinstall的运行之间存储信息。rosinstall的工作方式如下:如果有的话,它会读取给定的.rosinstall,将其与任何提供的命令行参数合并,然后写入新的.rosinstall和新的setup.sh文件。当前的rosinstall命令行界面(CLI)语法如下:

$ rosinstall [OPTIONS] INSTALL_PATH [ROSINSTALL FILES OR DIRECTORIES]* 这与设置新环境以及更新或更改环境相同。[ROSINSTALL FILES或DIRECTORIES] *参数都可以

本地文件 包含.rosinstall文件的本地目录 一个远程文件uri 首次在INSTALL_PATH中调用rosinstall时,其中一个参数必须包含ros安装的路径,否则rosinstall将失败并显示错误。 请注意,参数的顺序是它们将附加到ROS_PACKAGE_PATH的相反顺序,对于覆盖包,这意味着后面参数的位置中的包将覆盖先前参数的位置中的包。 rosinstall的一个重要用例是用户可以处理几个ROS发行版,并经常在发行版和环境之间切换。 rosinstall生成的设置文件旨在通过获取给定的setup.sh来实现环境(和发行版)之间的快速转换。 规范

通过默认fuerte将在 /opt/ros/fuerte中创建一个.rosinstall文件,其内容类似于:

  • setup-file: local-name: /opt/ros/fuerte/setup.sh

  • other: local-name: /opt/ros/fuerte/share/ros ... 然后,用户可以使用以下命令创建本地ros环境:

$ rosinstall ~/fuerte foo /opt/ros/fuerte bar 因此,生成的本地.rosinstall将如下所示:

  • other: {local-name: bar}

  • other: {local-name: /opt/ros/fuerte/share/ros}

  • setup-file: {local-name: /opt/ros/fuerte/setup.sh} ...

  • other: {local-name: foo} 本地setup.sh将如下所示:

. /opt/ros/fuerte/setup.sh export ROS_PACKAGE_PATH=bar:...:/opt/ros/fuerte/share/ros:foo 动机

对fuerte中ROS构建系统的更改导致当前的rosinstall方法失败[2]。 上面提到的setup.sh是一个自包含的脚本。 这导致了fuerte中的几个问题,其中更多的环境变量必须由/opt/ros/fuerte/etc/catkin/profile.d中默认维护的几个脚本来设置,但是可以放在不同的位置,并且rosinstall应该 不可知论者。 更好的方法似乎是让rosinstall只修改ROS_PACKAGE_PATH变量,同时让ros的安装过程生成并维护一个setup.sh,它设置这个发行版的变量。 然后,一个rosinstall环境的.rosinstall需要指向发行版的setup.sh,这样生成的本地setup.sh可以先找到那个,然后修改ROS_PACKAGE_PATH。 在fuerte的rosinstall环境中生成的setup.sh理想情况应如下所示:

setup.sh in ros env

. <path/to/distro/setup.sh>

lines depending on all of .rosinstall

export ROS_PACKAGE_PATH=some/local/path:/opt/ros/electric/stacks 从上面的电气中的setup.sh可以看出,依赖于发行版的部分现在可以通过发布发行版的setup.sh来取代。 现在出现的问题是通常识别要包含的发行版setup.sh所在的位置。 rosinstall目前仅在其.rosinstall中存储信息,目前仅限于将路径存储到一组本地文件夹,所有这些文件夹当前都插入到ROS_PACKAGE_PATH中。 相对于.rosinstall中包含的任何文件夹,发行版setup.sh也不一致。因此,目前没有办法与当前的rosinstall功能一致,以收集和存储发行版的setup.sh的位置。因此,REP声明对rosinstall的必要修改,以获取和存储发行版setup.sh文件的位置,以用于生成环境setup.sh文件。 合理

export ROS_ROOT=/opt/ros/electric/ros export PATH=$ROS_ROOT/bin:$PATH export PYTHONPATH=$ROS_ROOT/core/roslib/src:$PYTHONPATH if [ ! "$ROS_MASTER_URI" ] ; then export ROS_MASTER_URI=http://localhost:11311 ; fi export PATH=$ROS_ROOT/bin:$PATH export PYTHONPATH=$ROS_ROOT/core/roslib/src:$PYTHONPATH 非官方文件格式 柳树车库构建系统依赖于rosinstall文件格式的这两个扩展。基本元素类型包括‘tar‘,并且可以附加元属性。 例:

  • svn: local-name: rosorg meta: repo-name: ros-docs uri: https://code.ros.org/svn/ros/stacks/rosorg/trunk

  • tar: local-name: foo.tar.bvz2 version: foo-1.2.0 meta元素没有进一步的rosinstall语义,它只是通过。 tar元素是vcstools不支持但必需的特性,具有特殊的语义,‘version‘必须引用tar根目录中的文件夹。

3.rosinstall_generator rosinstall_generator生成rosinstall文件,其中包含有关ROS包/堆栈的存储库的信息。

3.1.安装 sudo apt-get update sudo apt-get install python-rosinstall-generator sudo pip install rosinstall-generator 3.2.用法 命令行程序由以下方式调用:

rosinstall_generator PKGNAME [PKGNAME ...] 您可以传递包名称,干栈名称以及变体(仅在调用的包下面)。 变量被分解为一组包和/或堆栈。

默认情况下,它会将为rosinstall格式化的存储库信息输出到控制台。 通常,您希望将结果通过管道传输到.rosinstall文件中。

通过命令行选项,您可以自定义提供rosinstall信息的包:

--deps 包括递归依赖项的所有存储库。 --deps-up-to PKGNAME [PKGNAME ...] 在传递的包和最多包之间包含存储库(请参阅下面的示例)。

--deps-only` 排除在命令行上传入的包仅返回依赖项。 此外,您可以限制结果集:

--exclude PKGNAME [PKGNAME ...] 排除特定包(在使用--deps *选项时也排除它们的依赖关系)。

--wet-only 紧包含wet包。 --dry-only 仅包括干堆。 在可以指定包名称的任何地方,您还可以使用以下关键字,这些关键字将扩展为特定的包集:

ALL 扩展到所有已发布包的集合。 RPP 扩展到当前环境中找到的包集(通过搜索ROS_PACKAGE_PATH)。 如果您没有源环境(ROS_DISTRO未设置),则还必须使用选项--rosdistro DISTRO_NAME指定ROS分发。

3.3.例如 从发布的源构建变体的所有包

要生成一个rosinstall文件,其中包含用于Hydro调用的desktop-full变体中包含的所有包和堆栈:

$ rosinstall_generator desktop_full --rosdistro hydro --deps > hydro-desktop-full.rosinstall 因为对于Groovy而言,并非所有的desktop_full软件包都被catkinized,你可能需要为湿和干生成两个单独的rosinstall文件。因此,您可以将这两组包签出到不同的位置

$ rosinstall_generator desktop_full --rosdistro groovy --deps --wet-only > groovy-desktop-full-wet.rosinstall $ rosinstall_generator desktop_full --rosdistro groovy --deps --dry-only > groovy-desktop-full-dry.rosinstall 当前在环境中的所有包都来自已发布的source

要通过ROS_PACKAGE_PATH调用生成包含所有包和堆栈的rosinstall文件:

$ rosinstall_generator RPP 设置当前环境中缺少的一组包

$ rosinstall_generator rviz --deps --exclude RPP 所有ROS发行包都来自已发布的来源

生成一个rosinstall文件,其中包含特定ROS分发调用中可用的所有包和堆栈:

$ rosinstall_generator ALL --rosdistro hydro 结合 wstool / rosws

要将包含其所有依赖项的包/堆栈添加到由wstool(对于wet)或

(对于dry)管理的现有工作空间,请调用:

assuming the wet workspace is in the relative folder "src"

$ rosinstall_generator ros_tutorials --rosdistro hydro --deps | wstool merge -t src - $ wstool update -t src -j8

assuming the dry workspace is in the current folder

$ rosinstall_generator navigation --rosdistro groovy --deps | rosws merge - $ rosws update -j8 4.rosdep rosdep是一个可用于安装ROS包所需的系统依赖项的工具。

4.1.新文件 As of ROS fuerte, rosdep现在是一个独立的工具,您可以单独下载和使用: External rosdep documentation.

4.2.快速参考 4.2.1安装:

因为它会自动更快地更新。

sudo apt-get install python-rosdep 在非ubuntu平台上

sudo pip install -U rosdep 4.2.2初始化:

sudo rosdep init 需要至少调用一次或更新时(可能有新的需要定义,你的本地安装的rosdep还不知道):

不要使用sudo运行rosdep更新。它不是必需的,稍后会导致权限错误。

rosdep update 4.2.3使用rosdep:

安装特定包的依赖关系

您可以使用rosdep和catkin在ROS存储库中构建任何包。假设你想要构建一个名为AMAZING_PACKAGE的包,之前你没有在你的机器上构建。

rosdep install AMAZING_PACKAGE 安装工作空间中所有包的依赖关系

这个用例展示了rosdep更强大的功能。 转到catkin工作区的顶级目录,其中包含您要使用的ROS包的源代码。然后运行:

rosdep install --from-paths src --ignore-src -r -y 此命令可以神奇地安装catkin工作区中的软件包所依赖但在您的计算机上缺少的所有软件包。

使用源安装的rosdep

克隆开发存储库。这不需要在ROS_PACKAGE_PATH中的目录中完成。然后在其顶级目录中,源setup.sh。具体:

$ git clone https://github.com/ros-infrastructure/rosdep $ cd rosdep $ source setup.sh 4.3.更改列表 See changelog in the development repository.

4.4.错误/功能请求 View or file new issues on github

4.5.如何向程序包添加系统依赖项 将rosdep依赖项添加到包中

将系统依赖项添加到catkin / package.xml文件中的格式如下所示

<build_depend>wxpython</build_depend> <build_depend>log4cxx</build_depend> <run_depend>wxpython</run_depend> <run_depend>log4cxx</run_depend> 必须将这些元素添加到包的package.xml中。 唯一要改变的是系统依赖项的名称。 此名称将在以YAML文件中定义的rosdep定义中查找,其主要集合托管在GitHub上:https://github.com/ros/rosdistro/tree/master/rosdep 如果你需要的系统依赖关系在rosdep中尚不存在,你可以在这里贡献一个:http://docs.ros.org/independent/api/rosdep/html/contributing_rules.html 注意事项:

应该小心地引入新的rosdep依赖项,因为这意味着代码的用户将下载安装这些第三方依赖项。 您还必须注意调查其他ROS堆栈,并确保您引入的依赖项不会产生不兼容性。

 

以上是关于wstool ros空间管理工具的主要内容,如果未能解决你的问题,请参考以下文章

萌新向cartographer_ros最新安装指南 2019-12

07ROS运行管理

由浅到深理解ROS-命名空间

[ROS基础] --- 创建工作空间

[ROS基础] --- 创建工作空间

第七课 ROS的空间描述和变换