欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 科技 > 名人名企 > ROS1/ROS2中工作空间和工作包创建详解

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

2025/6/21 20:42:16 来源:https://blog.csdn.net/qq_36812406/article/details/148051070  浏览:    关键词: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]

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词