Python中使用kitti数据集实现自动驾驶(绘制出所有物体的行驶轨迹)

作者:秃头小苏 时间:2023-06-27 17:02:54 

本次内容主要是上周内容的延续,主要画出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()

Python中使用kitti数据集实现自动驾驶(绘制出所有物体的行驶轨迹)

显然,IMU计算的距离较为平滑。

  • 计算旋转角度 旋转角度的计算较为简单,我们只需要根据IMU获取到的yaw值就可以计算(前后两帧图像的yaw值相减)

Python中使用kitti数据集实现自动驾驶(绘制出所有物体的行驶轨迹)

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])

Python中使用kitti数据集实现自动驾驶(绘制出所有物体的行驶轨迹)

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)

Python中使用kitti数据集实现自动驾驶(绘制出所有物体的行驶轨迹)

来源:https://juejin.cn/post/7106412494125531173

标签:python,kitti,数据集,自动驾驶,行驶轨迹
0
投稿

猜你喜欢

  • python爬取Ajax动态加载网页过程解析

    2023-05-15 15:51:47
  • 解决python3 网络请求路径包含中文的问题

    2023-07-09 00:14:23
  • goland把go项目打包进docker镜像的全过程记录

    2024-04-25 13:17:32
  • 说说CSS Hack 和向后兼容

    2010-05-17 13:11:00
  • python实现不同数据库间数据同步功能

    2024-01-18 15:58:52
  • Navicat连接mysql报错2003(10060)的解决方法

    2024-01-25 06:08:14
  • sqlalchemy对象转dict的示例

    2022-08-24 00:08:34
  • 使用 Django Highcharts 实现数据可视化过程解析

    2022-12-27 19:18:51
  • 总结归纳python os库常用方法

    2023-05-23 19:34:05
  • python连接sql server乱码的解决方法

    2023-06-27 07:25:17
  • PyTorch中apex安装方式和避免踩坑

    2023-06-20 15:19:57
  • 技术性击倒与抬杠

    2009-02-12 12:28:00
  • Python办公自动化之Excel介绍

    2021-04-19 11:06:07
  • 解决vue3打包过后空白页面的情况

    2024-05-09 10:43:00
  • TXT.WORD文档下载另存为,而不是在浏览器中打开

    2007-10-25 11:43:00
  • python黑魔法之编码转换

    2022-08-11 10:03:41
  • 微软证实最新的关键SQL Server漏洞

    2008-12-23 13:31:00
  • 如何过滤中国站长站(chianz)文章干扰码

    2008-01-04 20:14:00
  • 详解KMP算法以及python如何实现

    2022-11-17 05:27:18
  • JavaScript正则表达式之multiline属性的应用

    2024-05-11 10:24:56
  • asp之家 网络编程 m.aspxhome.com