1.ROS工作空间结构
bash
ros_ws/ # 工作空间根文件夹
├── src/ # 源代码空间(放置功能包)
│ ├── CMakeLists.txt # 顶层CMake文件(必需,自动生成)
│ ├── package_1/ # 功能包1
│ │ ├── CMakeLists.txt # package_1中有C++代码时才需要
│ │ ├── package.xml #
│ │ ├── src/ # 存放C++文件
│ │ │ ├── node1.cpp # C++节点需要编译生成二进制可执行文件
│ │ │ └── node2.cpp
│ │ ├── include/package_1/ # C++节点需要的头文件
│ │ │ └── my_header_1.h
│ │ ├── scripts/ # 存放python文件
│ │ │ ├── node3.py # python节点无需编译直接作为脚本复制
│ │ │ └── node4.py
│ │ └── ... # 还可以有launch,config,msg等文件夹,按需创建
│ ├── package_2/ # 功能包2
│ │ ├── CMakeLists.txt
│ │ ├── package.xml
│ │ └── ...
│ └── ...
├── build/ # 编译空间(自动生成)
│ ├── CMakeCache.txt
│ ├── CMakeFiles/
│ └── ...
├── devel/ # 开发空间(自动生成)
│ ├── setup.bash # 环境配置脚本
│ ├── lib/ # 编译生成的库文件
│ └── ...
└── install/ # 安装空间(调试时一般不用)
├── setup.bash
└── ...
2.创建工作空间步骤
bash
mkdir -p ./ros_ws/src #建立工作空间文件夹
cd ./ros_ws/src && catkin_init_workspace #会在src下创建CMakeLists.txt文件
cd ../ && catkin_make #会在ros_ws下创建build和devel两个(含文件的)文件夹
source ./devel/setup.bash #更新环境变量
3.创建功能包步骤
bash
cd ~/ros_ws/src #进入代码空间创建功能包
catkin_create_pkg <package_name> [depend1] [depend2] [depend3]
#example:catkin_create_pkg camera_yolo_result std_msgs rospy roscpp
#只会创建最基本的include和src两个空文件夹,其他文件夹自己手动创建
cd ../ && catkin_make #退回到工作空间重新编译
source ./devel/setup.bash #更新环境变量
4.注意事项
4.1可以把source ~/ros_ws/devel/setup.bash这行指令写到.bashrc中去,这样每次打开终端都会自动重新加载环境变量,可以避免每打开一个终端就要执行一次该指令的麻烦。
bash
#对于User状态下的工作空间
vim ~/.bashrc
#在~/.bashrc中添加如下类似指令后保存退出(根据实际路径修改)
source ~/ros_ws/devel/setup.bash
#对于Root状态下的工作空间
vim /root/.bashrc
#在~/.bashrc中添加如下类似指令后保存退出(根据实际路径修改)
source /home/li/ros_ws/devel/setup.bash
4.2一般建议在User状态下进行ROS工作空间的构建,在Root状态下的工作空间在修改时几乎只能通过命令行,并且.bashrc文件在User状态和Root状态下各有一个且互不影响。
4.3多工作空间的覆盖机制
ROS允许多个工作空间并存,可在不同项目的工作空间创建所需要的功能包。不同的工作空间中若存在同名的功能包,根据ROS的工作空间覆盖机制,所有工作空间的路径会依次在ROS_PACKAGE_PATH环境变量中记录,当设置多个工作空间的环境变量后,新设置的路径在ROS_PACKAGE_PATH中会自动放置在最前端,在运行时ROS会优先查找在最前端的工作空间中是否存在指定的功能包,如果不存在就顺序向后查找其他工作空间,直到最后一个工作空间为止,即.bashrc文件中越靠下的路径在ROS_PACKAGE_PATH中越靠前。
4.4如果需要运行多个工作空间中的节点互相通信,可以使用overlay机制实现,注意工作空间叠加顺序。
bash
# 终端中执行
source /opt/ros/noetic/setup.bash # 首先是ROS系统本身
source ~/ros_ws_vision/devel/setup.bash # 其次是主工作空间
source ~/ros_ws_control/devel/setup.bash # 最后是其他工作空间