(九) 画出KITTI本车行驶轨迹

本文介绍了如何利用两帧间的距离和偏航角计算行驶轨迹,涉及大圆定理计算经纬度距离、IMU速度积分求距离及yaw变化。通过收集的oxts数据,特别是yaw信息,结合IMU的vf和vl计算距离,逐步累加形成完整的行驶轨迹。最终,使用这些方法在RVIZ中展示了本车轨迹。
摘要由CSDN通过智能技术生成

一、 两帧间计算距离和偏航原理

        为了在RVIZ中画出本车的轨迹,需要计算当前帧(frame)在本车坐标系下,其他帧(frame-1….n)下本车坐标系经过移动后的位置。车辆行驶时的偏航平移可以看作是车辆坐标系的旋转和平移

        如下图所示,先不考虑旋转,平移时第(frame)帧和第(frame-1)帧始终差一个d,这个d为distance,是每两帧,即一个采样时间(0.1s)下车辆移动的距离。这个距离可以通过IMU记录的经纬度,或者车辆速度矢量与采样时间的乘积表示。

在这里插入图片描述
        而车辆在运动时,不仅只有平移,还有偏航,于是坐标系还有有旋转运动。如下图所示,坐标系先是旋转了一个θ角度,然后平移过一个d距离,移动方向正是车辆速度vf和vl的和向量方向,因此其与采样时间相乘即为移动距离。

在这里插入图片描述
        因此,记录车辆行驶轨迹,最主要是的d 和θ的获取,使用KITTI raw data自带的oxts文件,其中自带的dataformat.txt中详细说明了记录的每个数据的type ,θ使用其中的yaw即可获得当前的偏航角yaw和下一时刻的偏航角yaw(rad),当车辆逆时针转动时Δyaw为正值,当顺时针转动时Δyaw为负值

        具体IMU数据格式可以参考https://blog.csdn.net/rhyijg/article/details/108368314
在这里插入图片描述

        d 的长度,可以通过两帧之间的经纬度(lat和lon) lat: latitude of the oxts-unit (deg)
lon: longitude of the oxts-unit (deg)的关系,使用大圆定理(Great Circle distance)进行求解,可以根据公式求出两点的最短距离
在这里插入图片描述

大圆距离(英语:Great-circledistance)指的是从球面的一点A出发到达球面上另一点B,所经过的最短路径的长度。一般说来,球面上任意两点A和B都可以与球心确定唯一的大圆,这个大圆被称为黎曼圆,而在大圆上连接这两点的较短的一条弧的长度就是大圆距离。若这两点和球心正好都在球的直径上,则过这三点可以有无数大圆,但两点之间的弧长都相等,且等于该大圆周长的一半,r是球的半径。由于地球类似球体,地球上任何两点沿球面的最短距离都可以通过大圆距离的公式估算的出,这在航空和航海上都有很大作用。
在这里插入图片描述

        使用两个经纬度可以计算距离,python代码即:

# 使用经纬度计算两个经纬度之间的距离
def compute_great_circle_distance(lat1,lon1,lat2,lon2):
    '''
        Compute the great circle distance from two gps data
        Input: latitudes and longitudes in degree
        Output: distance in meter
    '''
    delta_sigma = float(np.sin(lat1*np.pi/180)*np.sin(lat2*np.pi/180)
H5通常指的是HTML5,这是一种用于创建网页的标准,可以利用其Canvas API来绘制图形,包括Hello Kitty等可爱的角色。下面是一个简单的HTML5 Canvas绘制Hello Kitty的示例: ```html <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Hello Kitty</title> <style> canvas { border: 1px solid black; } </style> </head> <body> <canvas id="myCanvas" width="200" height="200"></canvas> <script> const canvas = document.getElementById('myCanvas'); const ctx = canvas.getContext('2d'); // Hello Kitty的头部 function drawHead(x, y) { ctx.beginPath(); ctx.moveTo(x + 20, y); ctx.lineTo(x + 40, y); ctx.lineTo(x + 60, y + 10); ctx.quadraticCurveTo(x + 70, y + 30, x + 80, y + 40); ctx.lineTo(x + 90, y + 50); ctx.lineTo(x + 110, y + 70); ctx.lineTo(x + 120, y + 60); ctx.closePath(); ctx.fillStyle = 'pink'; ctx.fill(); } // 绘制Hello Kitty function drawKitty() { const kittyX = canvas.width / 2 - 50; const kittyY = canvas.height / 2; drawHead(kittyX, kittyY - 30); // 头部 ctx.beginPath(); // 身体 ctx.moveTo(kittyX + 40, kittyY - 20); ctx.arc(kittyX + 70, kittyY - 50, 20, 0, Math.PI * 2); ctx.closePath(); ctx.fillStyle = 'white'; ctx.fill(); // 眼睛、鼻子、嘴巴 drawCircle(kittyX + 52, kittyY + 10, 5, '#000'); drawCircle(kittyX + 66, kittyY + 30, 3, '#000'); drawLine(kittyX + 50, kittyY + 20, kittyX + 60, kittyY + 20, '#000'); } function drawCircle(x, y, r, color) { ctx.beginPath(); ctx.arc(x, y, r, 0, Math.PI * 2); ctx.fillStyle = color; ctx.fill(); } function drawLine(x1, y1, x2, y2, color) { ctx.beginPath(); ctx.moveTo(x1, y1); ctx.lineTo(x2, y2); ctx.strokeStyle = color; ctx.stroke(); } drawKitty(); </script> </body> </html> ``` 在这个例子中,我们首先获取到Canvas元素并设置绘图上下文,然后定义了绘制Hello Kitty头部、身体、眼睛、鼻子和嘴巴的函数。最后调用`drawKitty()`函数来在页面上显示Hello Kitty。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值