gazebo 直接获取传感器数据_【ROS-Gazebo】IMU插件使用与数据采集——以四足机器人pigot为例...

最近在琢磨别的事情,Gazebo探索上面进展不大,但也有一些收获,秉承慢慢写的佛系态度记录一下:pigot四足项目的步态改进,前行换成了摆线步态,加入了斜向步态

Gazebo-IMU(惯性测量单元)插件的用法

利用rqt_plot绘制数据验证步态改进的效果

步态改进

简单来说,就是将每一步的足端轨迹规划为一条摆线。摆线轨迹的两端方向垂直于地面,足端与地面在其它方向的冲击力更小,机器人行进更加稳定。摆线

由于我们已经有了四足机器人足端逆解方法,因此规划摆线轨迹没有什么困难。轨迹代码见pig_control功能包的traj_data文件中的forward_gait()函数。详细的参考资料推荐一个:基于力传感器的四足机器人多步态规划及初步维稳控制_百度学术​xueshu.baidu.com

在该文的3.3节中讲到摆线步态以及优化方法。

惯性测量单元(IMU)插件

惯性测量单元是测量物体三轴姿态角(或角速率)以及加速度的装置,在机器人导航中有着很重要的应用[1]。

Gazebo中提供了IMU插件libgazebo_ros_imu_sensor.so,官方教程十分简单。这里介绍基本的使用步骤:

1. 在模型文件中建立一个link用以放置IMU插件

既可以添加一个单独的link代表IMU传感器,图方便也可以直接固连在已有的link中。在pigot中便直接使用机体连杆body_link放置IMU。

2. 在xacro文件中配置IMU

添加如下代码以配置IMU,一般只需修改的值为想要连接IMU的连杆名称即可。

true

true

100

true

__default_topic__

imu

body_link

100.0

0.0

0 0 0

0 0 0

imu_link

0 0 0 0 0 0

对于大型工程,建议单独建立一个xacro文件以配置所有的插件(传感器、控制插件等),再在主文件中引用。pigot项目中的插件配置文件为pigot.gazebo。

3.建立一个订阅者用以接收IMU数据

上述两步完成以后,运行仿真模型时,topic列表中就会出现一个imu话题,不停地有imu消息发送到这个话题上。pigot项目中的话题为/pigot/imu,前缀/pigot来源于机器人运行在单独的命名空间中,在pigot_world.launch中进行设置,设置方式见我的这篇文章。

订阅者代码如下,网络上很容易找到c++的代码,这里用python来写:

#!/usr/bin/env python

# license removed for brevity

import rospy

from sensor_msgs.msg import Imu

import math

def imu_cb(imu_data):

# Read the quaternion of the robot IMU

x = imu_data.orientation.x

y = imu_data.orientation.y

z = imu_data.orientation.z

w = imu_data.orientation.w

# Read the angular velocity of the robot IMU

w_x = imu_data.angular_velocity.x

w_y = imu_data.angular_velocity.y

w_z = imu_data.angular_velocity.z

# Read the linear acceleration of the robot IMU

a_x = imu_data.linear_acceleration.x

a_y = imu_data.linear_acceleration.y

a_z = imu_data.linear_acceleration.z

# Convert Quaternions to Euler-Angles

rpy_angle = [0, 0, 0]

rpy_angle[0] = math.atan2(2 * (w * x + y * z), 1 - 2 * (x**2 + y**2))

rpy_angle[1] = math.asin(2 * (w * y - z * x))

rpy_angle[2] = math.atan2(2 * (w * z + x * y), 1 - 2 * (y**2 + z**2))

return

if __name__ == '__main__':

rospy.init_node('imu_node', anonymous=True)

rospy.Subscriber("/pigot/imu", Imu, imu_cb)

rospy.spin()

需要注意的地方有:

消息类型Imu

from sensor_msgs.msg import Imu

导入一种消息类型Imu,这是一种标准的传感器消息类型,官方文档sensor_msgs/Imu 消息类型中重要部分摘录如下:

geometry_msgs/Quaternion orientation

float64[9] orientation_covariance # Row major about x, y, z axes

geometry_msgs/Vector3 angular_velocity

float64[9] angular_velocity_covariance # Row major about x, y, z axes

geometry_msgs/Vector3 linear_acceleration

float64[9] linear_acceleration_covariance # Row major x, y z

文档描述了Imu的消息结构,其中姿态(orientation)类型为四元数(geometry_msgs/Quaternion);角速度(angular_velocity)和线加速度(linear_acceleration)的类型为三维向量(geometry_msgs/Vector3)。

四元数(Quaternion)转欧拉角(Euler-Angles)

四元数是一种姿态的表达方式,与欧拉角相比,它规避了“万向节锁”的问题。

这篇文章讲解了四元数与欧拉角的相互转换

这个视频形象地介绍了万向节锁的问题

4. 利用rqt_plot绘制数据曲线

rqt_plot是ROS内置的一款用于绘图的可视化插件。它可以读取话题中发布的数据,将类型允许的数据绘制成为图像。在终端中运行以下节点可打开rqt_plot:

rosrun rqt_plot rqt_plot

如果Imu插件启动成功,那么此时的话题列表中就应该有相应的话题了。在Topic栏中输入相应的话题即可进行绘图。注意,根据官方文档说明,绘图需要指定出数值所在的完整的地址,例如想要绘制加速度linear_acceleration,它是imu话题中消息的一个成员,那么应当指明的地址为:

/pigot/imu/linear_accelerationrqt_plot 官方文档​wiki.ros.org

利用rqt_plot验证步态改进的效果

在pigot项目中,改进前的前行步态只是简单指明了轨迹点后进行了线性插值,改进后采用了摆线步态。那么,步态的改进对于改善机器人前行的平稳性究竟有没有好处呢?可以通过rqt_plot采集机器人前行过程中的线性加速度予以验证。

在线性插值的步态下,采集线性加速度图像如下:线性插值步态的加速度

改用摆线步态后,采集线性加速度图像如下:摆线步态的加速度

以上两次实验的步幅、步频、抬腿高度和落脚点均相同,可以看出,采用摆线步态时,落步时的冲击一定程度上减小了。这也说明了摆线步态更具有平稳性。

以上现象也可以直接从动作中观察到:ROS四足机器人步态仿真对比https://www.zhihu.com/video/1101602829063634944

项目地址pigot​github.com

参考文献

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

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

相关文章

c++实现决策树分类汽车评估数据集_R有监督机器学习-分类方法

当我们说机器学习的的时候,我们在说什么?来源于mlr3包的作者:https://mlr3book.mlr-org.com/basics.html上图解释了完整的机器学习流程,包括构建任务、准备训练数据集及测试数据集、选择学习方法(leaner)、…

lingo编程的主要方法_java并发编程 --并发问题的根源及主要解决方法

并发问题的根源在哪首先,我们要知道并发要解决的是什么问题?并发要解决的是单进程情况下硬件资源无法充分利用的问题。而造成这一问题的主要原因是CPU-内存-磁盘三者之间速度差异实在太大。如果将CPU的速度比作火箭的速度,那么内存的速度就像…

bootstrap框架过时了吗_为何前端都不愿意用bootstrap框架

Bootstrap框架属于UI框架,这个和jQuery不太一样,其实准确的描述Bootstrap框架属于css框架而非javascript框架,但是它本身也使用javascript来完善Bootstrap框架的视觉效果。此外,Bootstrap框架十分超前,在支持html5和cs…

go语言mysql框架_超级详细:Go语言框架Gin和Gorm实现一个完整的待办事项微服务...

前言本文通过一步一步的设计,最终实现一个完善的todo应用。我们使用GO框架Gin用户路由控制和返回数据。使用Gorm用于操作数据库。读者可根据本教程操作,最终实现列出的各项功能。技术清单本文中所涉及的技术内容主要有以下几种:Gin&#xff1…

ef mysql 外键 一对一_MySQL 外键 一对一 一对多 多对多 复制

#外键## 1,学习外键首先要明白表与表之间的关系​ 首先要换位思考 在考虑了这边 还要考虑另一边​ 然后在下定论### 判断表关系的语法#### 图书与出版社​ 一本书可不可以有多个出版社 不可以​ 一个出版社可不可以出版多本书 可以​ 这就是一对多关系#### 图书与作者​ 一本书…

Mysql中Drop删除用户的名字_mysql5.5 使用drop删除用户

在说这个问题之前我们先讨论下关于在mysql中删除用户的方法和问题:其实在以前我删除mysql中的账号的时候用delete,一直没注意其实用这个命令删除账号会有一个问题就是使用delete删除账号后,只会清除user表的,在其它表中的信息还是…

docker建多个mysql_《容器化系列二》利用Docker容器化技术安装多个mysql

前提说明安装的Linux系统版本为Centos7.x一、安装docker并测试1、安装yum相关工具包///安装yum相关工具包yum install -y yum-utils device-mapper-persistent-data lvm2//发些报错,关闭刚刚睡眠中的进程kill -9 13312//再次执行yum install -y yum-utils device-ma…

mysql 元数据获取_[MySQL] 获取元数据的步骤

[MySQL] 获取元数据的方法 MySQL提供了以下三种方法用于获取数据库对象的元数据: 1)show语句 2)从INFORMATION_SCHEMA数据库里查询相关表 3)命令行程序,如mysqlshow, mysqldump 用SHOW语句获取元数据 MySQL用show语句获取元数据是最常用的方法&#xff0…

ai如何置入_ai图片(ai怎么把图片嵌入到图形里)

怎样将Ai格式的图片转换成常用的jpg,用什么软件转换?ai后缀的图片是指通过Illustrator(简称ai )软件储存得到的图片格式 这种格式的图片是矢量的,也就是说像freehand,Coredraw那样子的图片可以随意放大但不失真的那种 .在AI中,插入…

在模糊查询中怎样事先加载页面_8种信息类型,中后台产品功能自查清单

产品经理在梳理产品需求文档时需要把每一个功能的逻辑关系、交互方式都整理全面,为了避免疏漏,与开发评审前,建议每位产品都 Check 几遍文档。本文整理了一份中后台产品功能自查清单,供大家参考,如有不全欢迎提建议~中…

mysql 8.0 手动安装教程_mysql 8.0.13手动安装教程

本文为大家分享了mysql 8.0.13手动安装教程,供大家参考,具体内容如下一、步骤解读1.下载MySQL下载地址选择 Downloads-->Community-->MySQL Community Server,然后拉到页面的最低端,点击“下载”。此时一般会提示登陆&#…

gff3转mysql_科学网-把GFF3文件导入MySQL数据库-闫双勇的博文

什么是GFF3?这个一种序列注释文件的格式,基因组注释数据常常会用这种格式来记录序列注释信息,关于这种格式的更多信息,可以在这里学习:http://www.sequenceontology.org/gff3.shtml这里简单说下,怎样把GFF3文件导入My…

mysql时间字段不走索引_MySQL使用=或=范围查询时不走索引

2020-02-27最近一个日志页面查询很慢,然后去跟踪了查询sql,发现日期字段上即使建了索引,查询还是很慢,执行语句还是使用了全表扫描,于是继续分析下去。查询语句类似:select * from logs where createtime > 2020-01…

php mysql关键技术_中高级PHP开发者应该掌握哪些技术?

1.Linux能够流畅的使用Shell脚本来完成很多自动化的工作;awk/sed/perl 也操作的不错,能够完成很多文本处理和数据统计等工作;基本能够安装大 部分非特殊的Linux程序(包括各种库、包、第三方依赖等等,比如MongoDB/Redis/Sphinx/Lun…

python 简单socket_Python 简单socket

OSI七层模型(Open System Interconnection,开放式系统互联)应用层表示层回话层传输层 tcp,udp网络层 ip,icmp数据链路层 mac地址物理层 物理网卡服务端:import socket#实例化,绑定,监听,等待,解构(标识,ip-…

wxpython有哪些基本功能_用Python中的wxPython实现最基本的浏览器功能

通常,大多数应用程序通过保持 HTML 简单来解决大多数浏览器问题 ― 或者说,根据最低共同特性来编写。然而,即便如此,也仍然存在字体和布局的问题,发行新浏览器和升级现有浏览器时,也免不了测试应用程序的痛…

python增删改查mysql_python对数据库mysql的操作(增删改查)

#codingutf-8import pymysql# #查询# def connMySQL():# try:# connpymysql.connect(‘localhost‘,‘root‘,‘admin‘)# conn.select_db(‘five‘)# except Exception as e:# return e.args# else:# curconn.cursor()# cur.execute("select * from users")# datacu…

指数函数中x的取值范围_指数函数x的取值范围是

1、指数函数x的取值范围是a>0且a不1;2、指数函数是重要的基本初等函数之一。一般地,yax函数(a为常数且以a>0,a≠1)叫做指数函数,函数的定义域是 R ;3、,在指数函数的定义表达式中,在ax前的…

java创建response对象_创建一个HttpResponse对象

创建一个HttpResponse对象HttpResponse类实现了javax.servlet.http.HttpServletResponse。跟随它的是一个叫做 HttpResponseFacade的faade类。Figure 3.3显示了HttpResponse类和它的相关类的UML图。在第2章中,你使用的是一个部分实现的HttpResponse类。例如&#xf…

java编译机制_java的编译机制

我们通常写的文件都是java文件,最后要在JVM上运行则需要将java文件编译成class(二进制文件).各厂商在实现JDK时通常会符合java语言规范的源码编译为class文件的编译器.编译器的好坏很大程度上决定了最后程序在机器上执行效率.通常使用Sun JDK(javac).javac将java源码编译成clas…