0

0

C++怎么在ROS中编程_C++机器人操作系统中创建节点、发布与订阅话题

冰火之心

冰火之心

发布时间:2025-11-22 16:40:02

|

968人浏览过

|

来源于php中文网

原创

答案:在ROS中使用C++通过roscpp库创建发布者和订阅者节点,首先建立工作空间和功能包,编写talker.cpp和listener.cpp实现消息发布与订阅,配置CMakeLists.txt后编译运行,确保roscore启动后分别运行节点,即可实现话题通信。

c++怎么在ros中编程_c++机器人操作系统中创建节点、发布与订阅话题

在ROS(机器人操作系统)中使用C++编程,主要是通过ROS提供的客户端库roscpp来实现节点的创建、话题的发布与订阅。下面详细介绍如何用C++在ROS中创建一个简单的发布者和订阅者节点。

创建ROS工作空间和功能包

开始前确保已安装ROS环境。然后创建工作空间和功能包:

  • 创建工作空间目录:
    mkdir -p ~/catkin_ws/src
  • 初始化catkin工作空间:
    cd ~/catkin_ws && catkin_make
  • 进入src目录并创建功能包:
    cd src && catkin_create_pkg my_robot_node roscpp std_msgs

上面命令创建了一个名为my_robot_node的功能包,依赖roscppstd_msgs

编写发布者节点

在功能包内创建一个src/talker.cpp文件:

立即学习C++免费学习笔记(深入)”;

#include 
#include 

int main(int argc, char **argv) {
    ros::init(argc, argv, "talker");
    ros::NodeHandle nh;
    ros::Publisher pub = nh.advertise("chatter", 10);

    ros::Rate loop_rate(10); // 10Hz

    int count = 0;
    while (ros::ok()) {
        std_msgs::String msg;
        msg.data = "Hello ROS: " + std::to_string(count);

        pub.publish(msg);
        ros::spinOnce();
        loop_rate.sleep();
        ++count;
    }

    return 0;
}

这段代码做了以下几件事:

  • 初始化ROS节点,名称为talker
  • 创建NodeHandle用于与ROS系统通信
  • 定义一个发布者,向话题chatter发布std_msgs/String类型的消息
  • 以10Hz频率循环发送递增的消息

编写订阅者节点

创建src/listener.cpp文件:

#include 
#include 

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", 10, chatterCallback);

    ros::spin();

    return 0;
}

说明:

  • 创建名为listener的节点
  • 订阅chatter话题,回调函数chatterCallback
  • 每当收到消息,自动调用回调函数打印内容
  • ros::spin()保持节点运行并监听回调

配置CMakeLists.txt

进入功能包根目录,编辑CMakeLists.txt,在末尾添加:

Figstack
Figstack

一个基于 Web 的AI代码伴侣工具,可以帮助跨不同编程语言管理和解释代码。

下载
add_executable(talker src/talker.cpp)
add_executable(listener src/listener.cpp)

target_link_libraries(talker ${catkin_LIBRARIES})
target_link_libraries(listener ${catkin_LIBRARIES})

add_dependencies(talker ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS})
add_dependencies(listener ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS})

确保可执行文件能正确编译和链接ROS库。

编译与运行

回到工作空间根目录并编译:

cd ~/catkin_ws
catkin_make

启动ROS核心:

roscore

打开新终端,运行发布者:

source devel/setup.bash
rosrun my_robot_node talker

再打开一个终端,运行订阅者:

rosrun my_robot_node listener

你将看到订阅者终端不断输出“Hello ROS: X”的消息。

基本上就这些。掌握节点初始化、发布与订阅的模式后,就可以扩展到传感器数据处理、控制指令发送等更复杂的场景。关键理解NodeHandle、Publisher/Subscriber机制以及回调模型。不复杂但容易忽略细节,比如忘记ros::spinOnce()ros::spin()会导致程序无法响应消息。

相关专题

更多
string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

358

2023.08.02

传感器故障解决方法
传感器故障解决方法

传感器故障排除指南:识别故障症状(如误读或错误代码)。检查电源和连接(确保连接牢固,无损坏)。校准传感器(遵循制造商说明)。诊断内部故障(目视检查、信号测试、环境影响评估)。更换传感器(选择相同规格,遵循安装说明)。验证修复(检查信号准确性,监测异常行为)。

470

2024.06.04

C++ 高级模板编程与元编程
C++ 高级模板编程与元编程

本专题深入讲解 C++ 中的高级模板编程与元编程技术,涵盖模板特化、SFINAE、模板递归、类型萃取、编译时常量与计算、C++17 的折叠表达式与变长模板参数等。通过多个实际示例,帮助开发者掌握 如何利用 C++ 模板机制编写高效、可扩展的通用代码,并提升代码的灵活性与性能。

8

2026.01.23

php远程文件教程合集
php远程文件教程合集

本专题整合了php远程文件相关教程,阅读专题下面的文章了解更多详细内容。

25

2026.01.22

PHP后端开发相关内容汇总
PHP后端开发相关内容汇总

本专题整合了PHP后端开发相关内容,阅读专题下面的文章了解更多详细内容。

18

2026.01.22

php会话教程合集
php会话教程合集

本专题整合了php会话教程相关合集,阅读专题下面的文章了解更多详细内容。

18

2026.01.22

宝塔PHP8.4相关教程汇总
宝塔PHP8.4相关教程汇总

本专题整合了宝塔PHP8.4相关教程,阅读专题下面的文章了解更多详细内容。

10

2026.01.22

PHP特殊符号教程合集
PHP特殊符号教程合集

本专题整合了PHP特殊符号相关处理方法,阅读专题下面的文章了解更多详细内容。

10

2026.01.22

PHP探针相关教程合集
PHP探针相关教程合集

本专题整合了PHP探针相关教程,阅读专题下面的文章了解更多详细内容。

7

2026.01.22

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
HTML5/CSS3/JavaScript/ES6入门课程
HTML5/CSS3/JavaScript/ES6入门课程

共102课时 | 6.8万人学习

前端基础到实战(HTML5+CSS3+ES6+NPM)
前端基础到实战(HTML5+CSS3+ES6+NPM)

共162课时 | 19万人学习

第二十二期_前端开发
第二十二期_前端开发

共119课时 | 12.5万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号