Handsfree_ros_imu:ROS机器人IMU模块的get_imu_rpy.py文件学习记录

上一篇博客写了关于Handsfree_ros_imu:ROS机器人IMU模块ARHS姿态传感器(A9)Liunx系统Ubuntu20.04学习启动和运行教程:

https://blog.csdn.net/qq_54900679/article/details/135539176?spm=1001.2014.3001.5502

这次带来get_imu_rpy.py文件的学习与数据记录改进:

get_imu_rpy.py文件位置如下:

 对应的代码如下:

#!/usr/bin/env python
#coding=UTF-8import rospy
import tf
from tf.transformations import *
from sensor_msgs.msg import Imudef callback(data):#这个函数是tf中的,可以将四元数转成欧拉角(r,p,y) = tf.transformations.euler_from_quaternion((data.orientation.x,data.orientation.y,data.orientation.z,data.orientation.w))#由于是弧度制,下面将其改成角度制看起来更方便rospy.loginfo("Roll = %f, Pitch = %f, Yaw = %f",r*180/3.1415926,p*180/3.1415926,y*180/3.1415926)def get_imu():rospy.init_node('get_imu', anonymous=True)rospy.Subscriber("/handsfree/imu", Imu, callback) #接受topic名称rospy.spin()if __name__ == '__main__':get_imu()

这段Python代码是一个ROS节点的代码示例,用于订阅名为/handsfree/imu的ROS话题(topic),该话题发布了传感器的IMU(惯性测量单元)数据。

以下是代码的主要功能和结构解释:

  1. 导入必要的Python库和ROS消息类型:

    • rospy:ROS Python库,用于编写ROS节点。
    • tf:ROS中的变换库,用于进行坐标变换。
    • from tf.transformations import *:导入tf库中的变换函数。
    • from sensor_msgs.msg import Imu:导入ROS消息类型Imu,用于订阅IMU数据。
  2. callback函数:

    • callback函数是一个回调函数,它会在接收到/handsfree/imu话题的新消息时被调用。
    • 在回调函数内部,通过tf.transformations.euler_from_quaternion函数将四元数转换为欧拉角(Roll、Pitch、Yaw)。
    • 使用rospy.loginfo函数将欧拉角以角度制格式打印到ROS日志中。
  3. get_imu函数:

    • get_imu函数是主函数,用于初始化ROS节点并设置话题订阅。
    • rospy.init_node用于初始化ROS节点,其中'get_imu'是节点的名称,anonymous=True表示使节点名称唯一。
    • rospy.Subscriber用于订阅/handsfree/imu话题,当有新消息发布到该话题时,将调用callback函数进行处理。
    • rospy.spin()使节点保持运行状态,等待新消息的到来。
  4. if __name__ == '__main__':

    • 这是Python的条件语句,用于检查脚本是否被直接运行而不是被导入到其他脚本中。
    • 如果脚本被直接运行,则调用get_imu()函数启动ROS节点并开始订阅IMU数据。

        总的来说,这个脚本是一个ROS节点,用于订阅IMU数据并将其转换为欧拉角形式,然后将结果打印到ROS日志中。这对于在ROS中处理IMU数据非常有用。

该文件在linux终端运行的代码和结果如下:

rosrun handsfree_ros_imu get_imu_rpy.py

 

改进部分

        光在终端输出数据还不够,如果想要将其输出的这些rpy数据实时地保存成文本文件或者csv格式的文件,需要对原始代码进行改进,改进后的代码(imu_data_record.py)如下:

import rospy
import tf
from tf.transformations import *
from sensor_msgs.msg import Imu
import time# 定义记录开始和结束时间
start_time = time.time()  # 记录开始时间
record_duration = 6  # 设置记录持续时间,这里设置为6秒,您可以根据需要进行调整
end_time = start_time + record_duration  # 记录结束时间# 打开文件以写入数据
file_path = '/home/hjx/handsfree/imu_data_record/rpy_timer/imu_data_rpy_timer.txt'  # txt文件路径
file_path = '/home/hjx/handsfree/imu_data_record/rpy_timer/imu_data_rpy_timer.csv'  # csv文件路径
file = open(file_path, 'w')def callback(data):if time.time() < end_time:  # 在规定的时间段内执行记录(r, p, y) = tf.transformations.euler_from_quaternion((data.orientation.x, data.orientation.y, data.orientation.z, data.orientation.w))# 由于是弧度制,下面将其改成角度制看起来更方便imu_data = "Roll = %f, Pitch = %f, Yaw = %f" % (r * 180 / 3.1415926, p * 180 / 3.1415926, y * 180 / 3.1415926)rospy.loginfo(imu_data)# 将数据写入文件file.write(imu_data + '\n')else:file.close()  # 规定时间结束后关闭文件rospy.signal_shutdown("Recording completed.")  # 停止ROS节点def get_imu():rospy.init_node('get_imu', anonymous=True)rospy.Subscriber("/handsfree/imu", Imu, callback)  # 接受topic名称rospy.spin()if __name__ == '__main__':get_imu()

        修改后的get_imu_rpy.py文件名称更名为imu_data_record.py

        要在规定的时间段内停止数据的文本记录,您可以使用Python的time模块来实现。首先,您需要在get_imu函数中添加记录数据到文本文件的逻辑,并且在规定的时间段内记录数据,然后在时间结束后停止记录。

        在上面的代码中,我们添加了一个计时器,以确保在规定的时间段内执行记录操作。当时间超过规定时间时,我们关闭文件并停止ROS节点。请注意,record_duration变量定义了记录的持续时间,您可以根据需要进行调整。

自定义imu_data_record文件的路径为(根据自己的喜好):

下面我在pycharm编辑器中来运行imu_data_record.py这个文件:

配置好conda的环境和ros包的路径后,开始运行:

 代码运行的结果如下(在6秒钟之后代码运行结束);

"WARNING: cannot load logging configuration file, logging is disabled" 这个警告通常不会导致程序出现实际错误,但它表明程序尝试加载日志配置文件时遇到了问题,因此无法进行日志记录。这通常是由于找不到或无法读取日志配置文件而引起的。

如果您的程序不依赖于日志记录,或者您不关心程序的日志输出,那么这个警告可以忽略。然而,如果您希望记录程序的日志,您可能需要检查以下事项:

  1. 日志配置文件路径:确保日志配置文件的路径在程序中是正确的,并且文件存在。

  2. 文件权限:检查日志配置文件是否具有读取权限。

  3. 配置文件格式:确保日志配置文件的格式是正确的。ROS通常使用YAML格式的配置文件来配置日志记录。

  4. ROS参数:有时,您可以通过设置ROS参数来指定日志配置文件的路径,确保这些参数设置正确。

虽然这个警告不会影响程序的正常运行,但如果您希望记录日志或解决警告,您可以尝试检查以上事项,并确保日志配置文件正确配置和可访问。如果问题仍然存在,您可以查看ROS社区或相关论坛上是否有关于此问题的更多信息和解决方案。

我们继续来到数据保存的路径下查看文件:

 发现rpy_timer文件夹下多出来了一个imu_data_rpy_timer.txt文件,点开查看;

 这些正是imu_data_record.py文件在6秒内生产的数据文本。

下面我想将这个些数据保存为csv格式,只要将py文件的保存文件扩展名变为.csv即可

继续运行imu_data_record.py文件,得到

 以上的CSV格式数据还可以进一步处理,使得数据看起来更加简洁:

依靠如下代码:

# data_processor_regex
import re# 定义一个函数,使用正则表达式来提取每行中的数字
def extract_numbers(line):# 正则表达式匹配所有的浮点数和负数return re.findall(r"[-+]?\d*\.\d+|\d+", line)# 读取原始数据文件
with open('/home/hjx/handsfree/imu_data_record/rpy_timer/imu_data_rpy_timer.csv', 'r') as file:original_lines = file.readlines()# 创建一个新的CSV文件用于保存处理后的数据
with open('/home/hjx/handsfree/imu_data_record/rpy_timer/imu_data_rpy_timer_processed_regex.csv', 'w') as output_file:for line in original_lines:numbers = extract_numbers(line)if len(numbers) >= 3:# 提取 Roll, Pitch, Yaw 的值roll, pitch, yaw = numbers[:3]# 写入提取的值到新的CSV文件output_file.write(f'{roll},{pitch},{yaw}\n')print('数据处理完成,已保存为 imu_data_rpy_timer_processed_regex.csv 文件')# 这段代码首先定义了一个函数 extract_numbers 来使用正则表达式从字符串中提取数字。
# 然后,它读取原始数据文件,对于文件中的每一行,使用这个函数来提取数字,
# 最后将提取的 Roll、Pitch 和 Yaw 值写入到一个新的CSV文件中。

 可实现下面的最终效果:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/617504.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

池化、线性、激活函数层

一、池化层 池化运算是深度学习中常用的一种操作&#xff0c;它可以对输入的特征图进行降采样&#xff0c;从而减少特征图的尺寸和参数数量。 池化运算的主要目的是通过“收集”和“总结”输入特征图的信息来提取出主要特征&#xff0c;并且减少对细节的敏感性。在池化运算中…

ElasticSearch 学习9 spring-boot ,elasticsearch7.16.1实现中文拼音分词搜索

一、elasticsearch官网下载&#xff1a;Elasticsearch 7.16.1 | Elastic 二、拼音、ik、繁简体转换插件安装 ik分词&#xff1a;GitHub - medcl/elasticsearch-analysis-ik: The IK Analysis plugin integrates Lucene IK analyzer into elasticsearch, support customized d…

高质量训练数据助力大语言模型摆脱数据困境 | 景联文科技

目前&#xff0c;大语言模型的发展已经取得了显著的成果&#xff0c;如OpenAI的GPT系列模型、谷歌的BERT模型、百度的文心一言模型等。这些模型在文本生成、问答系统、对话生成、情感分析、摘要生成等方面都表现出了强大的能力&#xff0c;为自然语言处理领域带来了新的突破。 …

ROS2——launcher

在ROS2中&#xff0c;launcher 文件是通过Python构建的&#xff0c;它们的功能是声明用哪些选项或参数来执行哪些程序&#xff0c;可以通过 launcher 文件快速同时启动多个节点。一个 launcher 文件内可以引用另一个 launcher 文件。 使用 launcher 文件 ros2 launch 可以代替…

掌握 Vue 响应式系统,让数据驱动视图(上)

&#x1f90d; 前端开发工程师&#xff08;主业&#xff09;、技术博主&#xff08;副业&#xff09;、已过CET6 &#x1f368; 阿珊和她的猫_CSDN个人主页 &#x1f560; 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 &#x1f35a; 蓝桥云课签约作者、已在蓝桥云…

GitLab任意用户密码重置漏洞(CVE-2023-7028)

GitLab CVE-2023-7028 POC user[email][]validemail.com&user[email][]attackeremail.com 本文链接&#xff1a; https://www.黑客.wang/wen/47.html

Webhook端口中的自定义签名身份认证

概述 如果需要通过 Webhook 端口从交易伙伴处接收数据&#xff0c;但该交易伙伴可能对于安全性有着较高的要求&#xff0c;而不仅仅是用于验证入站 Webhook 要求的基本身份验证用户名/密码&#xff0c;或者用户可能只想在入站 Webhook 消息上增加额外的安全层。 使用 Webhook…

【数据采集与预处理】流数据采集工具Flume

目录 一、Flume简介 &#xff08;一&#xff09;Flume定义 &#xff08;二&#xff09;Flume作用 二、Flume组成架构 三、Flume安装配置 &#xff08;一&#xff09;下载Flume &#xff08;二&#xff09;解压安装包 &#xff08;三&#xff09;配置环境变量 &#xf…

环形链表[简单]

优质博文&#xff1a;IT-BLOG-CN 一、题目 给你一个链表的头节点head&#xff0c;判断链表中是否有环。 如果链表中有某个节点&#xff0c;可以通过连续跟踪next指针再次到达&#xff0c;则链表中存在环。为了表示给定链表中的环&#xff0c;评测系统内部使用整数pos来表示链…

数据结构中的一棵树

一、树是什么&#xff1f; 有根有枝叶便是树&#xff01;根只有一个&#xff0c;枝叶可以有&#xff0c;也可以没有&#xff0c;可以有一个&#xff0c;也可以有很多。 就像这样&#xff1a; 嗯&#xff0c;应该是这样&#xff1a; 二、一些概念 1、高度 树有多高&#x…

MySQL之导入导出远程备份(详细讲解)

文章目录 一、Navicat导入导出二、mysqldump命令导入导出2.1导出2.2导入&#xff08;使用mysqldump导入 包含t_log表的整个数据库&#xff09; 三、LOAD DATA INFILE命令导入导出3.1设置;3.2导出3.3导入(使用单表数据导入load data infile的方式) 四、远程备份4.1导出4.2导入 一…

redis系列:01 数据类型及操作

redis的数据类型有哪些 string,list,set,sorted_set,hash 操作 sting: set name maliao get name exists name expire name 5 ttl name del name setex name 10 maliao 设置key和过期时间 setnx name maliao 当key不存在时才添加list&#xff1a; lpush letter a lpush le…

OpenCV-22高斯滤波

一、高斯函数的基础 要理解高斯滤波首先要直到什么是高斯函数&#xff0c;高斯函数是符合高斯分布的&#xff08;也叫正态分布&#xff09;的数据的概率密度函数。 高斯函数的特点是以x轴某一点&#xff08;这一点称为均值&#xff09;为对称轴&#xff0c;越靠近中心数据发生…

【Linux实用篇】Linux常用命令(1)

目录 1.1 Linux命令初体验 1.1.1 常用命令演示 1.1.2 Linux命令使用技巧 1.1.3 Linux命令格式 1.2 文件目录操作命令 1.2.1 ls 1.2.2 cd 1.2.3 cat 1.2.4 more 1.2.5 tail 1.2.6 mkdir 1.2.7 rmdir 1.2.8 rm 1.1 Linux命令初体验 1.1.1 常用命令演示 在这一部分中…

遥感影像-语义分割数据集:Landsat8云数据集详细介绍及训练样本处理流程

原始数据集详情 简介&#xff1a;该云数据集包括RGB三通道的高分辨率图像&#xff0c;在全球不同区域的分辨率15米。这些图像采集自Lansat8的五种主要土地覆盖类型&#xff0c;即水、植被、湿地、城市、冰雪和贫瘠土地。 KeyValue卫星类型landsat8覆盖区域未知场景水、植被、…

uniapp中按钮点击跳转页面失效,纠正错误(亲测可用)

不知道伙伴你的错误和我是否一致&#xff1f; 我当时为了点击跳转按钮发现跳转不了&#xff0c;如下错误提示&#xff1a; worker.js?libNameWAAccelerateWorker.js:1 [Deprecation] SharedArrayBuffer will require cross-origin isolation as of M92, around July 2021. S…

【Java SE语法篇】6.数组

&#x1f4da;博客主页&#xff1a;爱敲代码的小杨. ✨专栏&#xff1a;《Java SE语法》 ❤️感谢大家点赞&#x1f44d;&#x1f3fb;收藏⭐评论✍&#x1f3fb;&#xff0c;您的三连就是我持续更新的动力❤️ 文章目录 1.数组的基本概念1.1 为什么使用数组&#xff1f;1.…

MATLAB - 四旋翼飞行器动力学方程

系列文章目录 前言 本例演示了如何使用 Symbolic Math Toolbox™&#xff08;符号数学工具箱&#xff09;推导四旋翼飞行器的连续时间非线性模型。具体来说&#xff0c;本例讨论了 getQuadrotorDynamicsAndJacobian 脚本&#xff0c;该脚本可生成四旋翼状态函数及其雅各布函数…

streamlit中文开发手册(详细版)

目录 一、安装与配置 1.1 安装 Streamlit 1.2 配置文件 1.3 运行Streamlit应用 二、streamlit显示数据 2.1 显示标题 2.2 显示文本 2.3 显示代码段 2.4 通用显示方法 2.5 显示表格 2.6 显示JSON 2.7 显示pyplot图表 2.8 显示地图 2.9 显示图像 2.10 显示视频 三…

2024年腾讯云新用户专属优惠活动及代金券活动汇总

腾讯云作为国内领先的云计算服务提供商&#xff0c;一直致力于为用户提供优质、高效的服务。为了更好地满足新用户的需求&#xff0c;腾讯云在2024年推出了一系列新用户专属优惠活动和代金券活动。本文将为大家详细介绍这些活动&#xff0c;帮助大家更好地了解和利用这些优惠。…