【机器人操作系统】ROS话题编程

本文详细介绍了如何在ROS中自定义GPS消息类型,包括创建msg文件、添加编译选项,以及实现发布者和订阅者节点的编程。通过实例展示如何创建发布模拟GPS数据的node和接收并处理这些消息的node,涉及关键步骤如CMakeLists.txt配置和编译运行流程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

自定义一个类型为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;    //实例化句柄,初始化node
    
      topic_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
      {
        ...   //处理msg
        pub.publish(msg);//以1Hz的频率发布msg
        loop_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);  //设置回调函数gpsCallback
      ros::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
    
Exbot易科机器人实验维护书籍,提供学习镜像包括indigo和kinetic等,努力为ROS爱好者和开发人员提供力所能及的服务。, 本书第2版概括性地介绍了ROS系统的各种工具。ROS是一个先进的机器人操作系统框架,现今已有数百个研究团体和公司将其应用在机器人行业中。对于机器人技术的非专业人士来说,它也相对容易上手。在本书中,你将了解如何安装ROS,如何开始使用ROS的基本工具,以及最终如何应用先进的计算机视觉和导航工具。, 在阅读本书的过程中无需使用任何特殊的设备。书中每一章都附带了一系列的源代码示例和教程,你可以在自己的计算机上运行。这是你唯一需要做的事情。, 当然,我们还会告诉你如何使用硬件,这样你可以将你的算法应用到现实环境中。我们在选择设备时特意选择一些业余用户负担得起的设备,同时涵盖了在机器人研究中最典型的传感器或执行器。, 最后,由于ROS系统的存在使得整个机器人具备在虚拟环境中工作的能力。你将学习如何创建自己的机器人并结合功能强大的导航功能包集。此外如果使用Gazebo仿真环境,你将能够在虚拟环境中运行一切。第2版在最后增加了一章,讲如何使用“Move it!”包控制机械臂执行抓取任务。读完本书后,你会发现已经可以使用ROS机器人进行工作了,并理解其背后的原理。, 主要内容, 第1章介绍安装ROS系统最简单的方法,以及如何在不同平台上安装ROS,本书使用的版本是ROS Hydro。这一章还会说明如何从Debian软件包安装或从源代码进行编译安装,以及在虚拟机和ARM CPU中安装。, 第2章涉及ROS框架及相关的概念和工具。该章介绍节点、主题和服务,以及如何使用它们,还将通过一系列示例说明如何调试一个节点或利用可视化方法直观地查看通过主题发布的消息。, 第3章进一步展示ROS强大的调试工具,以及通过对节点主题的图形化将节点间的通信数据可视化。ROS提供了一个日志记录API来轻松地诊断节点的问题。事实上,在使用过程中,我们会看到一些功能强大的图形化工具(如rqt_console和rqt_graph),以及可视化接口(如rqt_plot和rviz)。最后介绍如何使用rosbag和rqt_bag记录并回放消息。, 第4章介绍ROS系统与真实世界如何连接。这一章介绍在ROS下使用的一些常见传感器和执行器,如激光雷达、伺服电动机、摄像头、RGB-D传感器、GPS等。此外,还会解释如何使用嵌入式系统与微控制器(例如非常流行的Arduino开发板)。, 第5章介绍ROS对摄像头和计算机视觉任务的支持。首先使用FireWire和USB摄像头驱动程序将摄像头连接到计算机并采集图像。然后,你就可以使用ROS的标定工具标定你的摄像头。我们会详细介绍和说明什么是图像管道,学习如何使用集成了OpenCV的多个机器视觉API。最后,安装并使用一个视觉里程计软件。, 第6章将展示如何在ROS节点中使用点云库。该章从基本功能入手,如读或写PCL数据片段以及发布或订阅这些消息所必需的转换。然后,将在不同节点间创建一个管道来处理3D数据,以及使用PCL进行缩减采样、过滤和搜索特征点。, 第7章介绍在ROS系统中实现机器人的第一步是创建一个机器人模型,包括在Gazebo仿真环境中如何从头开始对一个机器人进行建模和仿真,并使其在仿真环境中运行。你也可以仿真摄像头和激光测距传感器,为后续学习如何使用ROS的导航功能包集和其他工具奠定基础。, 第8章是两章关于ROS导航功能包集中的第1章。该章介绍如何对你的机器人进行使用导航功能包集所需的初始化配置。然后用几个例子对导航功能包集进行说明。, 第9章延续第8章的内容,介绍如何使用导航功能包集使机器人有效地自主导航。该章介绍使用ROS的Gazebo仿真环境和rviz创建一个虚拟环境,在其中构建地图、定位机器人并用障碍回避做路径规划。, 第10章讨论ROS中移动机器人机械臂的一个工具包。该章包含安装这个包所需要的文档,以及使用MoveIt!操作机械臂进行抓取、放置,简单的运动规划等任务的演示示例。, 预备知识, 我们写作本书的目的是让每位读者都可以完成本书的学习并运行示例代码。基本上,你只需要在计算机上安装一个Linux发行版。虽然每个Linux发行版应该都能使用,但还是建议你使用Ubuntu 12.04 LTS。这样你可以根据第1章的内容安装ROS Hydro。, 对于ROS的这一版本,你将需要Ubuntu 14.04之前的版本,因为之后的版本已经不再支持Hydro了。, 对于硬件要求,一般来说,任何台式计算机或笔记本电脑都满足。但是,最好使用独立显卡来运行Gazebo仿真环境。此外,如果有足够的外围接口将会更好,因为这样你可以连接几个传感器和执行器,包括摄像头和Arduino开发板。, 你还需要Git(g
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

BkbK-

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值