ROS学习之工作空间与创建过程

本文详细介绍了ROS(机器人操作系统)的工作空间概念及其组成部分,包括src、build、devel和install目录的作用。同时,深入解析了功能包的创建、编译流程,以及CMakeLists.txt和package.xml文件的使用,帮助读者掌握ROS开发的基础。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

ROS 工作空间


简介

工作空间是一个存放工程开发相关文件的文件夹,包括以下四个文件夹

  • src 代码空间 (放置所有功能包,代码
  • build 编译空间 (放置编译过程中产生的中间文件,不用怎么关心)
  • devel 开发空间 (放置编译生成的可执行文件,库,一些脚本,最后编译出的文件都是在这里运行的)
  • install 安装空间 (安装软件的位置,类似于windows的program files 文件夹)

可以观看古月居的介绍视频ROSworkspace
所有的源码,配置文件,编译出来的可执行文件都是放在工作空间里。
可以将工作空间理解为C++的PROJECT。
在这里插入图片描述

catkin 编译系统下的工作空间结构
src 源空间

主要使命 : 存放功能包

ROS功能包

工作空间/src 文件夹内文件的结构可由下图表示
g1
功能包是ROS文件系统中组织程序文件的基本单元,也就是catkin编译的基本单元。一个 package 下必须包含 CMakeLists.txt 和 package.xml 两个文件:

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

另外

  • include 和 src 分别存放头文件(.h)和源程序文件(.c/.cpp等);
  • scripts 存放脚本文件(比如Python文件 *.py,shell文件 *.sh);
  • launch 存放 launch文件(*.launch),用于批量运行多个可执行文件;
  • config 存放配置文件(*.yaml等);

此外,还有自定义的通信格式文件,包括消息(.msg)、服务(.srv)以及动作(*.action)。
g2

build 编译空间

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

devel 开发空间

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

install 安装空间

即开发完成后的安装包。


如何创建工作空间

创建工作空间主体上可以按下图所示步骤来完成:
在这里插入图片描述

创建工作空间
  • 第一步创建工作空间,用mkdir创建文件夹,名为catkin_ws
	$ mkdir -p ~/catkin_ws/src

attention: workspace 的名字是可以自定义的,比如不叫catkin_ws,改作wocao, 但是src这个文件夹的名字不能改
mkdir:创建目录。
-p: 创建mydir目录以及mydir目录下面的dir_test文件。允许创建目录及子目录
-m:创建指定权限的目录

  • 进入文件夹内
	$ cd ~/catkin_ws/src

这一步也可以鼠标操作,进入文件夹后打开终端

  • 通过下面的语句将catkin_ws变成ROS工作空间的属性
	$ catkin_init_workspace

创建成功的提示为

	Creating symlink "/home/jpy/catkin_ws/src/CMakeLists.txt" pointing to "/opt/ros/melodic/share/catkin/cmake/toplevel.cmake"

catkin_init_workspace命令和catkin_ws的名字没有关系,固定的写法,就算工作空间叫wocao,命令也是这么写。

编译工作空间
  • 回到工作空间的根目录
	$ cd ..
	# 或者 cd ~/catkin_ws/
	# 或者鼠标操作
  • 编译
	$ catkin_make

catkin_make是ROS里面catkin编译器提供的编译指令,通过这个指令可以编译src下面所有功能包的源码,根据我们的配置来编译,结果会放在devel和install里面。编译成功时终端显示如下
在这里插入图片描述
但是目前没有产生实际的编译效果,要产生install这个文件夹的话需要运行以下指令

	$ catkin_make install

到目前为止就已经产生了四个文件夹:
在这里插入图片描述

强调一遍,src文件夹存放之后功能包的源码,install是安装空间,里面存放编译生成的可执行文件,devel是开发空间,里面存放开发过程中产生的一些可执行文件,包括一些库,devel与install的一些功能是类似的,只不过一个是开发中,一个是开发结束之后发布给客户使用的可执行文件/结果文件,build是编译过程当中产生的中间文件,一些二进制文件,我们基本上用不到,不用操心

空的工作空间也是可以编译的,就像在VS里面建立一个空的project,也还是可以编译的。
创建代码一定要创建功能包,功能包是ROS里面源码的最小单元,所有源码都必须放到功能包里面,不能直接放到src下面去编译,这是不被允许的。必须要创建功能包。

同一个工作空间下,不允许存在同名功能包。
不同工作空间下,允许 存在同名功能包。

创建功能包要用到下面的指令模板:

	$ catkin_create_pkg<package_name>[depend1][depend2][depend3][...]

指令中要包含几个参数,

ITEMEXPLAIN
package_name功能包的名字
depend功能包的依赖, 可能要依赖工作空间中其他的功能包, 包里要用到的库

功能包一定要放置在src里面
e.g.

	$ cd~/catkin_ws/src
	$ catkin_create_pkg test_pkg std_msgs rospy roscpp

操作步骤

  • 进入src文件夹 创建功能包
	$ cd src/
	$ catkin_create_pkg test_pkg std_msgs rospy roscpp

创建成功指令反馈为:

	Created file test_pkg/CMakeLists.txt
	Created file test_pkg/package.xml
	Created folder test_pkg/include/test_pkg
	Created folder test_pkg/src
	Successfully created files in /home/jpy/catkin_ws/src/test_pkg. Please adjust the values in package.xml.

在这里插入图片描述src存放的是用来放置功能包的代码,cpp或者py
include用来存放头文件,如cpp里的 .h 文件
CMakeLists.txt 和 package.xml是每个功能包必须要有的文件,有了这两个文件才标志着这个test_pkg文件夹叫做一个功能包而不是一个普通文件夹的属性

src里面是功能包+CMakeLists.txt,功能包文件夹点开之后一定会有CMakeLists.txtpackage.xml

创建了功能包之后就可以编译了,编译过程就按照以上的指令做就可以了。

设置环境变量

编译成功之后,如果要运行功能包里面某一个程序的话,需要设置一下工作空间的环境变量,很多的工作变量都是工作空间里面放置的,为了系统能够找得到这些可执行文件,需要设置环境变量

	$ source devel/setup.bash

这是针对catkin_ws工作空间的环境变量设置,只有设置后才能让系统找到我们的工作空间并且找到工作空间里面对应的功能包。

检查环境变量
	$ echo $ROS_PACKAGE_PATH

ROS_PACKAGE_PATH 是一个ROS本身的一个环境变量,它会通过这个环境变量来查找所有ROS功能包的路径,只有设置setup.bash环境变量之后,PATH里面才会包含工作空间的路径,才能找到我们写的功能包

运行上面的语句之后,指令反馈为:

	/home/jpy/catkin_ws/src:/opt/ros/melodic/share

可以看到,第一段就是工作空间下的src文件夹路径,只要我们的功能包是放在工作空间文件夹下的src文件夹里面,系统就可以通过环境变量找到功能包。所以环境变量的设置是极其重要的。


CMakeLists.txt 和 package.xml 介绍
package.xml

文件里面的内容是通过xml这种语言描述的一些与功能包相关的信息,比如说功能包的名字,版本号,描述信息(功能包干吗用的),功能包维护者的email地址,还有license(开源的许可证)
在这里插入图片描述另外一部分就是功能包的依赖信息,比如说roscpp rospy std_msgs

	  <buildtool_depend>catkin</buildtool_depend>
	  <build_depend>roscpp</build_depend>
	  <build_depend>rospy</build_depend>
	  <build_depend>std_msgs</build_depend>
	  <build_export_depend>roscpp</build_export_depend>
	  <build_export_depend>rospy</build_export_depend>
	  <build_export_depend>std_msgs</build_export_depend>
	  <exec_depend>roscpp</exec_depend>
	  <exec_depend>rospy</exec_depend>
	  <exec_depend>std_msgs</exec_depend>

如果在当初创建功能包时没有写全,也可以随时在这里修改手动扩展依赖,主要是编译依赖build和运行依赖exec。

CMakeLists.txt

这个文件主要用来描述功能包的编译规则,文件内使用的语法是CMAKE语法。

  • find_package
    编译之前要找到哪些功能包,这些功能包是我依赖的,这里面依赖的库、头文件都可以调用

在这里插入图片描述

参考博客文章:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值