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;为自然语言处理领域带来了新的突破。 …

Spring Boot集成Redis简单示例

要在Spring Boot中集成Redis&#xff0c;你可以使用Spring Data Redis库来简化操作。 下面是一个示例代码&#xff1a; 首先&#xff0c;在你的Spring Boot项目的pom.xml文件中添加以下依赖&#xff1a; <dependencies><!-- 其他依赖... --><dependency>&…

springboot启动加载数据库数据到内存

1、概述 一般来说&#xff0c;springboot工程环境配置放在properties文件中&#xff0c;启动的时候将工程中的properties/yaml文件的配置项加载到内存中。但这种方式改配置项的时候&#xff0c;需要重新编译部署&#xff0c;考虑到这种因素&#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; 蓝桥云课签约作者、已在蓝桥云…

问答机器人prompt

def build_prompt(prompt_template, **kwargs): ‘’‘将 Prompt 模板赋值’‘’ prompt prompt_template for k, v in kwargs.items(): if isinstance(v, str): val v elif isinstance(v, list) and all(isinstance(elem, str) for elem in v): val ‘\n’.join(v) else: v…

人机协同中的偏序关系

偏序关系是指集合中的元素之间存在一种有限的、非全序的关系。在该关系下&#xff0c;元素之间可以进行比较&#xff0c;但不一定能够确定它们的相对顺序。 在人机协同中&#xff0c;偏序关系可以用来描述人和机器之间的合作关系、信息传递关系或任务分配关系。例如&#xff0c…

数据库面经---10则

数据库范式有哪些&#xff1a;​​​​​​​ 第一范式&#xff08;1NF&#xff09;&#xff1a; 数据表中的每一列都是不可分割的原子值。每一行数据在关系表中都有唯一标识&#xff0c;通常是通过主键来实现。第二范式&#xff08;2NF&#xff09;&#xff1a; 满足第一范式。…

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

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

[论文笔记] PAI-Megatron中qwen和mistral合并到Megtron-LM

一、千问 关于tokenizer的改动: 1.1、更改build_tokenizer中tokenizer类的加载。 /mnt/nas/pretrain/code/Megatron-LM/megatron/tokenizer/__init__.py 或者 tokenizer.py 在build_tokenizer.py函数中: ​elif args.tokenizer_type == "QwenTokenizer":assert a…

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

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

Servlet-基本概念

一、概念 根据百度百科&#xff1a;Servlet&#xff08;Server Applet&#xff09;是Java Servlet的简称&#xff0c;是用Java编写的服务器端程序&#xff0c;主要功能在于交互式地浏览和生成数据&#xff0c;生成动态Web内容。 加深理解&#xff1a; 上面提到的Web内容我们…

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

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

【Java 设计模式】设计原则之迪米特法则

文章目录 1. 定义2. 好处3. 应用4. 示例结语 在软件开发中&#xff0c;设计原则是创建灵活、可维护和可扩展软件的基础。 这些原则为我们提供了指导方针&#xff0c;帮助我们构建高质量、易理解的代码。 ✨单一职责原则&#xff08;SRP&#xff09; ✨开放/封闭原则&#xff08…

新一代通信协议 - Socket.D

一、简介 Socket.D 是一种二进制字节流传输协议&#xff0c;位于 OSI 模型中的5~6层&#xff0c;底层可以依赖 TCP、UDP、KCP、WebSocket 等传输层协议。由 Noear 开发。支持异步流处理。其开发背后的动机是用开销更少的协议取代超文本传输协议(HTTP)&#xff0c;HTTP 协议对于…

环形链表[简单]

优质博文&#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导入 一…