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

举报
秃头小苏 发表于 2022/04/14 11:07:19 2022/04/14
【摘要】 1、利用IMU、GPS计算汽车移动距离和旋转角度 2、画出kitti车的行驶轨迹 3、画出所有车辆的轨迹 本次内容主要是上周内容的延续,主要画出kitti车的行驶的轨迹同样的,我们先来看看最终实现的效果:https://gitee.com/wsj-create/autodrive/blob/master/自动驾驶视频2.mp4 接下来就进入一步步的编码环节。。。     1、利用IMU、G...

本次内容主要是上周内容的延续,主要画出kitti车的行驶的轨迹

同样的,我们先来看看最终实现的效果:
https://gitee.com/wsj-create/autodrive/blob/master/自动驾驶视频2.mp4


接下来就进入一步步的编码环节。。。




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

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CWY7VHDj-1640154002451)(C:\Users\WSJ\AppData\Roaming\Typora\typora-user-images\image-20211221163928106.png)]

显然,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)
            

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eu8Ebm9P-1640153938573)(C:\Users\WSJ\AppData\Roaming\Typora\typora-user-images\image-20211221165921983.png)]




咻咻咻咻~~duang~~点个赞呗

上一篇:使用kitti数据集实现自动驾驶——发布照片、点云、IMU、GPS、显示2D和3D侦测框

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。