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

简介: 使用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()

d4c5ec6b56d8463d9825126437517718.png

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

  • 计算旋转角度

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

9a639e41f4024fc2aa473a19cce75a80.png


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

e621d0e6a44a4b499706d637840bd9cd.png

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)

        4028119c84ed4a5193ae1b9f8378e513.png

相关文章
|
缓存 网络协议 前端开发
【前端面试知识点】- 1. http&https
http: 是互联网上应用最为广泛的一种网络协议,是一个客户端和服务器端请求和应答的标准(TCP),用于从 WWW 服务器传输超文本到本地浏览器的超文本传输协议。
【前端面试知识点】- 1. http&https
|
存储 数据采集 传感器
一文多图搞懂KITTI数据集下载及解析
一文多图搞懂KITTI数据集下载及解析
17269 3
一文多图搞懂KITTI数据集下载及解析
|
存储 JSON NoSQL
FreeSWITCH呼叫中心中间件-通话质检接口
原理:通过ASR接口(依赖cti_asr接口),识别出实时识别说话内容,然后和关键词匹配执行挂机等动作。支持群集,配置和记录都存储到REDIS。
785 96
|
Java 程序员 Spring
一文读懂 Bean的生命周期
一文读懂 Bean的生命周期
972 0
|
Android开发
Android中实现获取相册中的图片扫描二维码的功能
Android中实现获取相册中的图片扫描二维码的功能
704 0
|
应用服务中间件 nginx
nginx开发(二)配置mp4文件在线播放
1: 第一步先开打nginx的文件夹遍历功能   vi /usr/local/nginx/conf/nginx.conf #编辑配置文件,在http {下面添加以下内容: autoindex on; #开启nginx目录浏览功能 autoindex_exact_size off; #文件大小...
4009 0
|
6月前
|
人工智能 运维 数据可视化
16项测试赢了13项!Gemini 3.1 Pro碾压GPT-5.2和Claude
昨天晚上(2月19号),老金我刷到一条消息——Google发布了 Gemini 3.1 Pro。 ![Image](https://ucc.alicdn.com/pic/developer-ecology/p3shvhj26rigq_c55cf33e4d734d38913fcb367357e44d.jpg) 说实话,第一反应是"又更新?Gemini 3 Pro去年11月才出,这才3个月就搞.1
|
11月前
|
数据采集 数据库 开发者
利用Python asyncio实现高效异步编程
利用Python asyncio实现高效异步编程
398 100
|
11月前
|
传感器 机器学习/深度学习 算法
无人机视觉定位研究(Matlab代码实现)
无人机视觉定位研究(Matlab代码实现)
303 0
|
8月前
|
存储 人工智能 算法
多模态融合 AI 视频识别技术:高精度合规
基于亚裔优化算法,融合多模态识别与本地加密部署,实现99.5%高精度识别与0.5%低误识率,支持复杂环境稳定运行。构建端到端安全防护,满足GDPR合规,集成生物识别与RFID双因子验证,实现毫秒级响应、10秒内预警处置,打造“识别-预警-追溯-整改”闭环管理,全面提升智能管控效率与安全性。
573 14