ROS1/ROS2中工作空间和工作包创建详解

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下生成builddevel文件夹。

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
  • 第一次运行会自动生成installbuildlog文件夹。

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_msgsrospy(Python客户端)、roscpp(C++客户端)

3) 编译并更新工作空间

cd ~/catkin_ws
catkin_make
source devel/setup.bash

4) 查看包结构

cd ~/catkin_ws/src/my_package
ls

通常包含 CMakeLists.txtpackage.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]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

点云SLAM

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值