【发布时间】:2019-11-19 09:23:44
【问题描述】:
我目前正在使用 Ray-cast 开发激光雷达传感器模型。以 10Hz 旋转的 16 通道传感器应产生 300000 个点。我可以使用 300000 次 Ray-cast 操作来获得这个结果,但性能非常弱(当传感器运动时帧速率下降到 8)。我可以使用其他更好的方法或算法吗?
要求:
- 360 度扫描:水平
- -25 到 15 度:垂直
- 300000 次扫描
这是我正在使用的:
for (auto i = 0u; i < 3125; ++i){
for (auto Channel = 0u; Channel < 16; ++Channel){
FVector Point(0,0,0);
float DistanceToHitPoint = 0;
uint8_t Row = 0;
uint8_t Class = 0u;
double Intensity = 0;
float Aoi = 0;
const float Angle = std::fmod(CurrentHorizontalAngle + AngleDistanceOfLaserMeasure * i, 360.0f);
auto timestamp = static_cast<uint32_t>(GetEpisode().GetElapsedGameTime()* pow(10,6));
ShootLaser(Channel, Angle, Point, DistanceToHitPoint, Row, Aoi, Class);
if(Description.EnergyEffect && (DistanceToHitPoint != 0)){
bool isQualified = IsPointIntensityValid(DistanceToHitPoint, Aoi, "test", Row, Intensity);
LidarMeasurement.WritePoint(Channel, Point, Intensity, Class);
LidarServer.fill_block(Angle, DistanceToHitPoint, Row, Description.ReturnMode, timestamp);
continue;
}
LidarMeasurement.WritePoint(Channel, Point, Intensity, Class);
LidarServer.fill_block(Angle, DistanceToHitPoint, Row, Description.ReturnMode, timestamp);
}
}
const float HorizontalAngle = std::fmod(CurrentHorizontalAngle + AngleDistanceOfTick, 360.0f);
LidarMeasurement.SetHorizontalAngle(HorizontalAngle);
使用上述代码每秒进行 1500000 次 Raycast 操作。我试图在 0.033 秒(30fps)内运行循环。但是,运行此代码后,模拟 fps 变为 2 或 3 fps。有没有其他方法可以更有效地使用 Raycast。
【问题讨论】: