当前位置: 首页 > ops >正文

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]
http://www.xdnf.cn/news/14528.html

相关文章:

  • 服务网格安全(Istio):用零信任架构重构微服务通信安全
  • 5.3 LED字符设备驱动
  • 深度学习笔记27-LSTM实现糖尿病探索与预测(Pytorch)
  • 实验问题记录:PyTorch Tensor 也会出现 a = b 赋值后,修改 a 会影响 b 的情况
  • 解锁决策树:数据挖掘的智慧引擎
  • IT运维面试常问问题答案
  • QEMU学习之路(10)— RISCV64 virt 使用Ubuntu启动
  • 【C++】哈希表的实现(开放定址法)
  • 服务器手动安装并编译R环境库包:PROJ→RGDAL
  • C++ 11 智能指针 std::weak_ptr
  • 项目开发中途遇到困难的解决方案
  • RISC-V物联网关,支持鸿蒙,T-Thread实时系统
  • 关于Seata的一个小issue...
  • 【蓝牙】Qt4中向已配对的手机发送PDF文件
  • html和css实现文本打断换行、自动换行
  • linux下如何找到dump文件被生成到哪里了
  • 机构运动分析系统开发(Python实现)
  • Excel学习01
  • 257. 二叉树的所有路径(js)
  • DL00215-基于YOLOv11的太阳能电池红外异常检测含数据集
  • 【工具】Koishi|koishi跨平台聊天机器人开发平台使用方式(开发者方式)
  • 神经网络试题
  • 船舶动力与自动化系统:PROFIBUS转EtherCAT接口技术的创新应用
  • 【分布式】基于Redisson实现对分布式锁的注解式封装
  • 数据要素治理框架下图情学科的核心角色重塑
  • 猜数字小游戏微信流量主小程序开源
  • 【机械视觉】Halcon—【十五、一维码(条形码)和二维码识别】
  • 多模态大语言模型arxiv论文略读(128)
  • 计算机视觉课程总结
  • FPGA基础 -- Verilog 锁存器简介