一个ROS工程空间的相关知识

一个ROS工程空间

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Cd8aXxhh-1629792818760)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20210824155345883.png)]

1.创建workspace
创建 workspace 文件夹:
mkdir -p ~/catkin_ws/src

初始化工作空间。
cd src/
catkin_init_workspace#这时src文件夹下会多出一个CMakeLists.txt文件

编译。会一次性编译 src 文件夹中的所有源文件,同时生成 devel 和 build 两个文件夹。
cd ~/catkin_ws/
catkin_make

把 workspace 的信息载入**系统**环境变量中,两种方法:
source ~/catkin_ws/devel/setup.bash#只对当前 terminal 有效

echo "source  ~/catkin_ws/devel/setup.bash"  >> ~/.bashrc#对每个 terminal 都有效; >>写入尾部而不覆盖
source ~/.bashrc

1.src

ROS的catkin软件包(源代码包)

package1;package2

2、build:编译空间

存放CMake和catkin的缓存信息、配置信息和其他中间文件。

3、devel:开发空间

存放编译后生成的目标文件,包括头文件、动态&静态链接库、可执行文件等。

4、install:安装空间

开发完成后的安装包。如果修改了launch文件就要重新安装?

2.ROS的Catkin编译

Catkin 编译系统的一个特点是将程序做成 package (称为 catkin package 或者 ROS package) 的形式,可以理解成模块化。典型的 ROS workspace 中包含 src, build, devel 三个文件夹,在分享时只需要分享 src 中的某个 package 即可,所有的编译信息都在此 package 中。一个 package 在编译时可以指定依赖于另一个 package

由于 ROS 中程序以及 library 变动比较频繁,不太适合在整个系统层面安装编译之后的文件,通过 source devel 文件中的 setup.bash 文件可以告知系统去哪里查找相应的文件,避免了系统级的安装

其中:

一个 catkin_make 命令相当于如下的一系列命令:

mkdir build  
cd build    
cmake ../src -DCATKIN_DEVEL_PREFIX=../devel    
make

只编译 package1 和 package2:

catkin_make  -DCATKIN_WHITELIST_PACKAGES="package1;package2"
3.构造 ROS package

1.ROS package简介

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-m7EHe0Q8-1629792818763)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20210824155723965.png)]

一个文件夹下包含CMakeLists.txt和package.xml两个文件,即定义了一个软件包,也就可以被编译系统编译了。

CMakeLists.txt文件中规定了功能包的编译规则,包括指定功能包名称,指定编译依赖项,指定要编译的源文件,指定要添加的消息格式文件/服务格式文件/动作格式文件,指定生成的消息/服务/动作,指定头文件搜索目录,指定链接库搜索目录,指定生成的静态链接库文件,指定需要链接的库文件,指定编译生成的可执行文件以及路径等等。

package.xml文件定义了功能包的属性信息,包括包名,版本号,作者,编译依赖和运行依赖等。
package中还有代码文件,代码文件又分为脚本文件(比如Python文件 .py,Linux下的shell文件 .sh)、头文件(.h)和源程序文件(.cpp以及其他编程语言格式),分别存放在scripts目录、include目录和src目录中。

2.构造

要构造 ROS package,

catkin_create_pkg package_name dep1 dep2 dep3...

功能包中会产生CMakeLists.txt和package.xml两个文件.

我们首先要修改 CMakeLists.txt 文件如下:

cmake_minimum_required(VERSION 2.8)
project(hello_world_tutorial)

#  要用到 catkin
find_package(catkin REQUIRED)

# 声明该项目为一个 catkin package
catkin_package()

find_package(roscpp REQUIRED)
include_directories(${roscpp_INCLUDE_DIRS})
add_executable(hello_world_node hello_world_node.cpp)
target_link_libraries(hello_world_node ${roscpp_LIBRARIES})

另外,还需要添加一个 package.xml 文件,指明该 package 在编译和运行时依赖于哪些其他 package,同时也包含该 package 的一些描述信息,如作者、版本等。内容如下:

<package>
  <name>hello_world_tutorial</name>
  <maintainer email="you@example.com">Your Name</maintainer>
  <description>
    A ROS tutorial.
  </description>
  <version>0.0.0</version>
  <license>BSD</license>

  <!-- Required by Catkin -->
  <buildtool_depend>catkin</buildtool_depend>

  <!-- Package Dependencies -->
  <build_depend>roscpp</build_depend>
  <run_depend>roscpp</run_depend>
</package>

现在路径结构如下:

├── build
├── CMakeLists.txt
├── hello_world_node.cpp
└── package.xml

跟之前一样,进入 build 文件夹中,用 cmake + make 方式编译:

cd build
cmake ..
make

编译结束之后会发现,并没有在 build 根目录下生成可执行文件。与普通的 cmake 编译不同,catkin 编译会生成一个 devel 文件夹,这里包含了生成的可执行文件,以及作为 library 使用的配置文件 .pc.cmake

对于我们的 hello_world_node package 来说,上述文件路径如下:

  • 可执行文件:devel/lib/hello_world_tutorial/hello_world_node
  • .pc 配置文件:devel/lib/pkgconfig/hello_world_tutorial.pc
  • .cmake 配置文件:devel/share/hello_world_tutorial/cmake/hello_world_tutorialConfig.cmake

当作为 library 使用时,只需要将路径 .../devel/lib/pkgconfig 添加到 PKG_CONFIG_PATH 环境变量中,或者将 .../devel 添加到 CMAKE_PREFIX_PATH 变量中。实际上,我们不需要手动设置这些环境变量,只需要通过 source devel 文件夹下的 setup.bash 文件即可,source setup.bash 不仅添加了以上两个环境变量,还有诸如 ROS_PACKAGE_PATHPYTHONPATH等。

source 之后,由于该 package 加入了 ROS_PACKAGE_PATH,此时可以通过 ROS 相关的命令对该 package 进行操作,如 rospack find ..., rosrun <package> <exe>, roscd <package> 等。

为了更有条例地存放不同类型的文件,可以建立三个文件夹 src, build, devel,其中:

 `src` 存放源文件,源文件又以 package 为单位分别存放,

`build` 存放编译过程中的中间文件,

`devel` 存放最终生成的可执行文件和配置文件。在该文件夹中有一个比较特殊的文件 setup.(ba)sh,只要通过 source 命令加载了这个 setup 文件,就相当于编译之后的文件安装在了本机中,可以直接调用他们。

这就是所谓的 out-of-source 编译方式。在分享、发布程序时,我们可以很清楚的知道哪些是必要的源文件,哪些是最终生成的可执行文件和 library,哪些是作为副产品存在的中间文件。

路径结构如下:

├── build
├── devel
└── src
    └── hello_world_tutorial
        ├── CMakeLists.txt
        ├── hello_world_node.cpp
        └── package.xml

在做了以上路径设置之后,在编译时,我们就需要特别指定各类文件对应的路径:

cd build
cmake ../src/hello_world_tutorial  -DCATKIN_DEVEL_PREFIX=../devel
make

另外,只编译 package1 和 package2:

catkin_make  -DCATKIN_WHITELIST_PACKAGES="package1;package2"
4.package命令行
rospack list列出所有功能包
rospack find package_name查找功能包路径
rospack depends package_name查看功能包依赖的包
rosls package_name列出功能包中的内容
roscd package_name进入功能包所在路径
rosed package_name file_name编辑功能包中的文件
roscp package_name file_name target_path从功能包中复制文件到其他目录
rosdep install package_name为功能包安装所需要的依赖
(根据package.xml中指定的依赖){安装别人的包}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值