[8.0.0][Opt]优化决策、预测地图渲染

This commit is contained in:
chenfufeng
2025-05-20 10:34:18 +08:00
parent 8d762c3178
commit 89641b48df
12 changed files with 173 additions and 83 deletions

View File

@@ -16,6 +16,10 @@ interface Identify {
}
fun renderAdasRegResults(resultList: List<TrackedObject>?, mapObjList: List<String>) {
}
fun renderAiCloudResult(resultList: List<SocketDownData.CloudRoadDataProto>, mapInstance:String) {
}
@@ -40,6 +44,10 @@ interface Identify {
}
fun clearOldMarkers(mapObjList:List<String>) {
}
fun clearAiMarker(mapInstance:String) {
}

View File

@@ -33,8 +33,9 @@ object IdentifyFactory : Identify, IMoGoObuStatusListener, IMoGoAutopilotCarConf
// 预测
object PreDriverIdentify {
internal val preDataDrawer = IdentifyPredictionDataDrawer()
// internal val preDataDrawer2 = IdentifyPredictionDataDrawer()
internal val preDataDrawer = IdentifyOriginDataDrawer()
// internal val preDataDrawer2 = IdentifyPredictionDataDrawer()
// internal val preDataDrawer3 = IdentifyPredictionDataDrawer()
internal val preDataDrawer2 = IdentifyOriginDataDrawer()
internal val preDataDrawer3 = IdentifyOriginDataDrawer()
@@ -47,16 +48,19 @@ object IdentifyFactory : Identify, IMoGoObuStatusListener, IMoGoAutopilotCarConf
private var identify: Identify = DriverIdentify.originDataDrawer
private var aiCloudIdentify: Identify? = null
// 预测
private var preIdentify: Identify = PreDriverIdentify.preDataDrawer
private var preIdentify2: Identify = PreDriverIdentify.preDataDrawer2
private var preIdentify3: Identify = PreDriverIdentify.preDataDrawer3
// private var preIdentify2: Identify = PreDriverIdentify.preDataDrawer2
// private var preIdentify3: Identify = PreDriverIdentify.preDataDrawer3
// 决策
private var desIdentify: Identify = DesDriverIdentify.desDataDrawer
private var startTime: Long = 0L
private var preStartTime: Long = 0L
private var desStartTime: Long = 0L
// private var preStartTime: Long = 0L
// private var desStartTime: Long = 0L
private var dockerVersion: String? = null
fun initType() {
@@ -96,33 +100,24 @@ object IdentifyFactory : Identify, IMoGoObuStatusListener, IMoGoAutopilotCarConf
if (internal >= 1000) {
lostFrame(internal.toString())
identify.clearOldMarker()
}
if (FunctionBuildConfig.isDrawPreIdentifyData && TimeUnit.NANOSECONDS.toMillis(System.nanoTime() - preStartTime) >= 1000) {
preIdentify.clearOldMarker()
}
if (FunctionBuildConfig.isDrawDecIdentifyData && TimeUnit.NANOSECONDS.toMillis(System.nanoTime() - desStartTime) >= 1000) {
desIdentify.clearOldMarker()
preIdentify2.clearOldMarker()
preIdentify3.clearOldMarker()
}
sendEmptyMessageDelayed(MSG_CHECK, 1000L)
}
MSG_DATA_TRACK -> {
if (msg.obj is List<*>) {
val objectList = msg.obj as List<TrackedObject>?
identify.renderAdasRecognizedResult(objectList)
val mapInstanceList = ArrayList<String>()
mapInstanceList.add(MogoMap.DEFAULT)
// if (FunctionBuildConfig.isDrawDecIdentifyData) {
// mapInstanceList.add(MogoMap.SMALL_DES_MAP)
// }
if (FunctionBuildConfig.isDrawPreIdentifyData) {
mapInstanceList.add(MogoMap.SMALL_PRED_MAP)
}
identify.renderAdasRegResults(objectList, mapInstanceList)
startTime = System.nanoTime()
if (FunctionBuildConfig.isDrawDecIdentifyData) {
desIdentify.renderAdasRegResult(objectList, MogoMap.SMALL_DES_MAP)
desStartTime = System.nanoTime()
}
if (FunctionBuildConfig.isDrawPreIdentifyData) {
preIdentify2.renderAdasRegResult(objectList, MogoMap.SMALL_PRED_MAP2)
preIdentify3.renderAdasRegResult(objectList, MogoMap.SMALL_PRED_MAP3)
preStartTime = System.nanoTime()
}
}
}
@@ -138,7 +133,7 @@ object IdentifyFactory : Identify, IMoGoObuStatusListener, IMoGoAutopilotCarConf
MSG_DATA_PRE_TRACK -> {
if (msg.obj is List<*>) {
val objectList = msg.obj as List<Prediction2025.mPredictionObjectApp>
preIdentify.renderPredictionResult(objectList, MogoMap.SMALL_PRED_MAP)
// preIdentify.renderPredictionResult(objectList, MogoMap.SMALL_PRED_MAP)
// preIdentify2.renderPredictionResult(objectList, MogoMap.SMALL_PRED_MAP2)
// preIdentify3.renderPredictionResult(objectList, MogoMap.SMALL_PRED_MAP3)
}
@@ -163,7 +158,10 @@ object IdentifyFactory : Identify, IMoGoObuStatusListener, IMoGoAutopilotCarConf
}
MSG_DATA_CLEAR -> {
identify.clearOldMarker()
val mapInstanceList = ArrayList<String>()
mapInstanceList.add(MogoMap.DEFAULT)
mapInstanceList.add(MogoMap.SMALL_PRED_MAP)
identify.clearOldMarkers(mapInstanceList)
}
MSG_DATA_AI_CLEAR -> {
@@ -172,8 +170,8 @@ object IdentifyFactory : Identify, IMoGoObuStatusListener, IMoGoAutopilotCarConf
MSG_DATA_PRE_CLEAR -> {
preIdentify.clearPredictionMarker(MogoMap.SMALL_PRED_MAP)
preIdentify2.clearPredictionMarker(MogoMap.SMALL_PRED_MAP2)
preIdentify3.clearPredictionMarker(MogoMap.SMALL_PRED_MAP3)
// preIdentify2.clearPredictionMarker(MogoMap.SMALL_PRED_MAP2)
// preIdentify3.clearPredictionMarker(MogoMap.SMALL_PRED_MAP3)
}
}
}

View File

@@ -126,6 +126,49 @@ class IdentifyOriginDataDrawer : Identify {
}
}
override fun renderAdasRegResults(resultList: List<TrackedObject>?, mapObjList: List<String>) {
if (resultList.isNullOrEmpty()) {
clearOldMarker()
return
}
if (!MogoStatusManager.getInstance().isVrMode) {
clearOldMarker()
return
}
//清除缓存
for (data in resultList) {
if (trafficDataUuidList.size > 0 && trafficDataUuidList.contains(data.uuid.toString())) {
if (TrackerSourceFilterHelper.filterData(data)) {
continue
}
trafficDataUuidList.remove(data.uuid.toString())
}
}
//清除缓存,删除marker
val it: MutableIterator<*> = trafficDataUuidList.iterator()
while (it.hasNext()) {
val key = it.next() as String
it.remove()
mMarkersCaches.remove(key)
mapObjList.forEach {
MogoIdentifyManager.getInstance()
.removeMarker(key, it)
}
TrackerSourceFilterHelper.removeBottomMarker(key)
}
val filterList = filterTrafficData(resultList)
if (filterList.size > 0) {
// 绘制新数据
mapObjList.forEach {
MogoIdentifyManager.getInstance()
.updateBatchMarkerPosition(filterList, it)
}
}
}
/**
* 数据过滤器
*
@@ -169,4 +212,16 @@ class IdentifyOriginDataDrawer : Identify {
WarningHelper.clear()
}
override fun clearOldMarkers(mapObjList: List<String>) {
for (uuid in trafficDataUuidList) {
mapObjList.forEach {
MogoIdentifyManager.getInstance()
.removeMarker(uuid, it)
}
TrackerSourceFilterHelper.removeBottomMarker(uuid)
}
trafficDataUuidList.clear()
mMarkersCaches.clear()
WarningHelper.clear()
}
}

View File

@@ -48,8 +48,8 @@ class IdentifyPredictionDataDrawer : Identify {
}
//清除缓存
for (data in predictionObjectList) {
if (trafficDataUuidList.size > 0 && trafficDataUuidList.contains("" + data.mNid)) {
trafficDataUuidList.remove("" + data.mNid)
if (trafficDataUuidList.size > 0 && trafficDataUuidList.contains("${data.mNid-800000}")) {
trafficDataUuidList.remove("${data.mNid-800000}")
}
}
@@ -81,7 +81,7 @@ class IdentifyPredictionDataDrawer : Identify {
mFilterTrafficData.clear()
trafficDataUuidList.clear()
for (data in trafficData) {
val uuid = "" + data.mNid
val uuid = "${data.mNid-800000}"
mMarkersCaches[uuid] = data
trafficDataUuidList.add(uuid)
mFilterTrafficData[uuid] = data

View File

@@ -1,5 +1,6 @@
package com.mogo.eagle.core.function.business.identify
import android.util.Log
import com.mogo.eagle.core.data.config.FunctionBuildConfig
import com.mogo.eagle.core.data.map.MogoLocation
import com.mogo.eagle.core.data.traffic.TrafficData
@@ -9,11 +10,12 @@ import com.mogo.eagle.core.function.api.datacenter.obu.IMoGoObuStatusListener
import com.mogo.eagle.core.function.business.routeoverlay.PredictionOverlayDrawer
import com.mogo.eagle.core.function.business.routeoverlay.PredictionOverlayDrawer2
import com.mogo.eagle.core.function.call.autopilot.CallerAutopilotIdentifyListenerManager
import com.mogo.eagle.core.function.call.autopilot.CallerChassisLocationWGS84ListenerManager.getChassisLocationWGS84
import com.mogo.eagle.core.function.call.obu.CallerObuWarningListenerManager
import com.mogo.eagle.core.function.utils.LocationUtils
import com.mogo.eagle.core.utilcode.util.ThreadUtils
import com.mogo.map.MogoMap
import com.mogo.map.identify.MogoIdentifyManager
import com.mogo.map.utils.LocationUtils
import mogo.telematics.pad.MessagePad
import mogo.telematics.pad.MessagePad.TrackedObject
import mogo.yycp.api.proto.SocketDownData
@@ -69,12 +71,15 @@ class MapIdentifySubscriber private constructor() : IMoGoSubscriber,
private var carPoiList2: List<geometry.Geometry.Point>? = null
private var location1: MogoLocation? = null
private var location2: MogoLocation? = null
private var probability1: Float = 0f
private var probability2: Float = 0f
override fun onPredictionObstacleTrajectory(predictionObjects: Prediction2025.mPredictionObjects) {
if (FunctionBuildConfig.isDrawPreIdentifyData) {
try {
ThreadUtils.getSinglePool().execute {
// 渲染它车
IdentifyFactory.renderPredictionResult(predictionObjects.objsAppList)
// // 渲染它车
// IdentifyFactory.renderPredictionResult(predictionObjects.objsAppList)
// 渲染自车
predictionObjects.objsAppList.forEach { preObj ->
if (preObj.mNid == 800000L) {
@@ -83,18 +88,22 @@ class MapIdentifySubscriber private constructor() : IMoGoSubscriber,
carPoiList1 = preObj.predictionTrajectoryList[0].trajectoryPointsList
carPoiList2 = preObj.predictionTrajectoryList[1].trajectoryPointsList
val largeType: Int
location1 = LocationUtils.generateLocation(carPoiList1!![0].x, carPoiList1!![0].y, carPoiList1!![1].x, carPoiList1!![1].y)
location2 = LocationUtils.generateLocation(carPoiList2!![0].x, carPoiList2!![0].y, carPoiList2!![1].x, carPoiList2!![1].y)
val heading = getChassisLocationWGS84().heading
location1 = LocationUtils.generateLocation(carPoiList1!![0].x, carPoiList1!![0].y, heading)
location2 = LocationUtils.generateLocation(carPoiList2!![0].x, carPoiList2!![0].y, heading)
if (location1 == null || location2 == null) return@forEach
if (preObj.predictionTrajectoryList[0].predictionProbability >= preObj.predictionTrajectoryList[1].predictionProbability) {
probability1 = preObj.predictionTrajectoryList[0].predictionProbability
probability2 = preObj.predictionTrajectoryList[1].predictionProbability
CallerAutopilotIdentifyListenerManager.invokeProbabilityChanged(probability1, probability2)
if (probability1 >= probability2) {
MogoIdentifyManager.getInstance().updateGps(location1!!, MogoMap.SMALL_PRED_MAP)
largeType = 2
} else {
MogoIdentifyManager.getInstance().updateGps(location2!!, MogoMap.SMALL_PRED_MAP)
largeType = 3
}
PredictionOverlayDrawer.getInstance().drawPredictionList(carPoiList1, location1!!.heading, false, 2, largeType)
PredictionOverlayDrawer2.getInstance().drawPredictionList(carPoiList2, location2!!.heading, false, 3, largeType)
PredictionOverlayDrawer.getInstance().drawPredictionList(carPoiList1, heading, false, 2, largeType)
PredictionOverlayDrawer2.getInstance().drawPredictionList(carPoiList2, heading, false, 3, largeType)
MogoIdentifyManager.getInstance().updateGps(location1!!, MogoMap.SMALL_PRED_MAP2)
MogoIdentifyManager.getInstance().updateGps(location2!!, MogoMap.SMALL_PRED_MAP3)
}

View File

@@ -234,7 +234,7 @@ public class PredictionOverlayDrawer {
Polyline.Options.Builder builder;
if (mPolylineOptions == null) {
builder = new Polyline.Options.Builder("router_overlay", Level.GUIDE_ROUTE_LINE)
builder = new Polyline.Options.Builder("prediction_overlay" + preViewType, Level.GUIDE_ROUTE_LINE)
.setUseGps(true)
.setWidth(20)
.setIsGradient(true);
@@ -280,9 +280,6 @@ public class PredictionOverlayDrawer {
} else if (preViewType == 3) {
overlayManager.showOrUpdateLine(options, SMALL_PRED_MAP3);
}
if (preViewType == largeType) {
overlayManager.showOrUpdateLine(options, SMALL_PRED_MAP);
}
}
} else {
isExcept = true;
@@ -311,11 +308,10 @@ public class PredictionOverlayDrawer {
}
private volatile RenderTask mPreRenderTask;
private volatile RenderTask mPreRenderTask2;
public void drawPredictionList(List<geometry.Geometry.Point> dataList, double bearing, boolean hasGreenWave, int preType, int largeType) {
IMogoMap iMogoMap = MogoMap.Companion.getMapInstance().getMogoMap(DEFAULT);
double[] arr = null;
double[] arr;
if (mogoOverlayManager != null && iMogoMap != null) {
if (mPreRenderTask == null) {
mPreRenderTask = new RenderTask();
@@ -335,28 +331,6 @@ public class PredictionOverlayDrawer {
}
}
public void drawPredictionList2(List<geometry.Geometry.Point> dataList, double bearing, boolean hasGreenWave, int preType, int largeType) {
IMogoMap iMogoMap = MogoMap.Companion.getMapInstance().getMogoMap(DEFAULT);
double[] arr = null;
if (mogoOverlayManager != null) {
if (mPreRenderTask2 == null) {
mPreRenderTask2 = new RenderTask();
}
List<MogoLatLng> latLngList = new ArrayList<>();
for (geometry.Geometry.Point point : dataList) {
arr = iMogoMap.switchData(point.getX(), point.getY(), false);
if (arr == null || arr.length < 2) continue;
latLngList.add(new MogoLatLng(arr[0], arr[1]));
}
if (latLngList.isEmpty()) return;
mPreRenderTask2.setPreData(latLngList, bearing, hasGreenWave, preType, largeType);
if (mRenderHandler != null) {
mRenderHandler.removeCallbacks(mPreRenderTask2);
mRenderHandler.post(mPreRenderTask2);
}
}
}
public void setVisible(boolean isVisible) {
if (mogoOverlayManager != null) {
if (isVisible) {

View File

@@ -51,7 +51,7 @@ public class PredictionOverlayDrawer2 {
mogoOverlayManager = CallerMapUIServiceManager.INSTANCE.getOverlayManager();
if (mogoOverlayManager != null) {
// 线条粗细,渐变,渐变色值
HandlerThread renderTask = new HandlerThread("prediction_render") {
HandlerThread renderTask = new HandlerThread("prediction_render2") {
@Override
protected void onLooperPrepared() {
super.onLooperPrepared();
@@ -232,7 +232,7 @@ public class PredictionOverlayDrawer2 {
Polyline.Options.Builder builder;
if (mPolylineOptions == null) {
builder = new Polyline.Options.Builder("router_overlay", Level.GUIDE_ROUTE_LINE)
builder = new Polyline.Options.Builder("prediction_overlay" + preViewType, Level.GUIDE_ROUTE_LINE)
.setUseGps(true)
.setWidth(20)
.setIsGradient(true);
@@ -278,9 +278,6 @@ public class PredictionOverlayDrawer2 {
} else if (preViewType == 3) {
overlayManager.showOrUpdateLine(options, SMALL_PRED_MAP3);
}
if (preViewType == largeType) {
overlayManager.showOrUpdateLine(options, SMALL_PRED_MAP);
}
}
} else {
isExcept = true;

View File

@@ -1,26 +1,41 @@
package com.mogo.eagle.core.function.view
import android.annotation.SuppressLint
import android.content.Context
import android.os.Bundle
import android.util.AttributeSet
import android.view.LayoutInflater
import androidx.constraintlayout.widget.ConstraintLayout
import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotIdentifyListener
import com.mogo.eagle.core.function.call.autopilot.CallerAutopilotIdentifyListenerManager
import com.mogo.eagle.core.function.map.R
import com.mogo.eagle.core.utilcode.util.ThreadUtils
import kotlinx.android.synthetic.main.layout_decision_container.view.decMapView
import kotlinx.android.synthetic.main.layout_decision_container.view.preDetailView2
import kotlinx.android.synthetic.main.layout_decision_container.view.preDetailView3
import kotlinx.android.synthetic.main.layout_decision_container.view.tvPre1
import kotlinx.android.synthetic.main.layout_decision_container.view.tvPre2
import kotlinx.android.synthetic.main.layout_decision_container.view.tvPre3
class DecisionLayout @JvmOverloads constructor(
context: Context,
attrs: AttributeSet? = null
) : ConstraintLayout(context, attrs) {
) : ConstraintLayout(context, attrs), IMoGoAutopilotIdentifyListener {
companion object {
private const val TAG = "DecisionLayout"
}
@Volatile
private var lastTime = 0L
init {
LayoutInflater.from(context).inflate(R.layout.layout_decision_container, this, true)
initView()
}
private fun initView() {
CallerAutopilotIdentifyListenerManager.addListener(TAG, this)
}
fun onCreate(savedInstanceState: Bundle?) {
@@ -41,6 +56,30 @@ class DecisionLayout @JvmOverloads constructor(
preDetailView3.onResume()
}
@SuppressLint("SetTextI18n")
override fun onPredictionProbabilityChanged(pro1: Float, pro2: Float) {
if (System.currentTimeMillis() - lastTime >= 1000) {
ThreadUtils.runOnUiThread {
val prob1: Int
val prob2: Int
val prob3: Int
if (pro1 + pro2 < 50) {
prob1= (pro1*100).toInt()
prob3= (pro2*100).toInt()
prob2 = 100 - prob1 - prob3
} else {
prob1 = 15 * (pro1 / (pro1 + pro2)).toInt()
prob3 = 15 * (pro2 / (pro1 + pro2)).toInt()
prob2 = 100 - prob1 - prob3
}
tvPre1.text = "${prob1}%"
tvPre3.text = "${prob3}%"
tvPre2.text = "${prob2}%"
}
lastTime = System.currentTimeMillis()
}
}
fun onLowMemory() {
decMapView.onLowMemory()
preDetailView2.onLowMemory()

View File

@@ -60,4 +60,5 @@ interface IMoGoAutopilotIdentifyListener {
*/
fun onAutopilotV2nCongestionEvent(header: MessagePad.Header, rsi: MogoV2X.RSI_PB) {}
fun onPredictionProbabilityChanged(pro1: Float, pro2: Float) {}
}

View File

@@ -66,4 +66,11 @@ object CallerAutopilotIdentifyListenerManager : CallerBase<IMoGoAutopilotIdentif
listener.onAutopilotV2nCongestionEvent(header, rsi)
}
}
fun invokeProbabilityChanged(pro1: Float, pro2: Float) {
M_LISTENERS.forEach {
val listener = it.value
listener.onPredictionProbabilityChanged(pro1, pro2)
}
}
}

View File

@@ -1,4 +1,4 @@
package com.mogo.eagle.core.function.utils
package com.mogo.map.utils
import com.mogo.eagle.core.data.map.MogoLocation
import com.mogo.eagle.core.utilcode.util.DrivingDirectionUtils

View File

@@ -7,8 +7,8 @@ import android.view.View;
import com.mogo.eagle.core.data.config.FunctionBuildConfig;
import com.mogo.eagle.core.data.map.MogoLatLng;
import com.mogo.eagle.core.data.map.MogoLocation;
import com.mogo.eagle.core.utilcode.mogo.AppIdentityModeUtils;
import com.mogo.eagle.core.utilcode.util.DrivingDirectionUtils;
import com.mogo.map.overlay.line.Polyline;
import com.mogo.map.overlay.point.Point;
import com.mogo.map.uicontroller.MapCameraPosition;
@@ -196,14 +196,16 @@ public class ObjectUtils {
return null;
}
MarkerSimpleData markerOptions = null;
MogoLocation location = getPreLocation(preData);
if (location == null) return null;
try {
markerOptions = new MarkerSimpleData();
markerOptions.setId(preData.getMNid());
markerOptions.setId(preData.getMNid()-800000);
markerOptions.setMarkerType(trackedObjectTypeTransform(preData.getClasstype()));
markerOptions.setRotateAngle(getPredictionHeading(preData));
markerOptions.setRotateAngle((float) location.getHeading());
// 自车2条轨迹它车1条轨迹每条轨迹的第一个点为位置其它点为预测轨迹点
markerOptions.setLat(preData.getPredictionTrajectoryList().get(0).getTrajectoryPointsList().get(0).getX());
markerOptions.setLon(preData.getPredictionTrajectoryList().get(0).getTrajectoryPointsList().get(0).getY());
markerOptions.setLat(location.getLatitude());
markerOptions.setLon(location.getLongitude());
// marker做动画时需用到(要么一直不传,要么一直都传)
// markerOptions.setTime(Double.valueOf(preData.getSatelliteTime() * 1000).longValue());
markerOptions.setColor("#90ABCAFF");
@@ -231,12 +233,12 @@ public class ObjectUtils {
return classID.getNumber();
}
private static float getPredictionHeading(Prediction2025.mPredictionObjectApp preData) {
private static MogoLocation getPreLocation(Prediction2025.mPredictionObjectApp preData) {
List<geometry.Geometry.Point> pointList = preData.getPredictionTrajectoryList().get(0).getTrajectoryPointsList();
if (pointList.size() >= 2) {
return (float) DrivingDirectionUtils.getLineAngle(pointList.get(0).getX(), pointList.get(0).getY(), pointList.get(1).getX(), pointList.get(1).getY());
return LocationUtils.INSTANCE.generateLocation(pointList.get(0).getX(), pointList.get(0).getY(), pointList.get(1).getX(), pointList.get(1).getY());
} else {
return 0;
return null;
}
}