在 ROS(Robot Operating System)工作空间创建和工作包创建的流程,并附上相关命令示例,适合ROS 1(比如ROS Noetic)和ROS 2(比如ROS 2 Foxy)基础入门。
一、ROS工作空间(Workspace)创建流程
1. ROS 1 工作空间创建(catkin)
1) 创建工作空间目录
mkdir -p ~/catkin_ws/src
cd ~/catkin_ws/
2) 初始化工作空间
catkin_make
- 该命令会在
catkin_ws
下生成build
和devel
文件夹。
3) 配置环境变量
source devel/setup.bash
- 你可以将这句加到
~/.bashrc
,方便每次打开终端自动生效:
echo "source ~/catkin_ws/devel/setup.bash" >> ~/.bashrc
source ~/.bashrc
4) 验证工作空间
rospack profile
或者
echo $ROS_PACKAGE_PATH
确认包含了~/catkin_ws/src
路径。
2. ROS 2 工作空间创建(colcon)
1) 创建工作空间目录
mkdir -p ~/ros2_ws/src
cd ~/ros2_ws/
2) 编译工作空间
colcon build
- 第一次运行会自动生成
install
、build
、log
文件夹。
3) 配置环境变量
source install/setup.bash
- 建议加入
~/.bashrc
:
echo "source ~/ros2_ws/install/setup.bash" >> ~/.bashrc
source ~/.bashrc
4) 验证工作空间
echo $ROS_PACKAGE_PATH
二、ROS工作包(Package)创建流程
1. ROS 1 创建工作包(catkin_create_pkg)
1) 进入src目录
cd ~/catkin_ws/src
2) 创建包
catkin_create_pkg my_package std_msgs rospy roscpp
my_package
是包名- 后面跟的是依赖的ROS包,常见的有
std_msgs
、rospy
(Python客户端)、roscpp
(C++客户端)
3) 编译并更新工作空间
cd ~/catkin_ws
catkin_make
source devel/setup.bash
4) 查看包结构
cd ~/catkin_ws/src/my_package
ls
通常包含 CMakeLists.txt
和 package.xml
两个关键文件。
2. ROS 2 创建工作包(ros2 pkg create)
1) 进入工作空间src目录
cd ~/ros2_ws/src
2) 创建包(Python示例)
ros2 pkg create --build-type ament_python my_package
- 对于C++包,改为:
ros2 pkg create --build-type ament_cmake my_package
3) 编译并更新工作空间
cd ~/ros2_ws
colcon build
source install/setup.bash
三、补充说明和注意事项
-
工作空间目录结构
ROS 1典型:
~/catkin_ws/├── src/ # 源代码目录,放工作包├── build/ # 编译文件夹└── devel/ # 开发环境设置
ROS 2典型:
~/ros2_ws/├── src/ # 源代码目录├── build/ # 编译文件夹├── install/ # 安装文件夹,含环境脚本└── log/ # 编译日志
-
package.xml和CMakeLists.txt
这两个文件是工作包的核心配置文件,前者声明包信息与依赖,后者负责构建规则。
-
依赖管理
包之间依赖需要在
package.xml
中声明,编译时会自动检测。 -
环境配置
每次打开新终端,记得
source
对应工作空间的环境脚本,或者把它加入~/.bashrc
。
四、在ROS1中创建一个 工作空间和工作包C++示例
下面是一个完整的 ROS 1 C++ 工作包模板,包含了:
- 工作包结构
CMakeLists.txt
配置package.xml
依赖- 一个简单的发布者节点(
talker.cpp
) - 一个订阅者节点(
listener.cpp
) - 编译构建说明
1. 创建工作包
cd ~/catkin_ws/src
catkin_create_pkg my_cpp_package roscpp std_msgs
cd ~/catkin_ws
catkin_make
source devel/setup.bash
2. 目录结构
my_cpp_package/
├── CMakeLists.txt
├── package.xml
└── src/├── talker.cpp└── listener.cpp
3. talker.cpp(发布者)
#include "ros/ros.h"
#include "std_msgs/String.h"
#include <sstream>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);int count = 0;while (ros::ok()) {std_msgs::String msg;std::stringstream ss;ss << "hello world " << count++;msg.data = ss.str();ROS_INFO("%s", msg.data.c_str());chatter_pub.publish(msg);ros::spinOnce();loop_rate.sleep();}return 0;
}
4. 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;
}
5. 修改 CMakeLists.txt
找到 ## Declare a C++ executable
和 ## Add cmake target dependencies
部分,添加以下内容:
add_executable(talker src/talker.cpp)
add_executable(listener src/listener.cpp)target_link_libraries(talker ${catkin_LIBRARIES})
target_link_libraries(listener ${catkin_LIBRARIES})
6. 修改 package.xml(确保有依赖)
确认以下依赖已经存在:
<build_depend>roscpp</build_depend>
<build_depend>std_msgs</build_depend>
<exec_depend>roscpp</exec_depend>
<exec_depend>std_msgs</exec_depend>
7. 编译运行
cd ~/catkin_ws
catkin_make
source devel/setup.bash
启动节点(新开两个终端)
roscore
rosrun my_cpp_package talker
rosrun my_cpp_package listener
结果示意
在 talker
终端看到:
[INFO] hello world 0
[INFO] hello world 1
在 listener
终端看到:
[INFO] I heard: [hello world 0]
[INFO] I heard: [hello world 1]