Day 4 ROS文件系统

ROS文件系统

今天我们要来讲 ROS 的文件系统,在 ROS 的档案夹中,他会长下面这个样子

你可能会觉得很复杂,接下来便一个一个来讲他是干嘛的。

catkin 工作空间

他是组织统整 ROS 程序码的地方,像是套件、工具等等的 , Catkin 指的是 ROS 订制的编译构建系统,他是根据 CMake 来进行延伸的,编写规则也跟 CMake 很像 , 它简化了 CMake 在编译时的一些过程,下图便是整个 Catkin 的架构图 ,总之 Catkin 是用来编译 ROS 程序的。

而在早期时,是使用 rosbuild 这个编译器,但随着 ROS 的发展,发现他有很多 bug , 於是在 Groovy 後面的版本便开始采用 Catkin。

而这个资料夹是透过指令来创建的,熟悉 Linux 的小夥伴应该都想到怎麽新建了吧!

mkdir -p ~/catkin_ws/src
cd ~/catkin_ws/
catkin_make

以下是 catkin_make 他的一些可选参数

catkin_make [args]
    -h, --help 帮助信息
    -C DIRECTORY, --directory DIRECTORY
    工作空间的路径 (默认为 '.')
    --source SOURCE src的路径 (默认为'workspace_base/src')
    --build BUILD build的路径 (默认为'workspace_base/build')
    --use-ninja 用ninja取代make
    --use-nmake 用nmake取'make
    --force-cmake 强制cmake,即使已经cmake过
    --no-color 禁止彩色输出(只对catkin_make和CMake生效)
    --pkg PKG [PKG ...] 只对某个PKG进行make
    --only-pkg-with-deps ONLY_PKG_WITH_DEPS [ONLY_PKG_WITH_DEPS ...]
    将指定的package列入白名单CATKIN_WHITELIST_PACKAGES,
    之编译白名单里的package。该环境变数存在於CMakeCache.txt。
    --cmake-args [CMAKE_ARGS [CMAKE_ARGS ...]]
    传给CMake的参数
    --make-args [MAKE_ARGS [MAKE_ARGS ...]]
    传给Make的参数
    --override-build-tool-check
    用来覆盖由於不同编译工具产生的错误

首先我们要先建立一个 catkin_ws 资料夹,这个名称可以更动,但是里面一定要有一个叫做 src 的资料夹,接下来我们切换到资料夹里头,catkin_make 这个指令是用来对资料夹进行初始化用的,有用过 ROS 的朋友应该会知道 catkin_make 最主要的功能并非是初始化空间,而是在我们写完程序码後,使用 catkin_make 来进行自动构建(编译),然後生成我们需要用到的目标文件。

这边要注意的是我们在 catkin_make 时,一定要回到 ~/catkin_ws/ 这个目录底下,我们在其他目录做这个事情是会失败的。然後在编译後,要做 source 来 重整文件,这样才能把我们刚刚重整完的文件给丢到环境变数里面去,这样系统才知道我们生成的 ROS 文件在哪边,这样才能跑 www

source ~/catkin_ws/devel/setup.bash

在我们初始化後,可以发现资料夹底下多了 build、devel 这两个资料夹。加上原本的 src 便有 三个资料夹了。

  • src
    • 是用来放 package、程序码的地方
  • build
    • 放 cmake、catkin的暂存跟中间文件
  • devel
    • 放一些目标文件,像是标头档、动态链结库、静态连结库、可执行文件

我们真正在写程序码的地方只有 src , 剩下两个都不用管, catkin_make 会帮我们管理好她们的。

src

接下来我们在继续往下看,src 里面会放各式各样的开源包,在这边有句话是很关键的 package 是 catkin 编译的最基本单元,catkin 编译的对象便是一个又一个 package,然後他在编译时是以递回的方式运行,所以你可以把 packahge 放在一个又一个的资料夹底下,他都会去慢慢编译

package

package 是 ROS 程序码的最基本组织单位,这是什麽意思? 你可以把 ROS 看成是人类,他是由一个又一个的细胞组成,而 package 便是一个细胞,在这边要注意的是,不要把一个 package 就当成是一只可执行文件,一个 package 是可以拥有多个可执行文件的 (Node 节点)。

那我们要怎麽去看出他就是一个 package 呢, 首先一个 package 他需要具备 CMakeList.txt、package.xml。

CMakeList.txt

他是用来跟编译系统说,怎麽编译我放在 package 里面的程序码,要编译哪一些程序、需要那些依赖、目标等等。

他的基本写法如下

cmake_minimum_required() #CMake的版本号
project() #专案名称
find_package() #找到编译需要的其他 CMake/Catkin package
catkin_python_setup() #catkin新增巨集,打开catkin的Python Module的支持
add_message_files() #catkin新增巨集,添加自定义 Message/Service/Action 文件
add_service_files()
add_action_files()
generate_message() #catkin新增巨集,生成不同语言版本的 msg/srv/action 接口
catkin_package() #catkin新增巨集,生成当前package的cmake配置,供依赖本包的其他软件包调用
add_library() #生成库
add_executable() #生成可执行二进制文件
add_dependencies() #定义目标文件依赖於其他目标文件,确保其他目标已被创建
target_link_libraries() #链接
catkin_add_gtest() #catkin新增巨集,生成测试
install() #安装至本机

如过你没有写过 Cmake 文件的话,可以去看一下 Cmake 实战这本书籍。

package.xml

他是在对 package 的一些自我描述,里面会包含 套件(专案)名称、版本号、作者、内容描述、程序码许可、编译的一些资讯等等内容。他在最早期的 ROS 版本中,称作manifest.xml,你如果看到他,代表着你看到了很古老的 ROS 套件。

或许你可以发现有一些指令可以快速的分析出这个套件需要甚麽依赖程序库,他便是直接去找 package.xml ,这样就可以快速的得到内容了。 rospack findrosdep 这两个指令便是如此。

而 package.xml 他因为 xml 的版本关系,他又有两种版本

首先第一个版本如下

<pacakge> 根文件
<name> 套件名
<version> 版本号
<description> 内容描述
<maintainer> 作者
<license> 程序码许可证
<buildtool_depend> 编译构建工具,通常为catkin
<build_depend> 编译依赖项,与Catkin中的
<run_depend> 运行依赖项

其中1-6为必备标签,1是根标签,嵌套了其余的所有标签,2-6为包的各种属性,7-9为
编译相关信息。

他大概会长这个样子

<package>
    <name> 套件名
    <version> 版本号
    <description> 内容描述
    <maintainer> 作者
    <license> 程序码许可证
    <buildtool_depend> 编译构建工具,通常为catkin
    <build_depend> 编译依赖项,与Catkin中的
    <run_depend> 运行依赖项
</package>

第二个版本长这样

<pacakge> 根文件
<name> 套件名
<version> 版本号
<description> 内容描述
<maintainer> 作者
<license> 程序码许可证
<buildtool_depend> 编译构建工具,通常为catkin
<depend> 指定依赖项为编译、导出、运行需要的依赖
<build_depend> 编译依赖项
<build_export_depend> 导出依赖项
<exec_depend> 运行依赖项
<test_depend> 测试用例依赖项
<doc_depend> 文档依赖项

他比第一个版本多了 <depend>、<build_export_depend>、<exec_depend> 、<test_depend>、<doc_depend>

目前主流的 ROS 版本中基本都是同时支援这两种写法的,所以基本上都是可以的。

Scripts

在这个资料夹底下,会存放着 .py 、 .sh 档,也就是放可执行文件的地方。

include

这个资料夹底下放有 C 的 .h 档

src

这个资料夹放有 C++ 的 .cpp 档,但是有些 python 的 py 档也会放在这边

lunch

我们刚刚有提到一个 package 底下可以有多个 可执行文件,那该怎麽做呢? 此时需要 lunch 文件,只要我们把这些要一次跑的东西写在她里面,就可以了。

自定义通讯格式

在 ROS 中另一个很重要的点便是 自定义通讯格式,他们的位置是放在 msg讯息 、 srv 服务、action 动作底下。

通讯格式的详细内容将会在明天讲~ 以上便是 ROS catkin 工作空间 中所有常见的资料夹介绍 ~

#Arm Arm Platforms


<<:  第二章 空间选择困难症

>>:  【D5】取得厨房钥匙:下载凭证

Day25阵列(JavaScript)

Array阵列 简单来说 阵列就是一个有序的序列而且里面可以储存不定数量的任何值 我是把它想像成一个...

利用Cloudflare API关闭Cloudflare IPv6兼容性功能

在使用一段时间Cloudflare加速后,发现网站程序并不兼容IPV6,目前厂家未作升级处理,整了好...

[Tableau Public] day 26:台湾姓氏分布分析-4

今天我们来做各姓氏人口数分布地图,新增一张工作表名称为「107年6月_台湾各姓氏人口数分布地图(预设...

[Day27] AWS Data Pipeline

AWS Data Pipeline 是一种 Web 服务,可协助您以指定的间隔,可靠地在不同 AWS...

大共享时代系列_005_共享宠物资讯

关於那些孩子们~请终养不弃养~~~ 关於我跟你的相识 大家有养毛小孩吗? 是如何邂逅的呢? 还是还在...