一个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_PATH
,PYTHONPATH
等。
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中指定的依赖){安装别人的包} |