由于实验需要将 c a r l a carla carla 中世界坐标系下的坐标点画到相机采集的前视图上,故需要进行坐标系之间的转换。
参考这篇博客中给出的方法: link
发现将世界坐标系转到像素坐标系下显示的不对。因此仔细从头到尾仔细分析一下,原来是 c a r l a carla carla 中 g e t _ t r a n s f o r m ( ) . g e t _ m a t r i x ( ) get\_transform().get\_matrix() get_transform().get_matrix() 函数的问题。具体解释如下。
首先,车辆在 c a r l a carla carla 中运行时可以获取实时的世界坐标,例如下图所示 l o c a t i o n location location 中的 x , y x,y x,y 坐标。
获取方式为:
#创建了一辆车my_vehicle
t = my_vehicle.get_transform()
global_location_x = t.location.x
global_location_y = t.location.y
global_location_z = t.location.z
global_rotation_yaw = t.rotation.yaw
global_rotation_pitch = t.rotation.pitch
global_rotation_roll = t.rotation.roll
获取到世界坐标系后,首先需要转到相机坐标系下。
这篇博客 link 中说相机的外参矩阵直接可以通过下方函数来获得。
camera.get_transform().get_matrix()
但是,经过测试发现不是。
c a r l a carla carla 官方文档:
文档中说 t r a n s f o r m transform transform 计算以当前点为原点的坐标系 A A A 与世界坐标系 B B B 之间的变换。
g e t _ m a t r i x ( ) get\_matrix() get_matrix() 函数获取从当前点为原点的坐标系 A A A 到世界坐标系 B B B 之间的变换矩阵。
重点: 但是, g e t _ m a t r i x ( ) get\_matrix() get_matrix() 默认相机位置为原点的这个坐标系的 x , y , z x,y,z x,y,z 轴与世界坐标系的 x , y , z x,y,z x,y,z 轴是相同方向的,没有考虑轴旋转。
而实际上,相机坐标系是相机的正前方,光心方向总是 z z z 轴方向。
世界坐标系是这样的:
这两个坐标系轴的关系存在一个旋转矩阵。
c a m e r a . g e t _ t r a n s f o r m ( ) . g e t _ m a t r i x ( ) camera.get\_transform().get\_matrix() camera.get_transform().get_matrix() 获得的是不考虑轴旋转的局部到全局的变换矩阵。
将 c a m e r a . g e t _ t r a n s f o r m ( ) . g e t _ m a t r i x ( ) camera.get\_transform().get\_matrix() camera.get_transform().get_matrix() 获得的矩阵取逆得到的是不考虑轴旋转的全局到局部的变换矩阵。
而世界坐标系到相机局部坐标系考虑轴旋转关系的对应矩阵为:
[ 0 1 0 0 0 1 1 0 0 ] \left[ \begin{matrix} 0 & 1 & 0\\ 0 & 0 & 1\\ 1 & 0& 0 \end{matrix} \right] ⎣⎡001100010⎦⎤
因此将 c a m e r a . g e t _ t r a n s f o r m ( ) . g e t _ m a t r i x ( ) camera.get\_transform().get\_matrix() camera.get_transform().get_matrix() 获得的矩阵取逆再乘以世界坐标系轴与相机坐标系轴之间的旋转矩阵,就真正得到世界坐标系到相机坐标系的变换矩阵。
得到变换矩阵 R R R 后,假设世界坐标系下点的坐标是 P w = ( x w , y w , z w ) T P_{w} = (x_{w},y_{w},z_{w})^T Pw=(xw,yw,zw)T,
P c = R . P w P_{c} = R.P_{w} Pc=R.Pw
注:如果使用上面世界坐标系到相机局部坐标系考虑轴旋转关系的对应矩阵发现效果不对时,可能是由于光轴是朝向相机正后方。
世界坐标系到相机局部坐标系考虑轴旋转关系的对应矩阵为:
[ 0 − 1 0 0 0 1 − 1 0 0 ] \left[ \begin{matrix} 0 & -1 & 0\\ 0 & 0 & 1\\ -1 & 0 & 0 \end{matrix} \right] ⎣⎡00−1−100010⎦⎤
参考这篇博客链接 link
参考这篇博客 link
在 c a r l a carla carla 中没有找到内参获取函数,但是根据上述两篇博客中的解释,内参可以估计得到。
在参考文档中 S e n s o r s r e f e r n e c e / R G B c a m e r a / A d v a n c e d c a m e r a a t t r i b u t e s Sensors\;\;refernece/RGB\;\;camera/Advanced camera attributes Sensorsrefernece/RGBcamera/Advancedcameraattributes 中,可以得到相机的焦距。
光心一般是相机采集图片的中心。根据这些信息可以估计出相机内参。
假设相机坐标系下点的坐标是 P c = ( x c , y c , z c ) T P_{c} = (x_{c},y_{c},z_{c})^T Pc=(xc,yc,zc)T,相机内参是 K K K,
P p = K . P c P_{p} = K.P_{c} Pp=K.Pc
首先记录车辆行驶过程中的轨迹点,然后将当前位置后20帧车辆的世界坐标系下坐标转化到当前图像坐标系下,转换结果如下:
程序后续整理上传到我的 g i t h u b github github 中。