如何给定两个gps坐标 算出航向角_机器人开发如何配置ROS中的TF变换关系?
当我们进行机器人开发时,常常需要面对TF坐标转换,本文以 Autolabor Pro1 与思岚激光雷达为例,介绍ROS TF的使用。
Autolabor Pro1是什么?
Autolabor Pro1是一款室内外通用机器人移动底盘。
该平台上可集成激光雷达、摄像头、GPS等传感器,云台、机械臂、抓持器等附件设备,基于平台可实现SLAM、自主路径规划导航、障碍物避障等功能,适用于巡检、抓取、智能驾驶、协同控制、计算机视觉、深度学习等技术的研究与应用。提供底层驱动和基于ROS平台的API接口,精准的PID控制与运动模型,方便硬件集成和二次开发。
详细了解 | Autolabor Pro1
TF是什么?
tf介绍wiki.ros.org
tf is a package that lets the user keep track of multiple coordinate frames over time. tf maintains the relationship between coordinate frames in a tree structure buffered in time, and lets the user transform points, vectors, etc between any two coordinate frames at any desired point in time.
简单来说是将坐标系与坐标系连接起来,使用tf树定义不同坐标系之间的平移与旋转变换关系,并且持续追踪多个坐标系内的变化情况。
为什么需要坐标变换?
在ROS中定义了许多坐标系,有机器人坐标系(base_link),有雷达坐标系(base_laser),地图坐标系(map),里程计坐标系(odom)等。
以机器人中心为原点的坐标系,称为base_link坐标系,以激光雷达中心为原点的坐标系,称为base_laser坐标系。
以下图机器人与激光雷达为例
假设在机器人运行过程中,激光雷达可以采集到距离前方障碍物的数据,这些数据当然是以激光雷达为原点的测量值,换句话说,也就是base_laser参考系下的测量值。
现在,如果我们想使用这些数据帮助机器人完成避障功能,当然,由于激光雷达在机器人之上,直接使用这些数据不会产生太大的问题,但是激光雷达并不在机器人的中心之上,在极度要求较高的系统中,会始终存在一个雷达与机器人中心的偏差值。
这个时候,如果我们采用一种坐标变换,将激光数据从base_laser参考系变换到base_link参考下,问题不就解决了么。这里我们就需要定义这两个坐标系之间的变换关系。
下面以思岚激光雷达为例,讲解Autolabor Pro1与激光雷达的tf坐标变换。
补充知识:ROS坐标系
在ROS中,坐标轴规定可以参考 ROS-REP 103 ,坐标系可以参考 ROS-REP 105,常规用来表示三维位置关系时,使用的是右手坐标系,对于一个三维空间里面的旋转,可以分解成绕着坐标轴的旋转,旋转的方向使用右手法则定义。
右手坐标系定义
把右手放在原点的位置,使大姆指,食指和中指互成直角,把 大姆指 指向 Z轴 的正方向,食指指向X轴的正方向时向时,中指所指的方向就是 Y轴 的正方向
通常相对于我们的身体而言
- X -> 朝前
- Y -> 朝左
- Z -> 朝上
绕坐标轴旋转定义 用右手握住坐标轴,大拇指 的方向朝着坐标轴朝向的正方向,四指环绕的方向定义沿着这个坐标轴旋转的正方向
一般来说
- 绕 Z轴 旋转,称之为 航向角,使用yaw表示;
- 绕 X轴 旋转,称之为 横滚角,使用roll表示;
- 绕 Y轴 旋转,称之为 俯仰角,使用pitch表示;
我们通常用来表述小车运动的二维平面指的是 X-Y平面,也就是X轴和Y轴张成的平面,在这个平面中,用来描述 小车转弯的角就是绕Z轴的旋转,也就是经常说的航向角。Z轴朝上,所以按照右手法则可以知道小车向 左转为正,右转为负。
详细了解 | ROS坐标转换讲解 | Autolabor Simulation
Autolabor Pro1 base_link坐标系
以机器人四轮接触面为X-Y平面,四轮轴心连线的点做垂线,与x-y平面的交点为base_link坐标系原点,车头朝向方向为X轴,正左方向为Y轴,向上为Z轴。
以思岚激光雷达为例,我们一般在安装时都习惯将雷达不带线的一端朝车头方向,雷达USB端的朝车尾方向(如下图)。
思岚激光雷达base_laser坐标系
雷达正中心为坐标原点,USB端的方向为X轴正方向,正左方向为Y轴,向上为Z轴。
测量雷达中心相对机器人坐标原点(0,0,0)的距离,得到雷达在机器人坐标系中(x:0.1,y:0.0,z:0.2)(ROS中长度单位为米/m)。
前面我们提到,思岚雷达的X轴正方向与机器人的X轴正方向为相反方向,雷达坐标系需要绕Z轴顺时针旋转180度才能与机器人base_link坐标系重合 ,旋转(yaw:3.14,roll:0,pitch:0)(ROS中角度单位为弧度/rad)。
根据这些数据,当我们获取激光数据后,采用(x: 0.1m, y: 0.0m, z: 0.2m, yaw:3.14, roll:0, pitch:0)的坐标变换,就可以将数据从base_laser参考系变换到base_link参考系,这就定义出了两个参考系之间的变换关系。
从上边的示例看来,参考系之间的坐标变换好像并不复杂,但是在复杂的系统中,存在的参 考系可能远远大于两个,如果我们都使用这种手动的方式进行变换,估计很快你就会被繁杂的坐标关系搞蒙了。
ROS提供的tf变换就是为解决这个问题而生的,tf功能包提供了存储、计算不同数据在不同参考系之间变换的功能,我们只需要告诉tf树这些参考系之间的变换公式即可,这颗tf树就可以通过树的数据结构,管理我们所需要的参考系变换。
为了定义和存储base_link和base_laser两个参考系之间的关系,我们需要将他们添加到tf树中。从树的概念上来讲,tf树中的每个节点都对应一个参考系,而节点之间的边对应于参考系之间的变换关系。tf就是使用这样的树结构,保证每两个参考系之间只有一种遍历方式,而且所有变换关系,都是母节点到子节点的变换。
为了定义参考系,我们需要定义两个节点,一个对应于base_link参考系,一个对应于base_laser参考系。为了创建两个节点之间的边,我们首先需要决定哪一个节点作为母节点,哪一个节点作为子节点,这一点在tf树中是非常重要的。这里我们选择base_link作为母节点,这样会方便后边为机器人添加更多的传感器作为子节点。
详细了解 | TF坐标变换的学习
所以,从base_link节点到base_laser节点的变换关系为(x: 0.1m, y: 0.0m, z: 0.2m, yaw:3.14, roll:0, pitch:0),设置完毕后,我们就可以通过调用tf库,完成base_laser参考系到base_link参考系的数据坐标变换了。
如何发布tf变换关系
static_transform_publisher介绍wiki.ros.org
static_transform_publisher is designed both as a command-line tool for manual use, as well as for use within roslaunch files for setting static transforms.
我们最常使用的是tf包中的static_transform_publisher,它即可在命令行直接运行,也可写在launch文件中配置坐标转换关系。
Publish a static coordinate transform to tf using an x/y/z offset in meters and yaw/pitch/roll in radians. (yaw is rotation about Z, pitch is rotation about Y, and roll is rotation about X). The period, in milliseconds, specifies how often to send a transform. 100ms (10hz) is a good value.
使用示例:
<node pkg="tf" type="static_transform_publisher" name="base_link_to_laser" args="0.065 0.0 0.245 1.57 0.0 0.0 /base_link /lidar 50" />
这是我们最常看到的使用方法,写在launch文件中。
pkg:包名,tf
type:类型,static_transform_publisher
name:名称,自定,便于理解
arg:tf参数, x y z yaw pitch roll frame_id child_frame_id period_in_ms.
1.x y z 分别代表着相应轴的平移,单位是 米。
2.yaw pitch roll 分别代表着绕z y x 三个轴的转动,单位是 弧度。
3.frame_id 为坐标系变换中的父坐标系, child_frame_id为坐标系变换中的子坐标系。
4.period_in_ms 为发布频率,单位为 毫秒。通常取100。一毫秒为一秒的千分之一,100毫秒即为0.1秒,也就是10Hz。
按照前文的数据,args处参数修改为
0.1 0.0 0.2 3.14 0.0 0.0 /base_link /lidar 50
说明:传感器的frame_id的名称根据厂商或有不同,一般在驱动启动launch可查看,思岚激光雷达的frame_id为/lidar。
详细了解 | tf之static_transform_publisher
关注Autolabor公众号,第一时间获取最新文章。
如何给定两个gps坐标 算出航向角_机器人开发如何配置ROS中的TF变换关系?相关推荐
- 如何给定两个gps坐标 算出航向角_如何获得飞机的小扰动模型
一.飞机运动方程分析 二.线性化的基本步骤 三.纵向运动线性小扰动模型 四.横航向运动线性小扰动模型 五.参考文献 一.飞机运动方程分析 要描述一个飞机的飞行状态,我们通常需要9个状态变量,即: 即飞 ...
- 计算坐标点的距离计算机公式,计算两个GPS坐标点的距离
原标题:计算两个GPS坐标点的距离 在日常开发中,我们难免要计算两个左边之间的距离,但是地图软件api的接口普遍要求我们必须要先将坐标点传递到他们服务器,然后计算出一个距离返还给我们,使用起来太不方便 ...
- java gps 距离计算_Java教程之地图中计算两个GPS坐标点的距离
原标题:Java教程之地图中计算两个GPS坐标点的距离 在日常开发中,我们难免要计算两个左边之间的距离,但是地图软件api的接口普遍要求我们必须要先将坐标点传递到他们服务器,然后计算出一个距离返还给我 ...
- gps两点距离 php,PHP应用:PHP计算百度地图两个GPS坐标之间距离的方法
<PHP应用:PHP计算百度地图两个GPS坐标之间距离的方法>要点: 本文介绍了PHP应用:PHP计算百度地图两个GPS坐标之间距离的方法,希望对您有用.如果有疑问,可以联系我们. 本文实 ...
- php 地图 距离,PHP计算百度地图两个GPS坐标之间距离的方法
这篇文章主要介绍了PHP计算百度地图两个GPS坐标之间距离的方法,是针对百度地图接口开发的典型应用,需要的朋友可以参考下 本文实例讲述了PHP计算百度地图两个GPS坐标之间距离的方法.分享给大家供大家 ...
- Java计算两个GPS坐标点之间的距离(可用于计算里程等)
直接贴上工具类: public class PositionUtil {private static final double EARTH_RADIUS = 6378.137; // 6378.137 ...
- 给定两个有序整数数组 nums1 和 nums2,将 nums2 合并到 nums1 中,使得 num1 有序
给定两个有序整数数组 nums1 和 nums2,将 nums2 合并到 nums1 中,使得 num1 成为一个有序数组. 说明: 初始化 nums1 和 nums2 的元素数量分别为 m 和 n. ...
- 给定两个有序整数数组 nums1 和 nums2,将 nums2 合并到 nums1 中,使得 num1 成为一个有序数组。
1.给定两个有序整数数组 nums1 和 nums2,将 nums2 合并到 nums1 中,使得 num1 成为一个有序数组. 说明: 初始化 nums1 和 nums2 的元素数量分别为 m 和 ...
- 通过经纬度计算出航向角
通过两个经纬度点,算出航向.不墨迹,代码拿去就能用 import java.math.BigDecimal; //计算航向角 public class Bearing { /** * ...
最新文章
- log_pipe日志收集分析系统介绍
- [Spark]PySpark入门学习教程---例子RDD与DataFrame
- Android实现支付宝AR功能,Android RecyclerView 实现支付宝首页效果
- 收集sqlite常见问题
- ASP.Net Core MVC 发生二次请求
- LeetCode 665. 非递减数列(双指针)
- UITableView 长按手势
- php长链接要配置,PHP链接到配置文件页面。 ?id =
- LeetCode刷刷记录
- 有限元计算计算机配置,关于有限元分析的电脑配置问题
- python测验6_Python语言程序设计 - 测验6: 组合数据类型 (第6周)
- day04-硅谷课堂-前端基础知识(二)
- 关于暗影骑士擎重装win10纯净版遇到的问题(使用的u盘作为系统盘)
- 江在川上曰:webpack前端工程化
- 【MMDetection 源码解读之yolov3】Neck - FPN
- 手持PDA扫描枪有什么功能?
- 【GANs学习笔记】(一)初步了解GANs
- 从蒙牛到小度,跨年晚会中的国民品牌变迁
- 提高企业竞争力,如何开展知识管理工作?
- qemu 的 win98 plus 镜像
热门文章
- python 矩阵乘法 跳过nan_python – Numpy:当一些向量元素等于零时,矩阵向量乘法不会跳过计算吗?...
- Linux ARM交叉编译工具链制作过程
- Linux 串口调试工具汇总
- 前端学习(3048):vue+element今日头条管理-展示文章列表
- 前端学习(3021):vue+element今日头条管理--创建组件和配置路由
- 如何开始了解一个新知识(Vuex)
- [vue] 你有使用做过vue与原生app交互吗?说说vue与ap交互的方法
- [vue] vue在组件中引入插件的方法有哪些?
- [js] AudioContext有什么应用场景?
- “约见”面试官系列之常见面试题之第九十五篇之vue-router的组件组成(建议收藏)