在下面这篇参考博客中介绍了如何手动获取从carla世界坐标系到俯视地图像素坐标系的旋转平移矩阵.我也是采用了一样的思路和代码,这里把实现的过程以及最后所有地图的变换矩阵记录如下.
参考博客:carla真实世界坐标系与全局俯视地图像素坐标系变换
文章目录
代码:
1.carla世界坐标介绍
首先,在carla仿真环境中,车辆是一个actor,因此我们一般通过调用,actor的transform属性来获取carla世界坐标系下的车辆的坐标,我们称之为T1.
例如,如下图所示,左边的location(68.8,-34.8)就是carla世界坐标系下车辆的坐标.
2.像素坐标介绍
第二,我们通过官网可以下载到carla的jpg格式的俯视地图,坐标称为T2.如图所示:
我们想要求一个变换矩阵,能够实现从carla世界坐标系T1到像素坐标系T2的转换,这样我们就可以实时在全局地图上查看车辆位置了.
3.采集标定数据
3.1.打开carla服务器
./CarlaUE4.sh
3.2.获取像素坐标
通过获取图片对应位置的像素坐标,这提供了一个用opencv写的工具:
get_pix_label
将图片放到get_pix_label/pic
目录下,这里以Town07.jpg
为例:
打开界面后操作为:
- 鼠标左键单击: 选择目标点并标记为蓝色
- 鼠标中键单击: 将蓝色点的像素坐标保存到
img_label.txt
中 - 键盘输入
c
: 退出程序
保存的点的格式为:
[[301, 260], [333, 168], [295, 349], [229, 368], [445, 321], [311, 405], [307, 489]]
3.3.生成车辆遥控前往指定地点获取carla坐标
通过pythonAPI
或者carla-ros-bridge
打开一个小车,这里是通过carla-ros-bridge
,然后指定了车辆为vehicle.audi.a2
,指定了地图为town07
roslaunch carla_ros_bridge carla_ros_bridge_with_example_ego_vehicle.launch role_name:="ego_vehicle" vehicle_filter:="vehicle.audi.a2" town:="town07"
我们把车开到3.2中通过像素标记的指定地点,然后运行下面这个程序获取carla坐标:
3.4. 保存标定数据并进行标定
将3.2和3.3采集到的7组按照预定的格式填入文件中,具体操作请看readme
指南:
本步骤参考操作指南:
transferMatric_Loc2Ima/calibration/readme.md
https://gitee.com/cslibowen/carla_tutorial/blob/master/transform/transferMatric_Loc2Ima/calibration/readme.md
使用QT打开,编译并运行代码:carla世界坐标系到像素坐标系转换代码
运行后会得到下面的结果:
其中R是旋转矩阵,T是平移矩阵,out是第7组测试数据的转换结果,于test_imag_points的结果对比,发现差别在10个像素左右,误差对于我们的问题来说可以接受,毕竟是人手工选的点,误差肯定是会存在的.
4.RT矩阵结果
这里只转换了town01,02,03,05,07的,其他地图请各位自行转换.另外,由于是手工选点,难免存在一定误差.
RT_results.txt
# Town01的变换矩阵
R = np.array([[1.577447844831592, -0.0260328048010988], [0.0260328048010988, 1.577447844831592]])
T = np.array([[31.49666980502371], [76.48981097252329]])
# Town02的变换矩阵
R = np.array([[2.91195124e+00, -5.40898686e-02], [-7.35309629e-03, 2.93199718e+00]])
T = np.array([[8.61788912e+01], [-2.70949862e+02]])
# Town03的变换矩阵
R = np.array([[1.55628219498322, -0.01744074034859375], [0.05207615428285987, 1.453621762795462]])
T = np.array([[270.6148345865518], [326.8114566281828]])
# Town05的变换矩阵
R = np.array([[-0.006232946646395232, 1.230904655706192], [-1.230904655706192, -0.006232946646395232]])
T = np.array([[327.6292483315692], [273.3449850980829]])
# Town07的变换矩阵
R = np.array([[1.624402368677193, 0.01825124828532574], [0.02069841120825797, 1.61886922216472]])
T = np.array([[463.1594657435309], [413.426694931497]])