Python中使用kitti数据集实现自动驾驶(绘制出所有物体的行驶轨迹)
作者:秃头小苏 发布时间:2023-06-27 17:02:54
标签:python,kitti,数据集,自动驾驶,行驶轨迹
本次内容主要是上周内容的延续,主要画出kitti车的行驶的轨迹
同样的,我们先来看看最终实现的效果:
视频
接下来就进入一步步的编码环节。。。
1、利用IMU、GPS计算汽车移动距离和旋转角度
计算移动距离
通过GPS计算
#定义计算GPS距离方法
def computer_great_circle_distance(lat1,lon1,lat2,lon2):
delta_sigma = float(np.sin(lat1*np.pi/180)*np.sin(lat2*np.pi/180)+\
np.cos(lat1*np.pi/180)*np.cos(lat2*np.pi/180)*np.cos(lon1*np.pi/180-lon2*np.pi/180))
return 6371000.0*np.arccos(np.clip(delta_sigma,-1,1))
#使用GPS计算距离
gps_distance += [computer_great_circle_distance(imu_data.lat,imu_data.lon,prev_imu_data.lat,prev_imu_data.lon)]
通过IMU计算
IMU_COLUMN_NAMES = ['lat','lon','alt','roll','pitch','yaw','vn','ve','vf','vl','vu','ax','ay','az','af',
'al','au','wx','wy','wz','wf','wl','wu','posacc','velacc','navstat','numsats','posmode',
'velmode','orimode']
#获取IMU数据
imu_data = read_imu('/home/wsj/data/kitty/RawData/2011_09_26/2011_09_26_drive_0005_sync/oxts/data/%010d.txt'%frame)
#使用IMU计算距离
imu_distance += [0.1*np.linalg.norm(imu_data[['vf','vl']])]
比较两种方式计算出的距离(GPS/IMU)
import matplotlib.pyplot as plt
plt.figure(figsize=(20,10))
plt.plot(gps_distance, label='gps_distance')
plt.plot(imu_distance, label='imu_distance')
plt.legend()
plt.show()
显然,IMU计算的距离较为平滑。
计算旋转角度 旋转角度的计算较为简单,我们只需要根据IMU获取到的yaw值就可以计算(前后两帧图像的yaw值相减)
2、画出kitti车的行驶轨迹
prev_imu_data = None
locations = []
for frame in range(150):
imu_data = read_imu('/home/wsj/data/kitty/RawData/2011_09_26/2011_09_26_drive_0005_sync/oxts/data/%010d.txt'%frame)
if prev_imu_data is not None:
displacement = 0.1*np.linalg.norm(imu_data[['vf','vl']])
yaw_change = float(imu_data.yaw-prev_imu_data.yaw)
for i in range(len(locations)):
x0, y0 = locations[i]
x1 = x0 * np.cos(yaw_change) + y0 * np.sin(yaw_change) - displacement
y1 = -x0 * np.sin(yaw_change) + y0 * np.cos(yaw_change)
locations[i] = np.array([x1,y1])
locations += [np.array([0,0])]
prev_imu_data =imu_data
plt.figure(figsize=(20,10))
plt.plot(np.array(locations)[:, 0],np.array(locations)[:, 1])
3、画出所有车辆的轨迹
class Object():
def __init__(self, center):
self.locations = deque(maxlen=20)
self.locations.appendleft(center)
def update(self, center, displacement, yaw):
for i in range(len(self.locations)):
x0, y0 = self.locations[i]
x1 = x0 * np.cos(yaw_change) + y0 * np.sin(yaw_change) - displacement
y1 = -x0 * np.sin(yaw_change) + y0 * np.cos(yaw_change)
self.locations[i] = np.array([x1,y1])
if center is not None:
self.locations.appendleft(center)
def reset(self):
self.locations = deque(maxlen=20)
#创建发布者
loc_pub = rospy.Publisher('kitti_loc', MarkerArray, queue_size=10)
#获取距离和旋转角度
imu_data = read_imu('/home/wsj/data/kitty/RawData/2011_09_26/2011_09_26_drive_0005_sync/oxts/data/%010d.txt'%frame)
if prev_imu_data is None:
for track_id in centers:
tracker[track_id] = Object(centers[track_id])
else:
displacement = 0.1*np.linalg.norm(imu_data[['vf','vl']])
yaw_change = float(imu_data.yaw - prev_imu_data.yaw)
for track_id in centers: # for one frame id
if track_id in tracker:
tracker[track_id].update(centers[track_id], displacement, yaw_change)
else:
tracker[track_id] = Object(centers[track_id])
for track_id in tracker:# for whole ids tracked by prev frame,but current frame did not
if track_id not in centers: # dont know its center pos
tracker[track_id].update(None, displacement, yaw_change)
prev_imu_data = imu_data
def publish_loc(loc_pub, tracker, centers):
marker_array = MarkerArray()
for track_id in centers:
marker = Marker()
marker.header.frame_id = FRAME_ID
marker.header.stamp = rospy.Time.now()
marker.action = marker.ADD
marker.lifetime = rospy.Duration(LIFETIME)
marker.type = Marker.LINE_STRIP
marker.id = track_id
marker.color.r = 1.0
marker.color.g = 1.0
marker.color.b = 0.0
marker.color.a = 1.0
marker.scale.x = 0.2
marker.points = []
for p in tracker[track_id].locations:
marker.points.append(Point(p[0], p[1], 0))
marker_array.markers.append(marker)
loc_pub.publish(marker_array)
来源:https://juejin.cn/post/7106412494125531173


猜你喜欢
- 最近经常需要出一些临时性的报表,于是就用python 的smtplib 和email 两模块写了个小程序,当数据处理完后通过邮箱把报表文件从
- 本文实例为大家分享了Django实现文件上传下载的具体代码,供大家参考,具体内容如下一、django实现文件下载(1)、后台接口如果从服务器
- 我就废话不多说了,直接上代码吧!# -*- coding: utf-8 -*-"""Created on Sa
- 实现原理PS的扩散效果可以产生类似毛玻璃质感的效果,使画面有些毛毛的感觉。其实现可通过操作像素三通道数值的方式实现,定义一个随机数器,将图像
- 1.变量命名1)命名的规范性变量名可以包括字母、数字、下划线,但是数字不能做为开头。系统关键字不能做变量名使用除了下划线之个,其它符号不能做
- 合并在numpy中合并两个arraynumpy中可以通过concatenate,参数axis=0表示在垂直方向上合并两个数组,等价于np.v
- 本文实例讲述了PHP利用header跳转失效的解决方法,分享给大家供大家参考。具体方法分析如下:一、问题:今天header(\"L
- 前言最近看到老婆天天在手机上玩数独,突然想起 N 年前刷 LeetCode 的时候,有个类似的算法题(37.解数独),是不是可以把这个算法进
- 我们在上传大文件时,可能会由于服务器的原因导致文件上传失败,文件过大时由于服务器的配置或响应事件过长导致上传文件失败,这时候我们可以将一个大
- 一张表(ColumnTable)的结构如下图所示当前需要实现的功能:通过Number的值为67来获取当前的节点ID、父节点ID递归实现SQL
- Go语言中rune方法如何使用,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希
- MySQL多表join时报错如下:[Err]1267 – Illegal mix of collations(utf8_general_ci
- 本文实例讲述了thinkphp3.x连接mysql数据库的方法。分享给大家供大家参考,具体如下:惯例配置文件:ThinkPHP/conf/c
- 在JavaScript中,我们应该尽可能的用局部变量来代替全局变量,这句话所有人都知道,可是这句话是谁先说的?为什么要这么做?有什么根据么?
- 在SQL SERVER中如何通过SQL语句获取服务器硬件和系统信息呢?下面介绍一下如何通过SQL语句获取处理器(CPU)、内存(Memory
- Rosenbrock函数的定义如下:其函数图像如下:我分别使用梯度下降法和牛顿法做了寻找Rosenbrock函数的实验。梯度下降梯度下降的更
- 在安装wordpress的时候,按照里面的readme.html的步骤进行安装,但是在访问wp-admin/install.php的时候就出
- 在制作网页以及编程的时候,适当的进行注释,不仅使自己的思路清晰,极大地减轻了维护的难度,而且方便项目组其他人了解你的代码,方便对代码的理解以
- 前几天,我们Python猫交流学习群 里的 M 同学提了个问题。这个问题挺有意思,经初次讨论,我们认为它无解。然而,我认为它很有价值,应该继
- 本文实例讲述了Python多线程threading模块用法。分享给大家供大家参考,具体如下:多线程 - threadingpython的th