工作空间和功能包
什么是工作空间(workspace)
你不能直接打开你linux的根目录终端运行ros2,你的系统盘会爆的
工作空间: 其实就是新建文件夹,终端也在这里打开,所有文件都应该放在这里
典型的ROS2文件结构
- src:存放代码
- install:安装空间,编译出的可执行文件等有效产物会放在这里
- build: 编译空间,存放编译产生的中间文件,这个体积最大
- log:放日志的
创建一个工作空间
手动创建你的总文件夹,我这里就叫它studyProject,然后进入它,手动创建src 文件夹
在src 文件夹里打开终端,由于Ubuntu会阻止你用pip全局安装包,所以我们为了下载国内开发者专用的rosdepc 需要先创建虚拟环境:
python3 -m venv .venv
source .venv/bin/activate
pip install rosdepc等待rosdepc下载完成
然后运行(不需要sudo!)
rosdepc init
rosdepc update我们再回到项目根目录:
cd ..此后只要在项目根目录下运行这个命令:
rosdepc install -i --from-path src --rosdistro humble -y就会自动安装所有依赖。你可以类比:这个rosdepc就好比npm install从package.json里自动读取要安装的依赖然后自动给你装好
然后是colcon,之后编译都用它:
sudo apt install python3-colcon-ros以后编译就用
colcon build就会给你编译了,编译完成就会自动给你生成剩下三个文件夹
功能包
功能包,就是ROS2世界里组织代码的最小单元和**“集装箱”。你可以把它理解成一个专门用来存放某个具体功能(比如控制底盘、处理摄像头图像、做导航规划)所有相关文件的专属文件夹**。
为什么需要功能包
想象一下,如果不区分功能包,把所有代码都堆在一起,当你想要分享其中一个很棒的功能(比如一个激光雷达驱动)时,就得在一大坨代码里费力地剥离出来。别人拿到你的代码,也得面对一锅乱炖。
ROS2社区的数万个功能包都遵循同样的结构,这让你能快速上手别人的代码,也让工具可以自动化地处理它们。
功能包的一般配置
一个文件夹是不是ROS2功能包,看它有没有两个“身份证” :
package.xml:“自我介绍”。包含这个包的名称、版本、作者、描述,最重要的是它依赖哪些别的功能包。CMakeLists.txt(C++包) 或setup.py(Python包):“编译说明书”。告诉编译系统(colcon)这个包该如何处理,生成什么可执行文件。
除了这两个核心文件,一个典型的功能包还常常包含以下文件夹:
src/:存放C++源代码(.cpp文件)。<package_name>/:存放Python源代码(.py文件),与包名同名。msg/和srv/:存放自定义的通信接口(消息和服务)。launch/:存放启动文件,可以一键启动这个包需要的多个节点。config/:存放参数配置文件(.yaml文件)。
你可以用命令 ros2 pkg list 列出系统里所有功能包,用 ros2 pkg executables <package_name> 查看某个包里有哪些可执行文件
功能包创建,构建,运行
创建功能包要先cd到src目录
格式为ros2 pkg create --build-type <build-type> <package_name>
其中build-type 是功能包类型,有C++和Python两种,对应ament_cmake ament_python
# 创建一个C++包
ros2 pkg create --build-type ament_cmake my_cpp_pkg
# 创建一个Python包
ros2 pkg create --build-type ament_python my_python_pkg构建先返回项目根目录
cd ..
colcon build # 编译工作空间里所有的包
colcon build --packages-select my_python_pkg # 只编译指定的包C++会先编译再构建,python则不需要先编译。
运行:编译成功后,先“激活”工作空间,然后就可以运行包里的程序了:
# 激活工作空间
source install/setup.bash
# 运行包里的可执行文件
ros2 run my_python_pkg my_node