rospy Odometry天坑小计

article/2025/7/21 18:18:30

rospy Odometry天坑小计

在使用 python 自己搭建 ros 控制小车的上位机接口时,遇到了一个非常奇怪的问题,发布里程计的时候,一旦里程计得到订阅,发布者就会报 ndarray 属性找不到错误,乍一看着实让人脑瓜疼,明明处理的是四元数,为什么会和 n u m p y numpy numpy扯上关系。百度和 C S D N CSDN CSDN上并没有找到相关问题的记录,有人发出来的示例也都没有处理这个问题。这里记录一下,既是笔记,也是警示自己,处理这些情况的时候一定不能先入为主,还是得谨慎思考。

首先上图,报错截图如下,充满迷惑:
在这里插入图片描述

引发这个错误的源代码如下:

odom = nav_msgs.msg.Odometry()
odom.header.stamp = self.last_t
odom.header.frame_id = "odom"
odom.pose.pose.position.x = self.x
odom.pose.pose.position.y = self.y
odom.pose.pose.position.z = 0.
odom.pose.pose.orientation = odom_q
odom.child_frame_id = 'base_link'
odom.twist.twist.linear.x = self.vx
odom.twist.twist.linear.y = self.vy
odom.twist.twist.linear.z = 0.
odom.twist.twist.angular.z = self.w
print(odom)
self.odom_pub.publish(odom)

错误出现的第一时间翻阅了 Odometry 源码,并没有发现什么问题,CSDN 上也没有发现类似的情况。最终谷歌找到ROS问答社区发现问题,这里这个兄弟也遭遇了同样的情况。

问题出在上述代码第7行,其中 odom.pose.pose.orientation 是一个标准的四元数类型,而 odom_q 却是一个 numpy 的数组,因此在消息内部处理的时候遭遇该错误。

而这个 odom_q 是来自于下面这样一行变换,这句的作用是通过欧拉角得到四元数,但是这个函数有点反人类,它返回的四元数使用 ndarray 表示的,而不是标准的四元数,这于 C + + C++ C++中的完全不一样,从 C + + C++ C++转过来轻易不会注意到这个问题。

odom_q = tf.transformations.quaternion_from_euler(0, 0, self.thelta)

(也不知道作者和管理者是怎么想的,这也太坑了)

找到问题之后,问题就好办了,正确的写法如下:

odom.pose.pose.orientation.x = odom_q[0]
odom.pose.pose.orientation.y = odom_q[1]
odom.pose.pose.orientation.z = odom_q[2]
odom.pose.pose.orientation.w = odom_q[3]

至此,问题都得到解决。

参考文章:Error assigning a python quaternion - ROS Answers: Open Source Q&A Forum


http://chatgpt.dhexx.cn/article/m0NFicIP.shtml

相关文章

Tightly Coupled LiDAR Inertial Odometry and Mapping源码解析(一)

Tightly Coupled LiDAR Inertial Odometry and Mapping源码解析(一) 1. LiDAR inertial odometry and mapping简介2. Tightly coupled LiDAR inertial odometry2.1 LiDAR-IMU odometry overview2.2 IMU and pre-integration2.3 De-skewing and feature e…

SLAM——入门到放弃:ROS里程计(odometry)

ROS gmapping导航包,要求有2 个 输入,一个是激光数据,另一个就是里程计信息。 里程计又包含2 个方面的信息: 位姿(位置和转角),即(x,y,θ)是速度(前进速度和…

Ros Odometry获取机器人位置-python 代码打印

纪念一下,辛苦了一天多,终于找出来了,经过网上的资料反向推出结构。 博主需要通过机器人的实时位置来进行计算。从网上查阅得知nav_msgs/Odometry消息中存储机器人的位置和速度估计等。 下面展示一下操作流程: 1.首先通过 ros…

ROS里程计消息nav_msgs/Odometry的可视化方法

ROS中里程计的消息类型为nav_msgs/Odometry,该消息类型具有以下结构: 可以看到,里程计消息中的pose包含了位置pose.position和姿态pose.orientation 在ROS中,有一种常用消息类型为nav_msgs/Path,可视化的方法为&#…

基于rf2o_laser_odometry纯激光里程计的gmapping建图

ROS环境:ubuntu16.04 & ROS kinetic激光雷达:EAI-X4 or RPlidar-A1激光里程计:rf2o_laser_odometry建图:gmapping 对于很多刚入门的同学,购买一台带有高精度轮式里程计的ROS小车经济上往往不允许。但是大多数同学…

nav_msgs/Odometry消息的发布和tf变换

一。ROS使用tf来决定机器人的位置和静态地图中的传感器数据,但是tf中没有机器人的速度信息,所以导航功能包要求机器人 能够通过里程计信息源发布包含速度信息的里程计nav_msgs/Odometry 消息。 本篇将介绍nav_msgs/Odometry消息,并且通过代码…

【视觉SLAM】DM-VIO: Delayed Marginalization Visual-Inertial Odometry

L. v. Stumberg and D. Cremers, “DM-VIO: Delayed Marginalization Visual-Inertial Odometry,” in IEEE Robotics and Automation Letters, vol. 7, no. 2, pp. 1408-1415, April 2022, doi: 10.1109/LRA.2021.3140129. 论文阅读方法:Title,Abstract…

DSO(Direct Sparse Odometry)

DSO(Direct Sparse Odometry) 文章目录 1. 简述2. 概述3. 框架流程3.1 代码框架与数据表示3.2 VO流程 4. DSO详细介绍4.1 残差的构成与雅可比4.2 滑动窗口的维护与边缘化4.3 零空间,FEJ4.4 其他零散的模块和算法 5. 光度标定6. 评述7. 资料与…

SVO(SVO: fast semi-direct monocular visual odometry)

SVO2系列之深度滤波DepthFiltersvo_noteSVO(SVO: fast semi-direct monocular visual odometry)SVO 半直接视觉里程计【DepthFilter】深度滤波器【svopro】代码梳理 SVO(SVO: fast semi-direct monocular visual odometry)翻译 1、…

航迹推演

​ 做机器人底层程序的时候,经常用到航迹推演(Odometry),无论是定位导航还是普通的方向控制。航迹推演中除了对机器人位姿进行估计,另一个很重要的关系是移动机器人前进速度、转向角速度与左轮速度、右轮速度之间的转换…

航迹推演(Odometry)

做机器人底层程序的时候,经常用到航迹推演(Odometry),无论是定位导航还是普通的方向控制。航迹推演中除了对机器人位姿进行估计,另一个很重要的关系是移动机器人前进速度、转向角速度与左轮速度、右轮速度之间的转换。…

大数据基础编程+实验

本文仅用于分析和记录在校期间学习大数据分析课程的一点心得体会。 1、Ubuntu系统的安装和使用 本文采用Ubuntu16.04系统,安装系统省略,选择镜像后一直点击下一步 1.1 进入系统后,调整输入法,将输入法切换至中英文切换 1.2为…

Python数据库编程pymysql

Python数据库编程pymysql 一、数据库编程介绍 数据库编程就是针对数据库的操作,通过编写程序的方式,让程序做为数据库的客户端进行数据库操作。 对于MySQL的操作我们可以通过SQL语句,但是有很多情况下我们需要写入MySQL的数据非常多&#…

过程化SQL数据库编程

一、过程化SQL的块结构 基本的SQL是高度非过程化的语言。嵌入式SQL将SQL语句嵌入程序设计语言,借助高级语言的控制功能实现过程化。过程化SQL是对SQL的扩展,使其增加了过程化语句功能。 过程化SQL程序的基本结构是块。所有的过程化SQL程序都是由块组成的…

Java的数据库编程:JDBC

目录 一、JDBC是什么? 二、使用步骤 1.首先将JDBC的包引进java中 2.创建新的类来写代码 3.描述你的服务器 4.设置你的数据库地址,数据库用户名,数据库密码 5.连接数据库 6.书写你所要执行的SQL语句 7.把字符串风格的sql转化成一个对象 8.执行语句 9.回收资…

Python数据库编程

操作SQLite3数据库 从Python3.x版本开始,在标准库中已经内置了SQLlite3模块,它可以支持SQLite3数据库的访问和相关的数据库操作。在需要操作SQLite3数据库数据时,只须在程序中导入SQLite3模块即可。Python语言操作SQLite3数据库的基本流程如…

实验7 数据库编程

第1关 定义一个名为PROC_COUNT的无参数存储过程 任务描述 定义一个名为PROC_COUNT的无参数存储过程,查询工程名称中含有“厂”字的工程数量,并调用该存储过程。 相关知识 1、工程项目表J由工程项目代码(JNO)、工程项目名(JNAME)、工程项目所在城市(CITY)…

C++数据库编程简介

C数据库编程简介 C数据库编程 ODBC简介 C数据库编程 ODBC连接SQL Server数据库 C数据库编程 ODBC插入数据 C数据库编程 ODBC查询数据 C数据库编程 ODBC删除数据 C数据库编程 ODBC修改数据 C数据库编程 ODBC连接MySQL增删改查数据 C数据库编程 MySQL Connecttor C简介 …

游戏设计模式——面向数据编程(转)

作者:KillerAery 出处:http://www.cnblogs.com/KillerAery/ 随着软件需求的日益复杂发展,远古时期面的向过程编程思想才渐渐萌生了面向对象编程思想。 当人们发现面向对象在应对高层软件的种种好处时,越来越沉醉于面向对象&…

数据科学必备Python编程基础

前言 对于Python复杂的编程语言中提取了数据分析常用的数据处理以及数据可视化等数据分析师常用的内容,区别与其他的Python编程教程,如果是纯开发的小伙伴,看完本系列的文章仅仅只能掌握数据相关处理的内容,并不能完全掌握开发方…