文章目录

  • 自定义消息的实现过程及说明
    • 一、功能包的创建
    • 二、自定义话题消息
      • (1)创建自定义消息文件步骤
      • (2)添加编译选项步骤
    • 三、创建发布者
    • 四、创建订阅者
    • 五、添加编译选项
    • 六、编译运行
      • (1)编译
      • (2)运行

自定义一个类型为gps的消息(包括位置x,y和工作状态state信息),一个node以一定频率发布模拟的gps消息,另一个node接收并处理,算出到原点的距离。

自定义消息的实现过程及说明

一、功能包的创建

  • 1.进入src目录cd ~/工作空间名/src

    cd ~/catkin_ws/src
    
  • 2.创建功能包

    catkin_create_pkg topic_demo roscpp rospy std_msg
    

    使用命令catkin_create_pkg 功能包名 [依赖项1] [依赖项2] ...
    话题编程所依赖的依赖项有:rospyroscppstd_msgs

二、自定义话题消息

(1)创建自定义消息文件步骤

  • 1.进入功能包目录cd ~/工作空间名/功能包名

    cd ~/catkin_ws/topic_demo
    
  • 2.创建msg文件夹用来存放msg文件

    mkdir msg
    
  • 3.创建msg文件

    vi gps.msg
    
  • 4.编辑msg文件

    • msg文件内容:

      string state   #工作状态
      float32 x      #x坐标
      float32 y      #y坐标
      
    • msg数据类型类似于结构体
      在程序中对一个gps消息进行创建修改的方法和对结构体的操作一样。

      struct gps
      {string state;float32 x;float32 y;
      }
      

(2)添加编译选项步骤

  • 1.编辑CMakeLists.txt

    • (1)在find_package中添加message_generation

      find_package(catkin REQUIRED COMPONENTS
      roscpp
      std_msgs
      message_generation   #需要添加的地方
      )
      
    • (2)添加文件夹生成命令
      add_message_files(FILES gps.msg)
      #catkin在cmake之上新增的命令,指定从哪个消息文件生成
      
    • (3)添加生成消息的命令
      generate_messages(DEPENDENCIES std_msgs)
      #catkin新增的命令,用于生成消息
      #DEPENDENCIES后面指定生成msg需要依赖其他什么消息,由于gps.msg用到了flaot32这种ROS标准消息,因此需要再把std_msgs作为依赖
      
  • 2.编辑package.xml

    • 添加:

      <build_depend>message_generation</build_depend>
      <run_depend>message_runtime</run_depend>
      
  • 3.编译后产生gps.h头文件,在include目录下

三、创建发布者

  • topic_demo/src/talker.cpp

    #include <ros/ros.h>
    #include <topic_demo/gps.h>  //自定义msg产生的头文件int main(int argc, char **argv)
    {ros::init(argc, argv, "talker");  //用于解析ROS参数,第三个参数为本节点名ros::NodeHandle nh;    //实例化句柄,初始化nodetopic_demo::gps msg;  //自定义gps消息并初始化 ...ros::Publisher pub = nh.advertise<topic_demo::gps>("gps_info", 1); //创建publisher,往"gps_info"话题上发布消息ros::Rate loop_rate(1.0);   //定义发布的频率,1HZ while (ros::ok())   //循环发布msg{...   //处理msgpub.publish(msg);//以1Hz的频率发布msgloop_rate.sleep();//根据前面的定义的loop_rate,设置1s的暂停}return 0;
    }
    

四、创建订阅者

  • topic_demo/src/listener.cpp

    #include <ros/ros.h>
    #include <topic_demo/gps.h>
    #include <std_msgs/Float32.h>void gpsCallback(const topic_demo::gps::ConstPtr &msg)
    {  std_msgs::Float32 distance;  //计算离原点(0,0)的距离distance.data = sqrt(pow(msg->x,2)+pow(msg->y,2));ROS_INFO("Listener: Distance to origin = %f, state: %s",distance.data,msg->state.c_str()); //输出
    }int main(int argc, char **argv)
    {ros::init(argc, argv, "listener");ros::NodeHandle n;ros::Subscriber sub = n.subscribe("gps_info", 1, gpsCallback);  //设置回调函数gpsCallbackros::spin(); //ros::spin()用于调用所有可触发的回调函数,将进入循环,不会返回,类似于在循环里反复调用spinOnce() //而ros::spinOnce()只会去触发一次return 0;
    }
    

五、添加编译选项

  • CMakeLists.txt的修改

    add_executable(talker src/talker.cpp) #生成可执行文件talker
    add_dependencies(talker topic_demo_generate_messages_cpp)
    #表明在编译talker前,必须先生编译完成自定义消息
    #必须添加add_dependencies,否则找不到自定义的msg产生的头文件
    #表明在编译talker前,必须先生编译完成自定义消息
    target_link_libraries(talker ${catkin_LIBRARIES}) #链接add_executable(listener src/listener.cpp ) #声称可执行文件listener
    add_dependencies(listener topic_demo_generate_messages_cpp)
    target_link_libraries(listener ${catkin_LIBRARIES})#链接
    

六、编译运行

(1)编译

  • 进入工作空间

    cd ~/catkin_ws
    
  • 编译

    catkin_make
    

(2)运行

  • 运行发布者

    rosrun topic_demo talker
    
  • 运行订阅者

    rosrun topic_demo listener
    

【机器人操作系统】ROS话题编程相关推荐

  1. 机器人操作系统ROS动作编程

    目录 一.什么是动作通讯模型 二.创建工作区间 1.创建功能包 2.编译功能包 三.动作编程 1.定义action文件 2.创建.cpp文件 3.编译及运行 四.分布式通讯 1.主机 2.从机 3.运 ...

  2. 机器人操作系统ROS(4)话题编程

    此节的前提是已经创建好工作空间,请参考 工作空间 一.话题通讯模型 二.话题编程实现 1. 实现发布者(Talker) a.在~/catkin_ws/src/learning_communicaton ...

  3. 机器人操作系统ROS(5)服务编程

    在catkin\_ws工作空间下的功能包learning\_communication下继续实现通信编程,请参考上节-话题编程 一.服务通讯模型 二.服务编程实现 注:实现加法listener发布两个 ...

  4. 机器人操作系统ROS 编程开发--详细总结

    最近工作涉及到自动驾驶的,需要学习ROS,学习中总结了一些知识点,分享给大家. ROS基本介绍 机器人操作系统ROS,是一种分布式处理框架(又名Nodes),ROS常用C++和python编程语言开发 ...

  5. 机器人操作系统ROS(6)动作编程

    注:在 catkin\_ws 工作空间下的功能包earning\_communication 下继续实现通信编程,参考上节-服务编程 一.动作通讯模型 二.动作编程实现 1. 自定义动作文件actio ...

  6. python机器人编程教程入门_机器人操作系统(ROS)入门必备:机器人编程一学就会

    本书是针对机器人操作系统(ROS)初学者的入门教程,从基础的如何安装ROS,到ROS的框架介绍和C/C++.Python编程基础概念介绍,直至完整搭建一个机器人项目,每一个部分都有详细的操作过程和相应 ...

  7. 机器人操作系统ROS(1)

    ROS总体设计 ROS五个特点 点对点设计 一个使用ROS的系统包括一系列进程,这些进程存在于多个不同的主机并且在运行过程中通过端对端的拓扑结构进行联系,如图2所示.虽然基于中心服务器的那些软件框架也 ...

  8. 从零打造一个机器人002【初识机器人操作系统--ROS】

    从零打造一个机器人002[初识机器人操作系统–ROS] 1.ROS是什么 ROS是一个适用于机器人的开源的元操作系统.其实它并不是一个真正的操作系统,其底层的任务调度.编译.寻址等任务还是由Linux ...

  9. 关于机器人操作系统(ROS)学习前须知二三

    ROS基础资料 1.什么是ROS? ROS(机器人操作系统,Robot Operating System),是专为机器人软体开发所设计出来的一套电脑作业系统架构.它是一个开源的元级操作系统(后操作系统 ...

  10. <笔记>机器人操作系统ROS理论与实践--第一讲:认识ROS

    <笔记>机器人操作系统ROS理论与实践--第一讲:认识ROS 前言 一.为什么需要ROS 二.ROS的总体设计 1.一个目标 2.五个特点 3.四位一体 三.ROS的系统实现--三个层次 ...

最新文章

  1. 运行PHP出现No input file specified错误解决办法
  2. 网络推广网站解析为什么有些网站有收录却没流量?
  3. x86标志位符号表示(PF奇偶位)
  4. 目前微服务/REST的最佳技术栈
  5. uni-app读取html缓存,uni-app同步缓存值 设置 读取 删除(示例代码)
  6. git/SmartGit切换用户
  7. maven本地仓库中存在jar包,但编译不成功,显示jar包不存在
  8. DBA常用的一些视图和sql
  9. 关于OpenCV使用遇到的问题集(多数为转载)
  10. 安装 Nginx 并配置负载均衡
  11. 同步手绘板——关于/dev/graphics/fb0权限的获取
  12. 有趣的JavaScript数组
  13. TextCNN模型原理
  14. 互联网早报:京东发布“小时购”业务:京东APP下单提速至小时达、分钟达
  15. 微服务[开发生命周期]
  16. App 上线被拒绝的原因有哪些
  17. 说说Python中切片是什么?
  18. 考研复试—专业课英语
  19. 笑死人不偿命的程序员内涵段子
  20. linux安装hadoop的MySQL_Hadoop(2)---Mysql 在Linux下的安装与配置

热门文章

  1. Educoder Basemap和Seaborn 第2关:Seaborn图形介绍
  2. python自定义函数名_使用自定义名称创建Python动态函数
  3. redis分布式锁简单总结
  4. 数据库修改后 前台同步更新 php,PHP实现前台页面与MySQL的数据绑定、同步更新...
  5. rstudio 修改代码间距_如何在RStudio里修改R脚本的编码方式
  6. python读写excel模块pandas_python3 基于pandas读写Excel
  7. 循环输出26个字母C语言,菜鸟求助,写一个随机输出26个英文字母的程序
  8. verilog 简单module_HDLBits:在线学习 Verilog (二十九 · Problem 140-144)
  9. mysql 时间戳截断_列的Mysql时间戳数据被截断
  10. dbforge连接mysql_DbForge Schema Compare for MySQL入门教程:如何连接到数据库