热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

rospy通过matplotlib画出/odom轨迹图

文章目录注意事项代码最终效果注意事项Python没有回调函数这个东西,所以ROS中回调函数的实现其实是通过多线程来解决的又因为是多线程,所以其实ros


文章目录

    • 注意事项
    • 代码
    • 最终效果


注意事项


  1. Python没有回调函数这个东西,所以ROS中回调函数的实现其实是通过多线程来解决的
  2. 又因为是多线程,所以其实rospy.spin()并不是必须的,只要确保主线程(main)存活那么rospy中的回调函数就可以一直接收数据

代码

实现了同时监听两个 /odom 并画图进行对比

import rospy
from matplotlib import pyplot as plt
from nav_msgs.msg import Odometry
import numpy as np
import timeclass DrawError(object):odom_time, cb_time = 0, 0x_odom = []y_odom = []x_rf2o = []y_rf2o = []def __init__(self):passdef isCBAlive(self):return False if self.cb_time - self.odom_time > 2 else Truedef odomCallBack(self, data):self.x_odom.append(data.pose.pose.position.x)self.y_odom.append(data.pose.pose.position.y)self.odom_time = time.time()def rf2oCallBack(self, data):self.x_rf2o.append(data.pose.pose.position.x)self.y_rf2o.append(data.pose.pose.position.y)# check if data is not received. If so, exit and plot the figuredef cbMonitor(self, plt):self.cb_time = time.time()if not self.isCBAlive():rospy.logwarn("No data received!Exit!")return Trueelse:return Falseif __name__ == "__main__":rospy.init_node("drawingError")de = DrawError()# gazebo's odom, without nosierospy.Subscriber("odom", Odometry, de.odomCallBack)# rf2o_odometry's odomrospy.Subscriber("odom_rf2o", Odometry, de.rf2oCallBack)rospy.Timer(rospy.Duration(2), de.cbMonitor)plt.title("odom display")while not rospy.is_shutdown():if de.cbMonitor(plt) == True:breakplt.plot(de.x_odom, de.y_odom, color="b", label="/odom")plt.plot(de.x_rf2o, de.y_rf2o, color="r", label="/odom_rf2o")plt.legend()plt.show()

最终效果

在这里插入图片描述


推荐阅读
  • 目录预备知识导包构建数据集神经网络结构训练测试精度可视化计算模型精度损失可视化输出网络结构信息训练神经网络定义参数载入数据载入神经网络结构、损失及优化训练及测试损失、精度可视化qu ... [详细]
  • 使用Tkinter构建51Ape无损音乐爬虫UI
    本文介绍了如何使用Python的内置模块Tkinter来构建一个简单的用户界面,用于爬取51Ape网站上的无损音乐百度云链接。虽然Tkinter入门相对简单,但在实际开发过程中由于文档不足可能会带来一些不便。 ... [详细]
  • 本文节选自《NLTK基础教程——用NLTK和Python库构建机器学习应用》一书的第1章第1.2节,作者Nitin Hardeniya。本文将带领读者快速了解Python的基础知识,为后续的机器学习应用打下坚实的基础。 ... [详细]
  • 本文介绍如何使用OpenCV和线性支持向量机(SVM)模型来开发一个简单的人脸识别系统,特别关注在只有一个用户数据集时的处理方法。 ... [详细]
  • 在多线程并发环境中,普通变量的操作往往是线程不安全的。本文通过一个简单的例子,展示了如何使用 AtomicInteger 类及其核心的 CAS 无锁算法来保证线程安全。 ... [详细]
  • 本文介绍了如何使用Python的Paramiko库批量更新多台服务器的登录密码。通过示例代码展示了具体实现方法,确保了操作的高效性和安全性。Paramiko库提供了强大的SSH2协议支持,使得远程服务器管理变得更加便捷。此外,文章还详细说明了代码的各个部分,帮助读者更好地理解和应用这一技术。 ... [详细]
  • Android异步处理一:使用Thread+Handler实现非UI线程更新UI界面Android异步处理二:使用AsyncTask异步更新UI界面Android异步处理三:Handler+Loope ... [详细]
  • java解析json转Map前段时间在做json报文处理的时候,写了一个针对不同格式json转map的处理工具方法,总结记录如下:1、单节点单层级、单节点多层级json转mapim ... [详细]
  • 短视频app源码,Android开发底部滑出菜单首先依赖三方库implementationandroidx.appcompat:appcompat:1.2.0im ... [详细]
  • vue引入echarts地图的四种方式
    一、vue中引入echart1、安装echarts:npminstallecharts--save2、在main.js文件中引入echarts实例:  Vue.prototype.$echartsecharts3、在需要用到echart图形的vue文件中引入:   importechartsfrom"echarts";4、如果用到map(地图),还 ... [详细]
  • iOS snow animation
    CTSnowAnimationView.hCTMyCtripCreatedbyalexon1614.Copyright©2016年ctrip.Allrightsreserved.# ... [详细]
  • 使用多项式拟合分析淘宝双11销售趋势
    根据天猫官方数据,2019年双11成交额达到2684亿元,再次刷新历史记录。本文通过多项式拟合方法,分析并预测未来几年的销售趋势。 ... [详细]
  • 开发技巧:在Interface Builder中实现UIButton文本居中对齐的方法与步骤
    开发技巧:在Interface Builder中实现UIButton文本居中对齐的方法与步骤 ... [详细]
  • Python 序列图分割与可视化编程入门教程
    本文介绍了如何使用 Python 进行序列图的快速分割与可视化。通过一个实际案例,详细展示了从需求分析到代码实现的全过程。具体包括如何读取序列图数据、应用分割算法以及利用可视化库生成直观的图表,帮助非编程背景的用户也能轻松上手。 ... [详细]
  • Python多线程编程技巧与实战应用详解 ... [详细]
author-avatar
mobiledu2502917177
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有