自動(dòng)駕駛的關(guān)鍵挑戰(zhàn)之一是準(zhǔn)確感知和解釋車輛周圍環(huán)境的能力。這需要使用各種傳感器,如相機(jī)、激光雷達(dá)和雷達(dá),來捕捉周圍環(huán)境的數(shù)據(jù)。
然而,這些傳感器捕獲的數(shù)據(jù)通常位于與車輛自身坐標(biāo)系不同的坐標(biāo)系中。這意味著必須將數(shù)據(jù)轉(zhuǎn)換到車輛的坐標(biāo)系中,以便對導(dǎo)航和控制有用。
上面提到的BEV感知,通過視覺算法我們可以在每一幀都提取出特征點(diǎn)。如果在時(shí)間序列上,我們想利用這些特征點(diǎn),我們就無法避免的要使用坐標(biāo)變換了。
自動(dòng)駕駛中常用的坐標(biāo)變換有幾種類型,包括:
1. 平移
平移包括在同一坐標(biāo)系中將對象從一個(gè)位置移動(dòng)到另一個(gè)位置。在自動(dòng)駕駛中,平移通常用于對齊激光雷達(dá)和相機(jī)等不同傳感器捕獲的數(shù)據(jù),使它們處于同一坐標(biāo)系中。
2. 旋轉(zhuǎn)
旋轉(zhuǎn)包括圍繞同一坐標(biāo)系中的固定點(diǎn)旋轉(zhuǎn)對象。在自動(dòng)駕駛中,旋轉(zhuǎn)通常用于對齊安裝在車輛上不同角度的傳感器捕獲的數(shù)據(jù)。
3. 齊次變換
齊次變換包括將平移和旋轉(zhuǎn)組合成單個(gè)變換矩陣。在自動(dòng)駕駛中我們會用到齊次變換,將數(shù)據(jù)從傳感器坐標(biāo)系轉(zhuǎn)換到車輛坐標(biāo)系。
為了執(zhí)行這些坐標(biāo)變換,使用了各種數(shù)學(xué)技術(shù),如矩陣乘法和四元數(shù)旋轉(zhuǎn)。這些技術(shù)是在軟件庫中實(shí)現(xiàn)的,例如C++的Egengen庫和Python的NumPy庫。
二維數(shù)據(jù)坐標(biāo)變換的常見場景
情況1
情況2
python代碼
寫一個(gè)python代碼,來驗(yàn)證坐標(biāo)變換
import matplotlib.pyplot as plt
plt.title('Calibration')
plt.xlabel('x (m)')
plt.ylabel('y (m)')
plt.axis('equal')
# 坐標(biāo)軸長度
coord_length = 0.2
# 兩個(gè)車輛位姿
x1 = 1
y1 = 4
theta1 = 0.1
print("car pose1: ["+str(x1), ", "+str(y1) + ", "+str(theta1)+"]")
x2 = 3
y2 = 5
theta2 = 1.3
print("car pose2: ["+str(x2), ", "+str(y2) + ", "+str(theta2)+"]")
# 位姿1下有一個(gè)點(diǎn)p
x = 2
y = 1
print("["+str(x), ", "+str(y) + "] in pose1")
# 畫位姿1的坐標(biāo)軸
x_cord = math.cos(theta1) * coord_length + x1
y_cord = math.sin(theta1) * coord_length + y1
plt.plot([x1, x_cord], [y1, y_cord], 'r')
x_cord = math.cos(theta1 + math.pi/2) * coord_length + x1
y_cord = math.sin(theta1 + math.pi/2) * coord_length + y1
plt.plot([x1, x_cord], [y1, y_cord], 'b')
# 畫位姿2的坐標(biāo)軸
x_cord = math.cos(theta2) * coord_length + x2
y_cord = math.sin(theta2) * coord_length + y2
plt.plot([x2, x_cord], [y2, y_cord], 'r')
x_cord = math.cos(theta2 + math.pi/2) * coord_length + x2
y_cord = math.sin(theta2 + math.pi/2) * coord_length + y2
plt.plot([x2, x_cord], [y2, y_cord], 'b')
# p點(diǎn)在世界坐標(biāo)系下的位置
x_world = math.cos(theta1) * x - math.sin(theta1) * y + x1
y_world = math.sin(theta1) * x + math.cos(theta1) * y + y1
print("["+str(x_world), ", "+str(y_world) + "] in world")
plt.plot(x_world, y_world, 'r*')
# p點(diǎn)在位姿2下的位置
x_ = math.cos(theta2) * (x_world-x2) + math.sin(theta2) * (y_world-y2)
y_ = -math.sin(theta2) * (x_world-x2) + math.cos(theta2) * (y_world-y2)
print("["+str(x_), ", "+str(y_) + "] in pose2")
# 用計(jì)算出來的p點(diǎn)位姿2下的位置,來再算出在世界坐標(biāo)系下的位置
x_world_ = math.cos(theta2) * x_ - math.sin(theta2) * y_ + x2
y_world_ = math.sin(theta2) * x_ + math.cos(theta2) * y_ + y2
print("use 2 to check ["+str(x_world_), ", "+str(y_world_) + "]")
plt.plot(x_world_, y_world_, 'b*')
plt.show()
-
傳感器
+關(guān)注
關(guān)注
2552文章
51383瀏覽量
756002 -
車輛
+關(guān)注
關(guān)注
0文章
83瀏覽量
15200 -
自動(dòng)駕駛
+關(guān)注
關(guān)注
784文章
13924瀏覽量
166869
發(fā)布評論請先 登錄
相關(guān)推薦
評論