新闻中心

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

2025-11-22
浏览次数:
返回列表
答案:在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文件:

#include <ros/ros.h>
#include <std_msgs/String.h>

int main(int argc, char **argv) {
    ros::init(argc, argv, "talker");
    ros::NodeHandle nh;
    ros::Publisher pub = nh.advertise<std_msgs::String>("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 <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", 10, chatterCallback);

    ros::spin();

    return 0;
}

说明:

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

配置CMakeLists.txt

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

CA.LA CA.LA

第一款时尚产品在线设计平台,服装设计系统

CA.LA 94 查看详情 CA.LA
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()会导致程序无法响应消息。

以上就是C++怎么在ROS中编程_C++机器人操作系统中创建节点、发布与订阅话题的详细内容,更多请关注其它相关文章!


# 这段  # 什么是seo环保板材  # 百度seo入驻  # 什么行业的网站优化  # 文章seo采集  # 衡阳耒阳网站优化  # 良心网站推广怎么做  # 商场全年营销推广方案  # 学seo技术怎么赚钱  # 新乡论坛营销推广  # 沈阳网站推广计划书模板  # 之心  # 中文网  # 相关文章  # node  # 与其他  # 创建工作  # 创建一个  # 如何使用  # 回调  # talk  # c++编程  # string类  # c++  # ai  # 回调函数  # 操作系统 


相关栏目: 【 科技资讯46185 】 【 网络学院92790


相关推荐: 抖音商城签到领现金是真的吗_抖音商城签到奖励与提现说明  在J*a中如何在J*a中使用异常机制记录错误日志_异常日志实践经验  mysql如何设置表访问权限_mysql表访问权限配置  J*aScript DOM操作:高效清空列表元素的策略与实践  处理动态列数据:J*a ArrayList的正确初始化与字符累加教程  c++如何使用Meson构建系统_c++比CMake更快的构建工具  fishbowl官网免费版 fishbowl养鱼网站入口  将HTML Canvas内容转换为可上传的图像文件(File对象)  如何修改开机登录密码_Windows账户安全设置超详细教程【必学】  C++如何操作大型数据集_使用C++流式处理(Streaming)技术避免一次性加载大文件  b站如何看历史记录_b站观看历史找回方法  三星ZFold5多任务卡顿_Samsung ZFold5流畅度提升  Django表单验证失败时保留用户输入数据的最佳实践  c++如何使用折叠表达式(Fold Expressions)_c++17可变参数模板新技巧  c++如何使用TBB库进行任务并行_c++ Intel线程构建模块  顺丰快件物流信息 官方网站查询入口  汽水音乐在线解析 汽水音乐在线解析入口  怎么在html里运行vbs脚本_html中运行vbs脚本方法【教程】  Win10如何恢复误删的快捷方式_Win10重建常用软件快捷方式  CSS Flexbox与媒体查询:实现响应式布局中元素的并排与堆叠  c++ 命名空间怎么用 c++ namespace使用指南  移动端XML文件怎么转换成Excel 手机和平板上的解决方案  MongoDB聚合管道:正确匹配对象数组中_id的方法  AI泡沫首次被“刺破”:GPU十年都无法存活!  深入理解J*aScript Promise异步执行与微任务队列  微博网页版怎么开启两步验证_微博网页版账号安全两步验证设置方法  win11如何加载ICC颜色配置文件 Win11校色文件安装与显示器色彩管理【指南】  新手怎么开始学化妆 零基础化妆入门教程  高德地图家和公司地址在哪设置 高德地图通勤路线设置方法【超详细】  PS5 Pro有点优势但不多! 《燕云十六声》PS5平台与PC性能画面对比  Excel文件在线转换快速入口 Excel在线格式转换网站  Composer的 "check-platform-reqs" 命令有什么用_在部署前检查生产环境是否满足Composer依赖需求  TikTok搜索不到用户发布内容怎么办 TikTok用户内容搜索优化方法  蛙漫限时开放最深处链接_蛙漫全站漫画会员同款秒开地址  Pandas DataFrame 多条件优先级排序与排名  魅族20怎样在浏览器开无图省流_iPhone魅族20浏览器开无图省流【流量节省】  企业名称高精度匹配:N-gram方法在结构相似性分析中的应用  提升屏幕阅读器对“m”时间单位的播报准确性:HTML与CSS组合解决方案  J*aScript井字棋(Tic-Tac-Toe)核心交互逻辑实现教程  PDF怎么合并PDF并保持格式_PDF合并文件保持排版教程  韩小圈电脑版在线入口_网页版免费登录地址  顺丰快递查单号物流信息 顺丰快递小程序查询入口  SteamMachine定价或为699美元 大家想入手吗?  2026春节假期时间安排 2026春节假日查询  QQ网页版官方账号入口 QQ网页版网页版登录指南  抖音创作助手登录入口_抖音创作辅助工具官网直达  Win11截图该按哪些键 Win11截屏完整流程解析【教程】  Highcharts 雷达图径向轴标签定制指南:利用多Y轴实现数值标注  绝地鸭卫平a核爆刀流玩法攻略  高德地图怎么看全景照片_高德地图全景照片浏览教程 

搜索