ROS中发布里程计消息(Odometry)

2023-05-16

目录

    • 1.首先理解里程计是什么?
    • 2.里程计发布流程
    • 3.发布里程计TF变换
      • 2.1c++发布TF变换
      • 2.2 python发布TF变换

根据阿克曼转向结构的车辆实现里程计消息的发布,本文参考博客如下,

古月居: https://www.guyuehome.com/332
ROS WiKi:http://wiki.ros.org/cn/navigation/Tutorials/RobotSetup/Odom

1.首先理解里程计是什么?

在ROS中,里程计消息保存了机器人空间里评估的位置速度信息。它首先是一个坐标系的变化,表示的是从Odom坐标系到base_link的坐标变化关系。其次里程计信息中含有车辆的速度信息,可以用于其他用途。里程计的坐标系原点,笔者理解为程序启动后,起始时刻的位置信息,在车辆运动后,位置和速度会发生变化,其中的TF变换关系就是当前时刻位置与起始时刻位置三维变换。要完成里程计的发布,首先应发布base_link(车辆基座标系)到里程计坐标系的TF变化。其次,发布odom信息,包含车辆的速度信息。(如有错误,请留言指正)

2.里程计发布流程

获取base_link相对于Odom的平移和旋转关系
初始化话题的TF发布者
发布Odom到base_link的TF变换
发布Odom话题

1.对TF变换以及Odom话题初始化发布者
2.获取base_link相对于Odom坐标系的位置和旋转关系
3.发布从Odom到base_link坐标的TF变换,可参考本人另一篇博客:ROS中TF变换详解
4.发布Odom话题

3.发布里程计TF变换

在本节中,编写示例代码,用于在ROS上发布nav_msgs/Odometry消息,程序由C++和python两种语言书写

2.1c++发布TF变换

在编写程序之前,需要在package.xml文件中添加依赖信息,如下:

<depend package="tf"/>
<depend package="nav_msgs"/>

2.2 python发布TF变换

首先导入库函数

from nav_msgs.msg import Odometry
from geometry_msgs.msg import TransformStamped
import tf2_ros
import tf_conversions

初始化节点等信息

	mpu = JY901()  # 初始化IMU
    rospy.init_node("IMU_pub")  # 初始化节点
    pub = rospy.Publisher("IMU", Imu, queue_size=100)  #IMU话题发布者
    odom_pub = rospy.Publisher("odom", Odometry, queue_size=100)  # 里程计话题发布者
    rate = rospy.Rate(100)  # 发送速度
    send_data = Imu()  # 要发送IMU数据
    send_Od_data = Odometry() #  要发送的Odom数据
    br = tf2_ros.TransformBroadcaster()  # 定义TF变换广播者
    trans = TransformStamped()  # 定义广播者要广播的数据类型
    x_base_link = 0
    y_base_link = 0
    z_base_link = 0
    Vx = 0
    Vy = 0
    Vz = 0
    time_now = rospy.Time.now().to_sec()
    print("start******")

思路:每次读取IMU,记录读取时间间隔。根据以及读取到的IMU数据计算出测量间隙之间的位移量,即可求得base_link相对于Odom的位移。JY901带有磁力计,通过IIC读取偏航角,转换为弧度,计算出base_link与Odom之间的旋转关系,最后用tf工具转换为欧拉角,发布TF变换和Odom话题

	Q0 = mpu.read_Q0()
	Q1 = mpu.read_Q1()
	Q2 = mpu.read_Q2()
	Q3 = mpu.read_Q3() # 从IMU读取转换好的四元数
	vx = mpu.read_velocity_x()
	vy = mpu.read_velocity_y()
	vz = mpu.read_velocity_z()  # 读取base_link三轴的角速度
	ax = mpu.read_acceleration_x()
	ay = mpu.read_acceleration_y()
	az = mpu.read_acceleration_z()  # 读取base_link三轴的加速度信息
	# data = mpu.read_yaw()  # 读取base_link的偏航角(与正东方向夹角)
	# 添加msgs的head数据

	# 发布IMU话题
	send_data.header.stamp = rospy.Time.now()
	send_data.header.frame_id = "base_link"
	# 添加四元数
	send_data.orientation.x = Q0
	send_data.orientation.y = Q1
	send_data.orientation.z = Q2
	send_data.orientation.w = Q3
	# 添加angular_velocity 角速度
	send_data.angular_velocity.x = vx
	send_data.angular_velocity.y = vy
	send_data.angular_velocity.z = vz
	# # 添加linear_acceleration
	send_data.linear_acceleration.x = ax
	send_data.linear_acceleration.y = ay
	send_data.linear_acceleration.z = az - 9.8
	# publish topic
	pub.publish(send_data)
	
	
	# 发布TF变换
	time_last = time_now
	time_now = rospy.Time.now().to_sec()
	delta_t = time_now - time_last  # 计算时间间隔
	delta_x = vx*delta_t
	delta_y = vy*delta_t
	delta_z = vz*delta_t
	
	Vx = Vx + ax*delta_t
	Vy = Vy + ay*delta_t
	Vz = Vz + az*delta_t
	delta_x = 0.5*Vx*delta_t
	delta_y = 0.5*Vy*delta_t
	delta_z = 0.5*Vz*delta_t
	# TF transform  odom->base_link
	trans.header.stamp = rospy.Time.now()
	trans.header.frame_id = "odom"
	trans.child_frame_id = "base_link"
	trans.transform.translation.x = x_base_link
	trans.transform.translation.y = y_base_link
	trans.transform.translation.z = z_base_link
	# 从偏航角解算出对应的四元数,只考虑平面运动
	q = tf_conversions.transformations.quaternion_from_euler(0, 0, mpu.read_yaw()*pi/180.0)
	trans.transform.rotation.x = q[0]
	trans.transform.rotation.x = q[1]
	trans.transform.rotation.x = q[2]
	trans.transform.rotation.x = q[3]
	br.sendTransform(trans)
	# 发布里程计信息
	send_Od_data.header.frame_id = "odom"
	send_Od_data.header.stamp = rospy.Time.now()
	send_Od_data.child_frame_id = "base_link"
	
	send_Od_data.pose.pose.position.x = x_base_link
	send_Od_data.pose.pose.position.y = y_base_link
	send_Od_data.pose.pose.position.z = z_base_link
	
	send_Od_data.twist.twist.angular.x = vx
	send_Od_data.twist.twist.angular.y = vy
	send_Od_data.twist.twist.angular.z = vz
	odom_pub.publish(send_Od_data)
	
	rate.sleep()

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ROS中发布里程计消息(Odometry) 的相关文章

  • ROS之QtCreator开发环境搭建

    文章目录 系统环境 官方教程 安装 卸载 使用 导入工作空间 构建与运行 编写测试程序 系统环境 操作系统 Ubuntu20 04 ROS版本 Noetic 官方教程 按照官方教程或者下面笔记中的内容均能进行环境搭建 笔记中另外做了部分补充
  • 无人驾驶论坛

    1 百度Apollo论坛 http www 51apollo com 2 人工智能中文资讯网 http www ailab cn
  • V-REP安装

    小知识 是当前目录 是父级目录 是根目录 1 下载V REP 官网地址 http www v rep eu downloads html 我用ubuntu16 04下载V REP PRO EDU V3 5 0 Linux tar 2 解压安
  • 1-如何安装ROS

    如何安装ROS 大家好 我是如何 今天尝试在Ubantu下安装ROS Robot Operating System 测试环境 虚拟机VMware Ubantu20 04 准备步骤 添加ROS软件源 sudo sh c echo deb ht
  • 线速度和角速度

    转自 https baike baidu com item E7 BA BF E9 80 9F E5 BA A6 1532652 fr aladdin https baike baidu com item E8 A7 92 E9 80 9F
  • Ubuntu16.04安装ROS Kinetic详细步骤

    文章目录 ROS安装 配置Ubuntu软件仓库 设置sources list 设置密钥 更新Debian软件包索引 安装ROS 初始化 rosdep 环境配置 构建工厂依赖 测试安装 开发环境 ROS安装 ROS Kinetic只支持Wil
  • ModuleNotFoundError: No module named ‘rosbag‘

    1 ModuleNotFoundError No module named rosbag File opt ros kinetic lib python2 7 dist packages roslib launcher py line 42
  • ROS rosdep update 出错方法 不需要翻墙切换之类的解决方法 ‘https://raw.githubusercontent.com/ros/rosdistro/master/inde

    系统 ubuntu18 rosdep update参考的这篇文章 https blog csdn net weixin 43311920 article details 114796748 utm source app app versio
  • 在Ubuntu 14.04.2 LTS上安装Qt

    Qt是一个跨平台的应用程序框架 广泛用于开发具有GUI界面的应用软件以及命令行工具 几乎所有操作系统都可以使用Qt 如Windows Mac OS X Android等 用于开发Qt应用程序的主要编程语言是C 但是可以使用诸如Python
  • 树莓派配置wifi做热点方法

    http wiki jikexueyuan com project raspberry pi wifi html
  • 服务数据的定义和使用

    1 自定义数据服务 在包下创建srv文件夹 在文件夹下创建Person srv 在Person srv下输入以下内容 代表数据类型 string name uint8 age uint8 sex uint8 unknown 0 uint8
  • (ros/qt报错) FATAL: ROS_MASTER_URI is not defined in the environment

    安装qt之后 明明打开roscore但是qt运行跟ros有关的节点时报错 FATAL 1450943695 306401842 ROS MASTER URI is not defined in the environment Either
  • roslaunch error: ERROR: cannot launch node of type

    今天在因为github上有个之前的包更新了 重新git clone后出现了一个问题 ERROR cannot launch node of type crazyflie demo controller py can t locate nod
  • 可视化点云

    我在找到的视差图像上有来自 gpu reprojectImageTo3D 的 3D 点 我现在想显示这个点云 如何将找到的点云转换为OpenCV to sensor msgs PointCloud2 我不需要发布点云 这仅用于调试可视化 是
  • 什么是 void `std::allocator`?即:`std::allocator`

    自动生成ROS 机器人操作系统 message C 头文件包含如下类型定义 typedef std msgs Header
  • 如何将曲面拟合到一组数据点并获得曲面方程

    乌班图 ROS 思维 Python程序 我正在尝试获取适合点云数据中的一组点的表面方程 数据来自激光雷达扫描仪 我在 rviz 中选择整个扫描的一部分 并获得该选择的坐标选定表面的图片 所选曲面并不总是如此线性 因为材质中可能存在轻微的曲线
  • 无法在 ROS 中使用本地安装的 Protocol Buffer

    我已经安装了协议缓冲区 https developers google com protocol buffers 本地 ROS包的目录结构如下 CMakeLists txt package xml include addressbook p
  • Caught exception in launch(see debug for traceback)

    Caught exception in launch see debug for traceback Caught exception when trying to load file of format xml Caught except
  • 在 Ubuntu 18.10 上安装 ROS Melodic

    I can t是唯一对 Cosmic 与 Wayland 和 Melodic 的组合感兴趣的人 我会坦白说 我似乎已经在 XPS 13 9370 上成功管理了此操作 或者至少安装脚本 最终 成功完成 然而 有一个非常棘手的解决方法 无论结果
  • ROS 从 python 节点发布数组

    我是 ros python 的新手 我正在尝试从 python ros 节点发布一个一维数组 我使用 Int32MultiArray 但我无法理解多数组中布局的概念 谁能给我解释一下吗 或者还有其他方式发布数组吗 Thanks usr bi

随机推荐

  • 总结:单独标定IMU的工具包(kalibr_allan,imu_tk,imu_utils)

    目录 一 常用开源IMU标定工具包汇总 kalibr allan imu tk imu utils imu tk与imu utils的区别 二 使用kalibr allan计算imu误差 参考 xff1a 下载 xff1a 安装 xff1a
  • git使用总结

    Git使用总结 1 本地更新代码前忘记拉取 pull 最新代码 本地对代码进行了修改 xff0c 但是忘记拉取最新版本的代码 这时想要拉最新的代码时 xff0c git pull origin branch name xff0c 会提示你
  • matlab中im2bw函数的用法

    matlab中DIP工具箱函数im2bw使用阈值 xff08 threshold xff09 变换法把灰度图像 xff08 grayscale image xff09 转换成二值图像 所谓二值图像 xff0c 一般意义上是指只有纯黑 xff
  • 最优化方法总结:公式解、数值优化、求解思想

    机器学习的目标是给出一个模型 xff08 一般是映射函数 xff09 xff0c 然后定义对这个模型好坏的评价函数 xff08 目标函数 xff09 xff0c 求解目标函数的极大值或者极小值 xff0c 以确定模型的参数 xff0c 从而
  • AGV小车基础知识介绍

    AGV基础知识 一 AGV的基本概念二 AGV的基本结构硬件组成软件组成1 硬件结构2 单机结构3 主要类型4 主要引导方式介绍5 驱动方式介绍6 AGV的移载方式 三 AGV的控制系统1 AGV控制系统2 AGV安全系统3 激光导航控制系
  • ardupilot & PX4 RTK配置指南

    ardupilot amp PX4 RTK配置指南 随着无人机对于高精度位置需求越来越强烈 xff0c 同时也伴随着北斗三代导航系统正式服务全球 xff0c 国产的实时载波相位差分 xff08 RTK xff09 导航产品也正在以更优惠 更
  • 无人机ADS-B模块 (兼容Px4、ardupilot、极致飞控)拒绝黑飞,耗子尾汁!

    近年来 xff0c 无人机等低空飞行器成为很多玩家的新 玩具 xff0c 但是绝大多数飞行器都属于 黑飞 xff0c 就是没有民航管理部门的适航许可 也没有相关部门颁发的驾驶执照的 2018年2月7日 xff0c 河北省唐山市古冶区公安分局
  • RK3308 蓝牙接口测试

    BT相关接口 deviceio test bluetooth bt server open 蓝牙测试初始化 xff0c 执行蓝牙测试前 xff0c 先调用该接口 BLE的接收和数据请求回调函数的注册 注 xff1a BLE读数据是通过注册回
  • 无人机高精度导航系统GT08N——支持RTK、PPK 、双天线测向

    最近几年无人机市场可以说的上是非常火爆的 xff0c 无人机公司也是数不胜数 无人机的应用场合也是非常之多的 xff0c 农业 物流 安防 巡航 测绘 航拍等等都得到了非常好的应用 同时无人机市场也催生了许多的配套设备的发展 RTK xff
  • FreeRTOS操作系统如何设置的PendSV和SysTick优先级

    首先应该明确PendSV和SysTick的优先级应该设置为最低 xff0c 具体原因参见这一篇博客 PendSV功能 xff0c 为什么需要PendSV 设置优先级在函数port c中的xPortStartScheduler 函数中实现的
  • 自平衡小车控制(stc12+mpu6050程序)

    自平衡小车控制 xff08 stc12 43 mpu6050程序 xff09 两轮自平衡车最终版控制程序 xff08 6轴MPU6050 43 互补滤波 43 PWM电机 xff09 单片机STC12C5A60S2 晶振 xff1a 20M
  • 深度学习常见名词概念:Sota、Benchmark、Baseline、端到端模型、迁移学习等的定义

    深度学习 xff1a Sota的定义 Sota非端到端模型端到端模型Benchmark Baseline并发 并行 串行迁移学习微调进程 线程监督学习非监督学习半监督学习泛化 xff08 Generalization xff09 正则化 x
  • VINS 系统总结

  • VIO算法总结(一)

    所谓VIO xff08 visual inertial odometry xff09 就是视觉传感器 xff08 camera xff09 43 IMU xff08 inertial measurement unit xff09 一起来做自
  • 西门子1200、1500 PLC中如何将寄存器(M,D,DB)值存入到结构体变量中

    如果将MD100 QD100的值存入到结构体中 xff0c 直接存储过去是存不了的 解决方法是 xff1a 1 建立一个COPY块 xff0c 为FB FC型均可 将寄存器的值或结构体的值序列化 建立出来的库 xff0c 具体作用是结构体
  • windows下clion配置cmake

    1 Cmake安装 cmake官方链接 进入cmake官网下载cmake xff0c 然后一路next xff0c 傻瓜式安装 2 MinGW安装 MinGW官网安装 xff0c 或者去其他论坛找资源 然后打开桌面的快捷方式 xff0c 没
  • ubuntu18.04 安装 roboware-studio

    RoboWare Studio是一个ROS集成开发环境 与ROS匹配性比起其他IDE更好 xff0c 可以用它开发 ROS更加简单 并且在官网ros wiki中有详细的使用教程 本文主要是在Ubuntu18 04中安装RoboWare St
  • 烧录工具Android Tool的使用

    RK3308 该工具是RK的开发工具 xff0c 用于烧录用的 xff0c 不同型号的芯片对应的Android Tool中的下载镜像界面也不一样 xff0c 你像RK3308编出来的烧录文件有如下 xff1a 对应的Android Tool
  • Jetson nano i2c教程(MPU6050 + PCA9685)

    首先介绍nano板子上的i2c相关的硬件信息 xff1a 安装所需要的i2c库 sudo apt get install l y i2c tools 完成nano中io与i2c设备的硬件接线 本次案例使用的是PCA9685和MPU6050
  • ROS中发布里程计消息(Odometry)

    目录 1 首先理解里程计是什么 xff1f 2 里程计发布流程3 发布里程计TF变换2 1c 43 43 发布TF变换2 2 python发布TF变换 根据阿克曼转向结构的车辆实现里程计消息的发布 xff0c 本文参考博客如下 xff0c