ROS学习系列笔记(一):Topic发布自定义msg数据及其rqt_plot可视化显示

本文主要是介绍ROS学习系列笔记(一):Topic发布自定义msg数据及其rqt_plot可视化显示,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

代码包下载链接:https://github.com/yongzcong/communication_learn.git
内容:假设发布的数据包括三个值 x , y , z x,y,z x,y,z,首先定义msg数据格式;其次新建发布节点publisher,发布msg格式的数据;然后新建节点listener,订阅发布消息;最后,在rqt_plot中订阅发布的数据并可视化显示。

1、msg格式数据与编译文件

1.1 定义数据结构

进入工作空间:
/catkin_ws/src/note/
在note/msg建立文件类型文件test.msg
写入消息的类型:

float64 x
float64 y
float64 z

注意:msg的文件名,后面的cpp文件均需包含此文件。

1.2 CMakeLists.txt文件

cmake_minimum_required(VERSION 2.8.3)
project(note)find_package(catkin REQUIRED COMPONENTSroscpprospystd_msgsmessage_generationgeometry_msgs
)add_message_files(FILES test.msg)
generate_messages(DEPENDENCIES std_msgs)catkin_package(
#  INCLUDE_DIRS include
#  LIBRARIES learning_communicationCATKIN_DEPENDS roscpp rospy std_msgs message_runtime
#  DEPENDS system_lib
)include_directories(include${catkin_INCLUDE_DIRS}
)add_executable(talker src/talker.cpp)
target_link_libraries(talker ${catkin_LIBRARIES})
add_dependencies(talker ${PROJECT_NAME}_generate_messages_cpp)add_executable(listener src/listener.cpp)
target_link_libraries(listener ${catkin_LIBRARIES})
add_dependencies(listener ${PROJECT_NAME}_generate_messages_cpp)

1.3 package.xml文件

<?xml version="1.0"?>
<package format="2"><name>note</name><version>0.0.0</version><description>The note package</description><maintainer email="hcx@todo.todo">hcx</maintainer><license>TODO</license><buildtool_depend>catkin</buildtool_depend><build_depend>roscpp</build_depend><build_depend>rospy</build_depend><build_depend>std_msgs</build_depend><build_depend>message_generation</build_depend><build_export_depend>roscpp</build_export_depend><build_export_depend>rospy</build_export_depend><build_export_depend>std_msgs</build_export_depend><exec_depend>roscpp</exec_depend><exec_depend>rospy</exec_depend><exec_depend>std_msgs</exec_depend><exec_depend>message_runtime</exec_depend>  <export></export>
</package>

2. 定义发布节点

2.1 创建发布节点

进入工作空间:
/catkin_ws/src/note/
在note/src建立发布cpp文件talker.cpp
给出代码:

/*** 该例程将发布self_date话题,消息类型float64
*/
#include "ros/ros.h"
#include <math.h>
#include "note/test.h"int main(int argc, char **argv)
{// ROS节点初始化ros::init(argc, argv, "shiyan_talker");// 创建节点句柄ros::NodeHandle n;// 创建一个Publisher,发布名为self_date的topic,消息类型为std_msgs::float32ros::Publisher self_pub = n.advertise<note::test>("self_date", 1000);int pi = 3.1415926;// 设置循环的频率ros::Rate loop_rate(10);int count = 0;while (ros::ok()){// 初始化std_msgs::float32类型的消息note::test self_msg;self_msg.x = sin(pi*count/16);self_msg.y = cos(pi*count/16);self_msg.z = 1 + (pow(-1,count)/2);// 发布消息ROS_INFO("%.5f %.5f %.5f",self_msg.x,self_msg.y,self_msg.z);self_pub.publish(self_msg);// 循环等待回调函数ros::spinOnce();// 按照循环频率延时loop_rate.sleep();++count;}return 0;
}

2.2 发布节点程序解释

下面详细解释代码:

  1. 头文件
#include "ros/ros.h"
#include <math.h>
#include "note/test.h"

此为头文件,ros/ros.h是ros的头文件;math.h是数学功能头文件,因为后面用到三角函数;note/test.h是数据格式包含。
2. ros节点初始化与创建节点句柄

  ros::init(argc, argv, "shiyan_talker");ros::NodeHandle n;
  1. 创建发布
ros::Publisher self_pub = n.advertise<note::test>("self_date", 1000);

创建一个Publisher,发布名为self_date的topic,消息类型为float64。其中,self_pub是名称,note::test指定数据类型;self_date是话题名;1000是发布序列的大小,这个影响不大,取1000就行了。
注意话题名,订阅消息需要指定发布者节点名。
4. 数据赋值

note::test self_msg;
self_msg.x = sin(pi*count/16);
self_msg.x = sin(pi*count/16);
self_msg.z = 1 + (pow(-1,count)/2);

self_msg是定义的test类型的数据结构,其中有float64 x,float64 y,float64 z,分别赋值给定。
5. 消息发布

ROS_INFO("%.5f %.5f %.5f",self_msg.x,self_msg.y,self_msg.z);
self_pub.publish(self_msg);

通过self_pub将test类型的数据结构self_msg发布出去。

2.3 发布节点运行结果

在这里插入图片描述

3、如何订阅自己的msg数据

3.1 定义发布节点

进入工作空间:
/catkin_ws/src/note/
在note/src建立订阅cpp文件listener.cpp
给出代码:

#include "ros/ros.h"
#include "note/test.h"void chatterCallback(const note::test::ConstPtr& msg)
{ROS_INFO("%f %f %f",msg->x,msg->y,msg->z);
}int main(int argc, char **argv)
{ros::init(argc, argv, "shiyan_listener");ros::NodeHandle n;ros::Subscriber sub = n.subscribe("self_date", 1000, chatterCallback);ros::spin();return 0;
}

3.2 发布节点程序解释

下面详细解释代码:

  1. 头文件
#include "ros/ros.h"
#include "note/test.h"

此为头文件,ros/ros.h是ros的头文件;note/test.h是数据格式包含。
2. ros节点初始化与创建节点句柄

  ros::init(argc, argv, "shiyan_listener");ros::NodeHandle n;
  1. 创建订阅
ros::Subscriber sub = n.subscribe("self_date", 1000, chatterCallback);

创建一个Subscriber,订阅名为sub。其中,self_date是订阅的话题名(与发布的话题名对应),chatterCallback是回调函数;1000是接收序列的大小,这个影响不大,与发布者保持一致就好。
4. 回调函数

void chatterCallback(const note::test::ConstPtr& msg)
{ROS_INFO("%f %f %f",msg->x,msg->y,msg->z);
}

chatterCallback是回调函数名,note::test::ConstPtr指定msg的数据类型,然后将订阅的消息打印出来。

3.3 发布节点运行结果

在这里插入图片描述

4、如何可视化自己发布的msg数据

新打开终端,首先对工作空间source,否则会出错,找不到话题。
source ~/catkin_ws2/devel/setup.bash
rosrun rqt_plot rqt_plot
输入话题名self_date即可将订阅的数据通过曲线表示出来。
注:点与点之间通过直线连接,因此self_date.c会以近似三角波的形式呈现,self_date.c本身是上下震荡的点。
在这里插入图片描述

这篇关于ROS学习系列笔记(一):Topic发布自定义msg数据及其rqt_plot可视化显示的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/186592

相关文章

javaScript在表单提交时获取表单数据的示例代码

《javaScript在表单提交时获取表单数据的示例代码》本文介绍了五种在JavaScript中获取表单数据的方法:使用FormData对象、手动提取表单数据、使用querySelector获取单个字... 方法 1:使用 FormData 对象FormData 是一个方便的内置对象,用于获取表单中的键值

Rust中的BoxT之堆上的数据与递归类型详解

《Rust中的BoxT之堆上的数据与递归类型详解》本文介绍了Rust中的BoxT类型,包括其在堆与栈之间的内存分配,性能优势,以及如何利用BoxT来实现递归类型和处理大小未知类型,通过BoxT,Rus... 目录1. Box<T> 的基础知识1.1 堆与栈的分工1.2 性能优势2.1 递归类型的问题2.2

Python使用Pandas对比两列数据取最大值的五种方法

《Python使用Pandas对比两列数据取最大值的五种方法》本文主要介绍使用Pandas对比两列数据取最大值的五种方法,包括使用max方法、apply方法结合lambda函数、函数、clip方法、w... 目录引言一、使用max方法二、使用apply方法结合lambda函数三、使用np.maximum函数

定价129元!支持双频 Wi-Fi 5的华为AX1路由器发布

《定价129元!支持双频Wi-Fi5的华为AX1路由器发布》华为上周推出了其最新的入门级Wi-Fi5路由器——华为路由AX1,建议零售价129元,这款路由器配置如何?详细请看下文介... 华为 Wi-Fi 5 路由 AX1 已正式开售,新品支持双频 1200 兆、配有四个千兆网口、提供可视化智能诊断功能,建

Java深度学习库DJL实现Python的NumPy方式

《Java深度学习库DJL实现Python的NumPy方式》本文介绍了DJL库的背景和基本功能,包括NDArray的创建、数学运算、数据获取和设置等,同时,还展示了如何使用NDArray进行数据预处理... 目录1 NDArray 的背景介绍1.1 架构2 JavaDJL使用2.1 安装DJL2.2 基本操

Redis的数据过期策略和数据淘汰策略

《Redis的数据过期策略和数据淘汰策略》本文主要介绍了Redis的数据过期策略和数据淘汰策略,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一... 目录一、数据过期策略1、惰性删除2、定期删除二、数据淘汰策略1、数据淘汰策略概念2、8种数据淘汰策略

轻松上手MYSQL之JSON函数实现高效数据查询与操作

《轻松上手MYSQL之JSON函数实现高效数据查询与操作》:本文主要介绍轻松上手MYSQL之JSON函数实现高效数据查询与操作的相关资料,MySQL提供了多个JSON函数,用于处理和查询JSON数... 目录一、jsON_EXTRACT 提取指定数据二、JSON_UNQUOTE 取消双引号三、JSON_KE

Python给Excel写入数据的四种方法小结

《Python给Excel写入数据的四种方法小结》本文主要介绍了Python给Excel写入数据的四种方法小结,包含openpyxl库、xlsxwriter库、pandas库和win32com库,具有... 目录1. 使用 openpyxl 库2. 使用 xlsxwriter 库3. 使用 pandas 库

SpringBoot定制JSON响应数据的实现

《SpringBoot定制JSON响应数据的实现》本文主要介绍了SpringBoot定制JSON响应数据的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们... 目录前言一、如何使用@jsonView这个注解?二、应用场景三、实战案例注解方式编程方式总结 前言

使用Python在Excel中创建和取消数据分组

《使用Python在Excel中创建和取消数据分组》Excel中的分组是一种通过添加层级结构将相邻行或列组织在一起的功能,当分组完成后,用户可以通过折叠或展开数据组来简化数据视图,这篇博客将介绍如何使... 目录引言使用工具python在Excel中创建行和列分组Python在Excel中创建嵌套分组Pyt