Mercurial Hosting > traffic-intelligence
diff trafficintelligence/storage.py @ 1212:af329f3330ba
work in progress on 3D safety analysis
author | Nicolas Saunier <nicolas.saunier@polymtl.ca> |
---|---|
date | Tue, 02 May 2023 17:11:24 -0400 |
parents | 36f0d18e1fad |
children | 3f2214125164 |
line wrap: on
line diff
--- a/trafficintelligence/storage.py Tue May 02 07:12:26 2023 -0400 +++ b/trafficintelligence/storage.py Tue May 02 17:11:24 2023 -0400 @@ -7,7 +7,7 @@ from copy import copy import sqlite3, logging -from numpy import log, min as npmin, max as npmax, round as npround, array, sum as npsum, loadtxt, floor as npfloor, ceil as npceil, linalg, int32, int64, reshape, dot, vstack, transpose, ones, zeros_like +from numpy import log, min as npmin, max as npmax, round as npround, array, sum as npsum, loadtxt, floor as npfloor, ceil as npceil, linalg, int32, int64, reshape, dot, vstack, transpose, ones, zeros_like, pi from pandas import read_csv, merge from trafficintelligence import utils, moving, events, indicators, cvutils @@ -1385,6 +1385,47 @@ newObj = moving.MovingObject(num = objNum, timeInterval = moving.TimeInterval(int(tmp.frame.min()), int(tmp.frame.max())), positions = t, velocities = t.differentiate(True), userType = tmp.iloc[0].usertype, features = [moving.MovingObject(num = featureNum+i, timeInterval = moving.TimeInterval(int(tmp.frame.min()), int(tmp.frame.max())), positions = featureTrajectories[i], velocities = featureTrajectories[i].differentiate(True)) for i in range(4)]) objects.append(newObj) featureNum += 4 + + # ego vehicle + t = moving.Trajectory() + featureTrajectories = [moving.Trajectory() for i in range(4)] + interval = moving.TimeInterval(int(data.frame.min()), int(data.frame.max())) + R = roty(pi/2) + for frame in interval: + _, Tr_imu_to_world = oxts[frame] + + l = 4.5 # m + w = 1.8 # m + h = 0. + # 3d bounding box corners + x_corners = [l / 2, l / 2, -l / 2, -l / 2, l / 2, l / 2, -l / 2, -l / 2] + y_corners = [0, 0, 0, 0, -h, -h, -h, -h] + z_corners = [w / 2, -w / 2, -w / 2, w / 2, w / 2, -w / 2, -w / 2, w / 2] + # rotate and translate 3d bounding box + corners3d = dot(R, vstack([x_corners, y_corners, z_corners])) + corners3d[0, :] = corners3d[0, :] + corners3d[1, :] = corners3d[1, :] + corners3d[2, :] = corners3d[2, :] + refCorners = transpose(dot(invR0, corners3d)) # 8x3 avoid double transpose np.transpose(pts_3d_rect))) in pts_3d_ref = self.project_rect_to_ref(pts_3d_rect) + homRefCorners = cvutils.cartesian2Homogeneous(refCorners) + veloCorners = dot(homRefCorners, transCam2Velo) + homVeloCorners = cvutils.cartesian2Homogeneous(veloCorners) + imuCorners = dot(kittiCalibration['Tr_velo_imu'], homVeloCorners.T).T # 8x3 + + homImuCorners = cvutils.cartesian2Homogeneous(imuCorners) + worldCorners = dot(Tr_imu_to_world, homImuCorners.T).T # 8x3 + + # take first 4 lines of corners, x,y,_ # x0, y0, _ = boxes3d[0] + xCoords = worldCorners[:4,0] + yCoords = worldCorners[:4,1] + t.addPositionXY(xCoords.mean(), yCoords.mean()) + for i in range(4): + featureTrajectories[i].addPositionXY(xCoords[i], yCoords[i]) + # check https://docs.opencv.org/3.4/d9/d0c/group__calib3d.html#ga1019495a2c8d1743ed5cc23fa0daff8c + + newObj = moving.MovingObject(num = objNum+1, timeInterval = interval, positions = t, velocities = t.differentiate(True), userType = 'Car', features = [moving.MovingObject(num = featureNum+i, timeInterval = interval, positions = featureTrajectories[i], velocities = featureTrajectories[i].differentiate(True)) for i in range(4)]) + objects.append(newObj) + return objects def convertNgsimFile(inputfile, outputfile, append = False, nObjects = -1, sequenceNum = 0):