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

news2024/9/29 5:25:30

上一篇博客写了关于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-8

import rospy
import tf
from tf.transformations import *
from sensor_msgs.msg import Imu

def 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.coloradmin.cn/o/1379222.html

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

相关文章

解决虚拟机的网络图标不见之问题

在WIN11中&#xff0c;启动虚拟机后&#xff0c;发现网络图标不见了&#xff0c;见下图&#xff1a; 1、打开虚拟机终端 输入“sudo server network-manager stop”&#xff0c;停止网络管理器 输入“cd /回车” &#xff0c; 切换到根目录 输入“cd var回车” &#xff0c;…

从零开始怎么做好产品宣传册

​随着市场竞争的日益激烈&#xff0c;产品宣传册作为企业与消费者之间的桥梁&#xff0c;其重要性日益凸显。一份优秀的宣传册不仅能提升企业的品牌形象&#xff0c;还能帮助企业更好地推广产品&#xff0c;吸引潜在客户。然而&#xff0c;很多企业在制作宣传册时却常常无从下…

webpack原理和逆向实战

文章目录 什么是webpackwebpack基本原理webpack代码分析webpack代码抠取webpack全模块自吐webpack自动扣取总结 什么是webpack webpack是一个现代 JavaScript 应用程序的静态模块打包器(module bundler)&#xff0c;负责分析翻译压缩打包代码。 上面的官网的一张示例图。 web…

了解及掌握二维数组

第一题: 题目&#xff08;单对角线和&#xff09;&#xff1a; 分析&#xff1a; 用结构体的话&#xff0c;太麻烦了&#xff0c;专业一点&#xff0c;用本该属于它的知识点来解决它。 代码&#xff1a; #include <iostream> using namespace std; int main() { int…

设计模式—行为型模式之状态模式

设计模式—行为型模式之状态模式 状态&#xff08;State&#xff09;模式&#xff1a;对有状态的对象&#xff0c;把复杂的“判断逻辑”提取到不同的状态对象中&#xff0c;允许状态对象在其内部状态发生改变时改变其行为。 状态模式包含以下主要角色&#xff1a; 环境类&am…

如何使用iPad通过Code App+cpolar实现公网地址远程访问vscode

&#x1f308;个人主页: Aileen_0v0 &#x1f525;热门专栏: 华为鸿蒙系统学习|计算机网络|数据结构与算法 ​&#x1f4ab;个人格言:“没有罗马,那就自己创造罗马~” 文章目录 1. 在iPad下载Code APP2.安装cpolar内网穿透2.1 cpolar 安装2.2 创建TCP隧道 3. iPad远程vscode4. …

基于多智能体点对点转换的分布式模型预测控制

matlab2020正常运行 基于多智能体点对点转换的分布式模型预测控制资源-CSDN文库

资源三角形

美国哈佛大学的研究小组提出了著名的资源三角形&#xff1a;没有物质&#xff0c;什么也不存在&#xff1b;没有能量&#xff0c;什么也不会发生&#xff1b;没有信息&#xff0c;任何事物都没有意义。物质、能量和信息是相互有区别的&#xff0c;是人类社会赖以生存、发展的三…

7 - MySQL主从同步|主从同步模式

MySQL主从同步&#xff5c;主从同步模式 MySQL主从同步主从同步介绍主从同步工作过程主从同步结构模式配置主从同步一主一从同步结构一主多从同步结构主从从同步结构主主同步结构 主从同步模式主从同步结构模式复制模式 MySQL主从同步 主从同步介绍 存储数据的服务结构 主服务…

数据结构与算法教程,数据结构C语言版教程!(第三部分、栈(Stack)和队列(Queue)详解)五

第三部分、栈(Stack)和队列(Queue)详解 栈和队列&#xff0c;严格意义上来说&#xff0c;也属于线性表&#xff0c;因为它们也都用于存储逻辑关系为 "一对一" 的数据&#xff0c;但由于它们比较特殊&#xff0c;因此将其单独作为一章&#xff0c;做重点讲解。 使用栈…

vscode+opencv基础用法学习1

案例1&#xff1a;读取图片信息 如果是使用云服务器的话&#xff0c;由于图形界面的问题&#xff0c;使用cv::show来显示图片会报错 // 图片的读取和显示 // 导入opencv头文件 #include "opencv2/opencv.hpp" #include <iostream>int main(int argc, char** …

数据仓库 Apache Hive

一、数据分析 1、数据仓库 数据仓库&#xff08;英语&#xff1a;Data Warehouse&#xff0c;简称数仓、DW&#xff09;&#xff0c;是一个用于存储、分析、报告的数据系统。 数据仓库的目的是构建面向分析的集成化数据环境&#xff0c;分析结果为企业提供决策支持&#xff08…

js:使用canvas画一个半圆

背景 需求需要画一个半圆&#xff0c;或者多半圆&#xff0c;其实一下子就能想到 canvas 中的圆弧&#xff0c;核心使用 context.arc context.arc(x,y,r,sAngle,eAngle,counterclockwise)接下来我们看看示例 例一 <!DOCTYPE html> <html lang"en"> &…

机器学习基本算法:算法流程和算法分类

1、算法流程 机器学习的过程是一个完整的项目周期&#xff0c;其中包括数据的采集、数据的特征提取与分类&#xff0c;之后采用何种算法去创建机器学习模型从而获得预测数据。 算法流程 从上图可以看出一个完整的机器学习项目包含以下这些内容&#xff1a; 输入数据&#x…

JAVA毕业设计121—基于Java+Springboot的房屋租赁管理系统(源代码+数据库+9000字文档)

毕设所有选题&#xff1a; https://blog.csdn.net/2303_76227485/article/details/131104075 基于JavaSpringboot的房屋租赁管理系统(源代码数据库9000字文档)121 一、系统介绍 本项目还有ssm版本&#xff0c;分为用户、房东、管理员三种角色 1、用户&#xff1a; 注册、登…

Ubuntu 卸载重装 Nvidia 显卡驱动

问题描述 我使用 airsim 的时候&#xff0c;发现 UE4 没法使用显卡&#xff0c;导致非常卡顿 输入 nvidia-smi 有显卡型号等信息的输出&#xff0c;但是进程 process 里面没有显示 airsim 和其他软件占用显卡情况 因此&#xff0c;我选择了卸载重装 一.卸载旧版本的驱动 …

Komodor:Kubernetes 监控工具全面指南

为了方便起见&#xff0c;Komodor 提供了一个简单的 Web 界面&#xff0c;以帮助您监控 Kubernetes 集群的状态。它拥有付费和免费增值计划&#xff0c;除了在出现问题时通知用户外&#xff0c;还拥有一系列方便的工具&#xff0c;用于跟踪和管理集群中部署的资源的状态。让我们…

Python集合(set)

目录 集合创建集合访问集合向集合中添加和删除元素集合的 交集&#xff0c;并集&#xff0c;差集运算**交集****并集****差集** 集合方法 集合 集合是无序和无索引的集合。在 Python 中&#xff0c;集合用花括号编写。 创建集合 创建集合&#xff1a; thisset {"a"…

RISC-V Bytes: Caller and Callee Saved Registers

原文链接1&#xff1a;https://danielmangum.com/posts/risc-v-bytes-caller-callee-registers/ 原文链接2&#xff1a;https://zhuanlan.zhihu.com/p/77663680 //主要讲栈帧 原文链接3&#xff1a;https://www.jianshu.com/p/b666213cdd8a //主要讲栈帧 This is part of a new…

Ftrans飞驰云联荣获“CSA 2023安全创新奖”

2023年12月21日&#xff0c;第七届云安全联盟大中华区大会在深圳成功举办。会上&#xff0c;CSA大中华区发布了多个研究成果并进行 CSA 2023年度颁奖仪式&#xff0c;Ftrans飞驰云联以其突出的技术创新能力和广泛的市场应用前景&#xff0c;荣获备受瞩目的“CSA 2023安全创新奖…