正如其他软件的学习一样,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="waveshare@todo.todo">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="jane.doe@example.com">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基础系列教程,下一篇博客将主要介绍如何使用小海龟测试分析各指令的实际作用,并简单测试编程代码的使用,敬请期待。