使用以下命令可以查看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.安装
$ sudo apt-get install python-wstool
$ sudo pip install -U wstool
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文件中,或使用参考底图初始化工作区。
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
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的包。
1.安装
sudo apt-get install python-rosinstall
pip install -U rosinstall
pip install -U rosinstall_shellcompletion
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
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文件
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包/堆栈的存储库的信息。
安装
sudo apt-get update
sudo apt-get install python-rosinstall-generator
sudo pip install rosinstall-generator
用法
命令行程序由以下方式调用:
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分发。
例如
从发布的源构建变体的所有包
要生成一个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