在Ubuntu 20.04中创建ROS工作空间:catkin_init_workspace
与catkin_make
的作用、工作流程及其区别
在Ubuntu 20.04系统上开发机器人应用时,ROS(Robot Operating System)工作空间的创建与管理是至关重要的步骤。本文将详细介绍如何在Ubuntu 20.04中创建ROS工作空间,深入解析catkin_init_workspace
和catkin_make
这两个关键命令的作用、工作流程及其区别,并通过具体示例加以说明。
一、ROS工作空间概述
ROS工作空间是一个文件系统目录结构,用于组织、编译和管理ROS包(Package)。通过工作空间,开发者可以高效地开发、测试和部署机器人软件组件。Catkin是ROS官方推荐的构建系统,支持多语言编程(如C++和Python),并能自动处理包之间的依赖关系。
二、创建ROS工作空间的步骤
2.1 安装ROS
在开始创建工作空间之前,确保已在Ubuntu 20.04上正确安装了ROS。以ROS Noetic为例,安装步骤如下:
bash
sudo apt update
sudo apt install ros-noetic-desktop-full
安装完成后,初始化ROS环境:
bash
echo "source /opt/ros/noetic/setup.bash" >> ~/.bashrc
source ~/.bashrc
2.2 安装Catkin工具
确保已安装Catkin构建工具:
bash
sudo apt install ros-noetic-catkin
2.3 创建工作空间目录结构
使用mkdir -p
命令创建工作空间及其子目录:
bash
mkdir -p ~/catkin_pointcloudmap_ws/src
mkdir
:创建目录。-p
:递归创建多级目录,如果目录已存在则不报错。~/catkin_pointcloudmap_ws/src
:在用户主目录下创建名为catkin_pointcloudmap_ws
的工作空间,并在其中创建src
子目录,用于存放ROS包的源代码。
2.4 初始化工作空间
切换到src
目录并初始化工作空间:
bash
cd ~/catkin_pointcloudmap_ws/src
catkin_init_workspace
catkin_init_workspace
:在当前src
目录中生成一个CMakeLists.txt
文件,该文件链接到Catkin的顶层CMake配置文件,为后续的构建过程做准备。
2.5 返回工作空间根目录并编译
切换回工作空间根目录并使用catkin_make
编译工作空间:
bash
cd ~/catkin_pointcloudmap_ws
catkin_make
catkin_make
:编译工作空间中的所有ROS包。此命令会自动检测src
目录下的包,解析依赖关系,并进行编译。编译完成后,会生成build
和devel
目录,其中devel
目录包含编译后的文件和环境设置脚本。
2.6 配置环境变量
为了在每次打开新终端时自动加载工作空间的环境变量,将以下命令添加到~/.bashrc
文件中:
bash
echo "source ~/catkin_pointcloudmap_ws/devel/setup.bash" >> ~/.bashrc
source ~/.bashrc
echo "source ~/catkin_pointcloudmap_ws/devel/setup.bash" >> ~/.bashrc
:将环境配置命令追加到~/.bashrc
文件。source ~/.bashrc
:立即应用~/.bashrc
中的更改,使得环境变量生效。
2.7 验证ROS包路径
通过以下命令查看ROS包路径,确保新创建的工作空间已被正确添加:
bash
echo $ROS_PACKAGE_PATH
输出应包含~/catkin_pointcloudmap_ws/src
,例如:
/home/username/catkin_pointcloudmap_ws/src:/opt/ros/noetic/share
三、catkin_init_workspace
与catkin_make
的作用及区别
3.1 catkin_init_workspace
- 作用 :初始化ROS工作空间的
src
目录,生成一个CMakeLists.txt
文件,该文件链接到Catkin的顶层CMake配置文件。 - 使用时机:在创建新的ROS工作空间并首次添加ROS包之前运行一次。
- 工作流程 :
- 在
src
目录中生成CMakeLists.txt
链接文件。 - 为后续的构建过程提供必要的CMake配置。
- 在
3.2 catkin_make
- 作用:编译整个ROS工作空间中的所有ROS包,处理依赖关系,生成可执行文件和其他构建产物。
- 使用时机:每当添加新的ROS包、修改现有包的代码或更新依赖关系时运行。
- 工作流程 :
- 在工作空间根目录执行,自动检测
src
目录下的所有ROS包。 - 解析包之间的依赖关系,确定编译顺序。
- 调用CMake和Make工具进行配置和编译。
- 生成
build
和devel
目录,包含编译结果和环境设置脚本。
- 在工作空间根目录执行,自动检测
3.3 区别
特性 | catkin_init_workspace |
catkin_make |
---|---|---|
主要功能 | 初始化src 目录,生成CMakeLists.txt 链接文件 |
编译整个工作空间,处理依赖关系,生成构建产物 |
使用时机 | 创建新工作空间时首次运行 | 每次添加/修改包或依赖关系时运行 |
执行位置 | 在src 目录内运行 |
在工作空间根目录运行 |
依赖关系处理 | 不处理,主要用于初始化 | 自动解析并处理包之间的依赖关系 |
生成的文件 | CMakeLists.txt 链接文件 |
build 、devel 目录及其内容 |
3.4 是否包含关系
catkin_make
不包含catkin_init_workspace
的功能。catkin_init_workspace
用于初始化工作空间,而catkin_make
用于编译工作空间。两者在功能和使用时机上是互补的,且通常需要先使用catkin_init_workspace
初始化工作空间后,再使用catkin_make
进行编译。
注意 :在某些ROS版本或配置中,catkin_make
可能会在检测到未初始化的工作空间时自动执行初始化步骤,但为了保证跨环境和版本的一致性,建议遵循标准步骤,先运行catkin_init_workspace
,再运行catkin_make
。
四、示例:创建并编译一个简单的ROS工作空间
以下示例展示了如何在Ubuntu 20.04中创建一个名为catkin_pointcloudmap_ws
的ROS工作空间,并编译其中的ROS包。
4.1 创建工作空间目录结构
bash
mkdir -p ~/catkin_pointcloudmap_ws/src
4.2 初始化工作空间
bash
cd ~/catkin_pointcloudmap_ws/src
catkin_init_workspace
4.3 返回根目录并编译
bash
cd ~/catkin_pointcloudmap_ws
catkin_make
4.4 配置环境变量
bash
echo "source ~/catkin_pointcloudmap_ws/devel/setup.bash" >> ~/.bashrc
source ~/.bashrc
4.5 创建一个示例ROS包
在src
目录中创建一个名为hello_world
的ROS包:
bash
cd ~/catkin_pointcloudmap_ws/src
catkin_create_pkg hello_world std_msgs rospy roscpp
4.6 添加简单的节点代码
4.6.1 创建发布者节点
在hello_world
包中创建src/talker.cpp
:
cpp
// ~/catkin_pointcloudmap_ws/src/hello_world/src/talker.cpp
#include "ros/ros.h"
#include "std_msgs/String.h"
int main(int argc, char **argv)
{
ros::init(argc, argv, "talker");
ros::NodeHandle nh;
ros::Publisher chatter_pub = nh.advertise<std_msgs::String>("chatter", 1000);
ros::Rate loop_rate(10);
while (ros::ok())
{
std_msgs::String msg;
msg.data = "Hello, ROS!";
ROS_INFO("%s", msg.data.c_str());
chatter_pub.publish(msg);
ros::spinOnce();
loop_rate.sleep();
}
return 0;
}
4.6.2 创建订阅者节点
在hello_world
包中创建src/listener.cpp
:
cpp
// ~/catkin_pointcloudmap_ws/src/hello_world/src/listener.cpp
#include "ros/ros.h"
#include "std_msgs/String.h"
void chatterCallback(const std_msgs::String::ConstPtr& msg)
{
ROS_INFO("I heard: [%s]", msg->data.c_str());
}
int main(int argc, char **argv)
{
ros::init(argc, argv, "listener");
ros::NodeHandle nh;
ros::Subscriber sub = nh.subscribe("chatter", 1000, chatterCallback);
ros::spin();
return 0;
}
4.7 更新CMakeLists.txt
编辑hello_world
包的CMakeLists.txt
,添加可执行文件的构建指令:
cmake
# ~/catkin_pointcloudmap_ws/src/hello_world/CMakeLists.txt
cmake_minimum_required(VERSION 3.0.2)
project(hello_world)
find_package(catkin REQUIRED COMPONENTS
roscpp
std_msgs
)
catkin_package()
include_directories(
${catkin_INCLUDE_DIRS}
)
add_executable(talker src/talker.cpp)
target_link_libraries(talker ${catkin_LIBRARIES})
add_executable(listener src/listener.cpp)
target_link_libraries(listener ${catkin_LIBRARIES})
4.8 编译工作空间
回到工作空间根目录并编译:
bash
cd ~/catkin_pointcloudmap_ws
catkin_make
编译完成后,devel
目录下将生成talker
和listener
两个可执行文件。
4.9 运行节点
打开两个终端,分别运行发布者和订阅者节点。
终端1:运行发布者
bash
source ~/catkin_pointcloudmap_ws/devel/setup.bash
rosrun hello_world talker
终端2:运行订阅者
bash
source ~/catkin_pointcloudmap_ws/devel/setup.bash
rosrun hello_world listener
运行后,订阅者终端将显示发布者发布的"Hello, ROS!"消息,实现基本的消息传递功能。
五、总结
在Ubuntu 20.04中创建和管理ROS工作空间是ROS开发流程中的基础步骤。通过使用catkin_init_workspace
初始化工作空间的src
目录,再利用catkin_make
编译整个工作空间,开发者能够高效地组织和构建ROS包。理解catkin_init_workspace
与catkin_make
的作用及其区别,有助于在实际开发中更加灵活和高效地管理ROS项目。通过本文的详细步骤和示例,读者应能够顺利创建并编译一个功能简单的ROS工作空间,为进一步的机器人应用开发打下坚实基础。