CARLA Notes
一些关于CARLA的笔记。
部分信息需要核实,或部分内容仅为助记,或者版本更迭后有所变化。
Coordinate Systems
| E | N | W | S | Convert | ||
|---|---|---|---|---|---|---|
| my definition(A) | 0 | 90 | 180(-180) | -90 | right hand | |
| carla compass(B) | 90 | 0(360) | 270 | 180 | 90 - B = A | left hand |
| carla yaw(C) | 0 | -90 | -180(180) | 90 | -C = A | left hand |
| legacy(D) | -90 | 0 | 90 | -180(180) | D + 90 = A | right hand |
| carla transform | +X | -Y | -X | +Y |
Center of Mass
https://github.com/carla-simulator/carla/issues/4487
Wheel Index Definition
https://carla.readthedocs.io/en/latest/python_api/#carlavehiclephysicscontrol
About Steer
在CARLA中,定义左转转角为负值,右转转角为正值。
同时在车辆控制接口中,steer的范围是[-1.0, 1.0],而对于具体的车辆,其存在一个属性为max_steer_angle表示该车辆最大的前轮转角,对于vehicle.tesla.model3是70度,也就是说如果你通过接口发送steer的量为0.5,那么车辆会执行0.5 * 70 = 35度的前轮转角,不过由于转向梯形的存在,实际上这个时候是右前轮右转35度,而左前轮会右转一个小于35度的角度。反之亦然,如果发送-0.5,那么就是左轮左转35度,右轮左转一个小于35度的角度。
那么自动驾驶时呢,就需要标定前轮转角和实际曲率的关系,这里以vehicle.tesla.model3为实验车辆。
| steer | 左前轮(左转为正) | 右前轮(左转为正) | 实际路径曲率(左转为正) |
|---|---|---|---|
| -0.4 | 28° | 22.3229° | 0.1462 |
| -0.3 | 21° | 17.5611° | 0.1121 |
| -0.2 | 14° | 12.3545° | 0.0758 |
| -0.1 | 7° | 6.5576° | 0.0392 |
| -0.05 | 3.5° | 3.3854° | 0.01975 |
| -0.02 | 1.4° | 1.3813° | 0.0080 |
| -0.01 | 0.7° | 0.6953° | 0.0040 |
| 名义控制量(-steer)/u | 实际路径曲率/k |
|---|---|
| 0.4 | 0.1462 |
| 0.3 | 0.1121 |
| 0.2 | 0.0758 |
| 0.1 | 0.0392 |
| 0.05 | 0.01975 |
| 0.02 | 0.0080 |
| 0.01 | 0.0040 |
注意到ackermann运动学关系为:
\[k = \frac{1}{R} = \frac{\tan(\delta)}{L}\]而 $\tan(\delta)$ 可以被泰勒级数展开:
\[\tan(\delta) = \delta + \frac{1}{3}\delta^3 + \frac{2}{15}\delta^5 + \dots\]这里就用三次函数来进行拟合,拟合结果是:
\(k = 0.045407365999453636 * u^3 + -0.1032605725745423 * u^2 + 0.3997019204703261 * u\) \(u = -0.748291607126577 * k^3 + 1.718887821431124 * k^2 + 2.499327137790437 * k\)
这里顺带聊一下自动驾驶转向标定好了,这个话题其是可以拿出来单写一篇博客了,这里就随性写一下吧。
一般来说,这个工作主要涉及三个状态量,方向盘转角、前轮转角和实际转向曲率,而我们的目的就是通过控制某个转角来使车辆达到我们的期望曲率,或者通过某个转角得到当前的状态曲率。
系统性的聊这个事还挺难的,现在夜里一点了,有点困了,列几个点好了。
- Ackermann转向模型
- 实际转向梯形通常不会完全符合该模型
- 速度达到一定程度时,轮胎动力学的影响也会有所体现
- 方向盘转角与前轮转角之间的关系
- 一般来说,应考虑他们之间存在非线性关系
- 方向盘转角零位附近,可能存在“死区”,或者更一般的说,考虑实际的转向机构,在任何转角下,如果方向盘转动的方向改变,由于机械公差/间隙的存在,会导致方向盘产生自由行程。针对不同转向机构,这个现象的表现也会不一样,具体现象具体分析。
- 方向盘零位可能存在漂移或偏差,致使方向盘转角0不对应曲率0.
- 转向系统可能存在非对称性,比如左转和右转的对应关系存在差异,不符合理论上的奇函数性质。
实际上,很多细节问题大部分人可能都遇不到,你会发现直接用理论阿克曼模型也没什么问题,一来你对跟踪精度的要求可能没那么高,二来运动控制算法周期性的闭环调整不断弥补理论模型和实际响应的偏差,使其看起来也还凑合。也有可能木桶的短板还没有到这里。
聊点题外话,从转向标定到横向控制,我遇到一些搞“学术”的同学做的东西落不了地,一些做工程的同学解决问题又找不到门路。学术、工程,好像这是两个门派似的。理论要和实际结合的嘛!
比方说当一个方向盘转角和前轮转角之间的比例关系非线性时,我标定了一个固定比例系数然后开始测试我的“伟大”算法,在自动驾驶时表现出明显的转向不足或转向过度,我来一句:理论和实际存在差异。这合适吗?这对吗?对理论的理解浅显至此。
不说这个了,现实情况可能比我说的离谱。
继续CARLA中转角标定,可以看到我做的其实很随意(不是不认真哈,我很严谨的),只做了单边,假定不存在零位偏差,简单用一个三次多项式拟合。这是因为在仿真世界中我可以猜测某些预设是大概率满足的,一旦这个标定结果在控制算法中应用表现不符合预期,我会重新探究。
实车的转向标定理论没什么区别,操作可能有些不同。还是那句:实事求是。
About Steer Again
事实上上一节做的工作就是不够的,在应用过程中我发现Carla中每个车辆存在其steering_curve,基于默认的设置,随着速度增加,相同steer commnad对应的前轮转角会相应衰减,参见此处。
同时,车轮也可以设置侧偏刚度等属性,为此就需要找不同速度下差异或规律。
取消转向衰减
为了方便,我修改了默认的steering_curve,使其在任意速度下无转角衰减。并获得如下简单测试数据:
vehicle.tesla.model3的轴距是3米。此为CARLA中实测数据。 关于Tesla Model 3 轴距这项数据Tesla官网给出的数值是2.875m.
固定速度为2m/s时:
| steer | 左前轮 | 右前轮 | 路径曲率 | 平均转角 | 阿克曼转角 | 平均转角对应轴距 |
|---|---|---|---|---|---|---|
| -0.5 | 35° | 26.7624° | 0.1803 | 30.8812° | ° | 3.5768 |
| -0.4 | 28° | 22.3229° | 0.1476 | 25.1615° | ° | 3.3221 |
| -0.3 | 21° | 17.5611° | 0.1130 | 19.2806° | ° | 3.1629 |
| -0.2 | 14° | 12.3545° | 0.0765 | 13.1773° | ° | 3.0831 |
| -0.1 | 7° | 6.5576° | 0.0389 | 6.7788° | ° | 3.0323 |
| -0.05 | 3.5° | 3.3854° | 0.01982 | |||
| -0.02 | 1.4° | 1.3813° | 0.00795 | |||
| -0.01 | 0.7° | 0.6953° | 0.00406 |
\(k = -0.03460789340888048 * u^3 + -0.051286918382163205 * u^2 + 0.39494640873500014 * u\) \(u = 3.8175663566084244 * k^3 + 0.6079876995025626 * k^2 + 2.5387296973979265 * k\)
固定速度为5m/s时:
| steer | 左前轮 | 右前轮 | 路径曲率 | 平均转角 | 阿克曼转角 | 平均转角对应轴距 |
|---|---|---|---|---|---|---|
| -0.5 | 35° | 26.7624° | 0.1672 | 30.8812° | 26.6383° | 3.5768 |
| -0.4 | 28° | 22.3229° | 0.1414 | 25.1615° | 22.9867° | 3.3221 |
| -0.3 | 21° | 17.5611° | 0.1106 | 19.2806° | 18.3558° | 3.1629 |
| -0.2 | 14° | 12.3545° | 0.07594 | 13.1773° | 12.8341° | 3.0831 |
| -0.1 | 7° | 6.5576° | 0.0392 | 6.7788° | 6.7072° | 3.0323 |
\(k = -0.1546861714169055 * u^3 + -0.046865756743190545 * u^2 + 0.3966264819991989 * u\) \(u = 22.730383372224484 * k^3 + -1.4339936276372356 * k^2 + 2.589774451036936 * k\)
固定速度为10m/s时:
| steer | 左前轮 | 右前轮 | 路径曲率 | 平均转角 | 阿克曼转角 | 平均转角对应轴距 |
|---|---|---|---|---|---|---|
| -0.5 | 35° | 26.7624° | 0.1498 | 30.8812° | 24.1992° | 3.9923 |
| -0.4 | 28° | 22.3229° | 0.1330 | 25.1615° | 21.7520° | 3.5319 |
| -0.3 | 21° | 17.5611° | 0.1061 | 19.2806° | 17.6563° | 3.2970 |
| -0.2 | 14° | 12.3545° | 0.0750 | 13.1773° | 12.6804° | 3.1217 |
| -0.1 | 7° | 6.5576° | 0.0388 | 6.7788° | 6.6394° | 3.0636 |
\(k = -0.30150386434439463 * u^3 + -0.03785429760222192 * u^2 + 0.39428942750543206 * u\) \(u = 77.70870686865365 * k^3 + -8.290894568640173 * k^2 + 2.8037218747115045 * k\)
取消转向衰减,增大侧偏刚度
除取消转向衰减外,修改如下属性:
for (auto &wheel : pc.wheels) {
wheel.lat_stiff_value = 3000;
wheel.lat_stiff_max_load = 8;
}
固定速度为10m/s时:
| steer | 左前轮 | 右前轮 | 路径曲率 | 平均转角 | 阿克曼转角 | 平均转角对应轴距 |
|---|---|---|---|---|---|---|
| -0.5 | 35° | 26.7624° | 0.1376 | 30.8812° | ° | 3.9923 |
取消转向衰减,减小侧偏刚度
除取消转向衰减外,修改如下属性:
for (auto &wheel : pc.wheels) {
wheel.lat_stiff_value = 5;
}
固定速度为10m/s时:
| steer | 左前轮 | 右前轮 | 路径曲率 | 平均转角 | 阿克曼转角 | 平均转角对应轴距 |
|---|---|---|---|---|---|---|
| -0.5 | 35° | 26.7624° | 0.1624 | 30.8812° | ° | 3.9923 |
取消转向衰减,侧偏刚度为0
除取消转向衰减外,修改如下属性:
for (auto &wheel : pc.wheels) {
wheel.lat_stiff_value = 0;
}
显示异常如下:

取消转向衰减,减小侧偏刚度为1
除取消转向衰减外,修改如下属性:
for (auto &wheel : pc.wheels) {
wheel.lat_stiff_value = 1;
}
车辆行驶表现异常
取消转向衰减,减小侧偏刚度为1,并作其他修改
除取消转向衰减外,修改如下属性:
for (auto &wheel : pc.wheels) {
wheel.lat_stiff_value = 20. / 20.;
wheel.lat_stiff_max_load = 3. / 20.;
}
固定速度为5m/s时:
| steer | 左前轮 | 右前轮 | 路径曲率 | 平均转角 | 阿克曼转角 | 平均转角对应轴距 |
|---|---|---|---|---|---|---|
| -0.5 | 35° | 26.7624° | 0.1612 | 30.8812° | ° | 3.9923 |
行驶路径如下:

固定速度为10m/s时:
| steer | 左前轮 | 右前轮 | 路径曲率 | 平均转角 | 阿克曼转角 | 平均转角对应轴距 |
|---|---|---|---|---|---|---|
| -0.5 | 35° | 26.7624° | 0.1581 | 30.8812° | ° | 3.9923 |
行驶路径如下:

注意到路径起始段收敛表现欠佳,让我们看看默认配置下固定速度为5m/s时的行使表现如下:

对比效果显而易见了。
Other
https://carla-assets.s3.us-east-005.backblazeb2.com/20221201_5ec9328.tar.gz
https://leaderboard.carla.org/
https://eval.ai/web/challenges/challenge-page/2098/overview
https://eval.ai/web/challenges/challenge-page/1856
https://www.nuscenes.org/nuplan
- carla配置文件
修改配置文件来永久改变渲染设置,路径一般在CARLA安装目录的
Config文件夹下,例如:[SystemSettings] r.ViewDistanceScale=0.1 r.SkeletalMeshLODBias=5 r.ShadowQuality=0 r.LightFunctionQuality=0 r.TextureQuality=0 r.FilterQuality=0 r.Streaming.MipBias=4 r.MaxAnisotropy=0 r.Streaming.LimitPoolSizeToVRAM=1 r.Streaming.PoolSize=200 r.Foliage.DensityScale=0 r.LandscapeLODBias=3 r.MotionBlurQuality=0 r.AmbientOcclusionLevels=0 r.AmbientOcclusionRadiusScale=0.1 r.DepthOfFieldQuality=0 r.RenderTargetPoolMin=400 r.LensFlareQuality=0 r.SceneColorFringeQuality=0 r.EyeAdaptationQuality=0 r.BloomQuality=0 - 关闭无关地图细节
有时候,简化地图或使用特定设计的低复杂度地图也可以显著提高性能:# 使用一个基础的测试地图 ./CarlaUE4.sh /Game/Maps/Minimal