当前位置:网站首页>【ROS入门教程】---- 03 ROS工作空间与功能包
【ROS入门教程】---- 03 ROS工作空间与功能包
2022-06-10 23:52:00 【生如昭诩】

正如其他软件的学习一样,ROS的入门也需要从建立项目开始,对于ROS来说,项目初始需要首先创建工作空间,编译生成文件夹后创建功能包,然后继续通过命令行,或者编程通过代码实现目标作用,本节博客主要介绍第一部分的内容,并简要介绍工作空间各文件的作用。
一、工作空间
1. 创建工作空间
- 创建文件夹:
mkdir -p ~/catkin_ws/src
在上述命令中catkin_ws,就是工作空间的名字,在后续的课程中均会涉及到此名称,故也可以自行使用合适的名字,src是放置功能包的文件夹,用于存放源代码。 - 切换到src文件夹:
cd ~catkin_ws/src - 创建工作空间:
catkin_init_workspace
命令行输出提示:
Creating symlink "/home/zhaoxu/project/ROS/catkin_ws/src/CMakeLists.txt" pointing to "/opt/ros/noetic/share/catkin/cmake/toplevel.cmake"
- 切换到工作目录:
cd ~/catkin_ws/ - 编译工作空间:
catkin_make
这里的catkin要注意与工作空间名称无关,属于固定命令,在编译后命令行指示如下:
- 生成install文件夹:
catkin_make install
这里的指令只是为了率先创建install文件,本质上无意义。
2. 设置环境变量
- 一般做法:需要在每次打开终端时重新载入
source devel/setup.bash
- 一劳永逸:在.bashrc文件中加入固定路径,无需重新source
echo "source ~/catkin_ws/devel/setup.bash" >> ~/.bashrc
- 查询环境变量:
echo $ROS_PACKAGE_PATH
结果如下图,则证明修改成功
3. 工作空间介绍

- src:代码空间,Source Space,用于放置功能包(代码、配置文件、launch文件);
- build:编译空间,Build Space,用于放置中间文件、二进制文件等;
- devel:开发空间,Development Space,用于放置编译生成的可执行文件、脚本、库等;
- install:安装空间,Install Space,用于放置安装好的文件;
二、功能包
1. 创建并编译功能包
- 切换到指定目录:
cd ~/catkin_ws/src - 创建功能包:
catkin_create_pkg pkg_ts std_msgs rospy roscpp
标准指令:catkin_create_pkg <package_name> [depend1] [depend2] …
即使用catkin_create_pkg指令创建功能包,依赖于上述三个依赖项

- 切换到工作空间目录:
cd ~catkin_ws - 编译功能包:
catkin_make
注意:同一个工作空间下,不允许存在同名功能包;不同工作空间下,允许存在同名功能包
2. 功能包文件解析

- include:用于放置头文件
- src:用于放置源文件
- CMakelist.txt:编译配置文件,描述功能包的编译规则
- package.xml:功能包列表文件,包含name、version、描述信息、author email、depend、license等
这里我们重点介绍后两者:
1)CMakelist.txt
文件作用:CMakeList.txt文件是CMake编译系统编译软件包过程的输入文件。任何CMake兼容包都包含一个或多个CMakeLists.txt文件,这些文件描述了如何编译代码以及将其安装到哪里。将CMakeLists.txt文件应用于一个catkin项目时,它就作为一个标准的附带一些限制条件的vanilla CMakeLists.txt文件。使用CMake编译程序时,cmake指令依据 CMakeLists.txt文件生成makefiles文件,make命令再依据makefiles文件编译链接生成可 执行文件
补充知识:catkin_make,实际上就是ROS的编译系统将cmake和make统一的封装起来的指令,故本质上仍是利用cmake和make进行编译的过程。
顺序结构分析:

- CMake版本:cmake_minimum_required(VERSION 3.0.2)
- 软件包名称:project(pkg_ts)
- 声明依赖库:find_package()

- 启动python模块支持:catkin_python_package()

- 消息/服务/操作(Message/Service/Action)生成器: add_message_files(),add_service_files(),add_action_files()

- 调用消息/服务/操作生成:generate_messages()

- 动态重新配置参数:generate_dynamic_reconfigure_options() ,cfg配置文件,用于配置一些rviz格式,记录一些配置参数等

- 指定包编译信息导出:catkin_package()

- 重点:添加要编译的库和可执行文件:add_library()/add_executable()/target_link_libraries()

- 安装规则:install()

- 测试编译[配置:catkin_add_gtest()
2)package.xml
这里的具体讲解以代码内为主,可见下方解释:
<?xml version="1.0"?>
<!‐‐ 当前xml版本 ‐‐>
<package format="2">
<name>learning_cplus</name>
<!‐‐ 功能包名称是learning_cplus,name,名称 ‐‐>
<version>0.0.0</version>
<!‐‐ 当前功能包版本是0.0.0,version,版本‐‐>
<description>The learning_cplus package</description>
<!‐‐ 当前功能包介绍,description,详细 ‐‐>
<maintainer email="[email protected]">waveshare</maintainer>
<!‐‐ 当前维护者者信息(邮箱和昵称)‐‐>
<!‐‐ BSD, MIT, Boost Software License, GPLv2, GPLv3, LGPLv2.1, LGPLv3 ‐ ‐>
<license>TODO</license>
<!‐‐ 协议版本,默认TODO就可以。有兴趣可以自行了解。‐‐>
<!‐‐ <url type="website">http://wiki.ros.org/learning_cplus</url> ‐‐>
<!‐‐ 可共享路径,你可以把你的这个包上传到ROS社区或者github。‐‐>
<author email="[email protected]">Jane Doe</author>
<!‐‐ 当前开发者信息(邮箱和昵称)‐‐>
<!‐‐ The *depend tags are used to specify dependencies ‐‐>
<!‐‐ Dependencies can be catkin packages or system dependencies ‐‐>
<!‐‐ Examples: ‐‐>
<!‐‐ Use depend as a shortcut for packages that are both build and exec dependencies ‐‐>
<!‐‐ <depend>roscpp</depend> ‐‐>
<!‐‐ Note that this is equivalent to the following: ‐‐>
<!‐‐ <build_depend>roscpp</build_depend> ‐‐>
<!‐‐ <exec_depend>roscpp</exec_depend> ‐‐>
<!‐‐ Use build_depend for packages you need at compile time: ‐‐>
<!‐‐ <build_depend>message_generation</build_depend> ‐‐>
<!‐‐ Use build_export_depend for packages you need in order to build ag ainst this package: ‐‐>
<!‐‐ <build_export_depend>message_generation</build_export_depend> ‐‐>
<!‐‐ Use buildtool_depend for build tool packages: ‐‐>
<!‐‐ <buildtool_depend>catkin</buildtool_depend> ‐‐>
<!‐‐ Use exec_depend for packages you need at runtime: ‐‐>
<!‐‐ <exec_depend>message_runtime</exec_depend> ‐‐>
<!‐‐ Use test_depend for packages you need only for testing: ‐‐>
<!‐‐ <test_depend>gtest</test_depend> ‐‐>
<!‐‐ Use doc_depend for packages you need only for building documentati on: ‐‐>
<!‐‐ <doc_depend>doxygen</doc_depend> ‐‐>
<buildtool_depend>catkin</buildtool_depend>
<!‐‐编译工具是catkin ‐‐>
<build_depend>roscpp</build_depend>
<!‐‐编译依赖roscpp ‐‐>
<build_depend>rospy</build_depend>
<!‐‐编译依赖rospy ‐‐>
<build_depend>std_msgs</build_depend>
<!‐‐编译依赖std_msgs ‐‐>
<build_export_depend>roscpp</build_export_depend>
<!‐‐编译输出依赖roscpp ‐‐>
<build_export_depend>rospy</build_export_depend>
<!‐‐编译输出依赖rospy ‐‐>
<build_export_depend>std_msgs</build_export_depend>
<!‐‐编译输出依赖std_msgs ‐‐>
<exec_depend>roscpp</exec_depend>
<!‐‐运行依赖roscpp ‐‐>
<exec_depend>rospy</exec_depend>
<!‐‐运行依赖rospy ‐‐>
<exec_depend>std_msgs</exec_depend>
<!‐‐运行依赖std_msgs ‐‐>
<!‐‐ The export tag contains other, unspecified, tags ‐‐>
<export>
<!‐‐ Other tools can request additional information be placed here ‐‐>
<!‐‐ 输出 ‐‐>
</export>
</package>
总结
本文主要介绍了工作空间、功能包的基本内容,以及二者的创建与编译过程;并深入分析了CMakelist.txt与package.xml的具体内容,博客内容参考了古月居的ROS入门21讲和微雪课堂的ROS基础系列教程,下一篇博客将主要介绍如何使用小海龟测试分析各指令的实际作用,并简单测试编程代码的使用,敬请期待。

边栏推荐
猜你喜欢

招聘 | 南京 | TRIOSTUDIO 三厘社 – 室内设计师 / 施工图深化设计师 / 装置/产品设计师 / 实习生等

Dictionary sort of array

浅谈有赞搜索质量保障体系 v2021

The principle and source code interpretation of executor thread pool in concurrent programming

What is thread in concurrent programming

Philips coo will be assigned to solve the dual crisis of "supply chain and product recall" in the face of crisis due to personnel change

Pirate OJ 448 luck draw

Unity mesh patch generates parabola and polyline

Load balancing strategy graphic explanation

亿级搜索系统(优酷视频搜索)的基石,如何保障实时数据质量?v2020
随机推荐
SqlServer中的锁
[no title] 4555
Deep copy and shallow copy in golang
Synchronized keyword for concurrent programming
[network planning] 1.3 packet switching and circuit switching in the network core
为什么使用 Golang 进行 Web 开发
AQS explanation of concurrent programming
UUID quick explanation
Dual wing layout
[no title] 66666
Random points in non overlapping rectangles
[network planning] 2.1.1 brief introduction to client server system and P2P system
SqlServer中的鎖
【原】expdp参数CONTENT
Kubeflow 1.2.0 installation
Wechat applet to realize OCR scanning recognition
Introduction and basic construction of kubernetes
Lucene mind map makes search engines no longer difficult to understand
LeetCode 8. 字符串转换整数 (atoi)(中等、字符串)
对象作为点(Objects as Points) 个人总结