From 8d784b4014956ef1d876e5c7cfb4ff4aea56d2a6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=91=A3=E5=AE=8F=E5=AE=87?= Date: Tue, 19 Oct 2021 15:14:52 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=8C=E6=88=90=E8=AF=86=E5=88=AB=E5=85=83?= =?UTF-8?q?=E7=B4=A0=E7=BB=98=E5=88=B6=E9=80=BB=E8=BE=91=E6=9B=BF=E6=8D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 董宏宇 --- .idea/misc.xml | 1 + .../CallerAutoPilotStatusListenerManager.kt | 2 +- .../mogo/module/adas/AdasEventManager.java | 17 ++ .../module/adas/OnAdasListenerAdapter.java | 2 +- .../drawer/AdasRecognizedResultDrawer.java | 2 +- .../common/drawer/IdentifyDataDrawer.java | 252 ++++++++++++++++++ .../service/marker/MapMarkerManager.java | 3 +- .../service/impl/adas/MogoADASController.java | 21 -- 8 files changed, 275 insertions(+), 25 deletions(-) create mode 100644 modules/mogo-module-common/src/main/java/com/mogo/module/common/drawer/IdentifyDataDrawer.java diff --git a/.idea/misc.xml b/.idea/misc.xml index e01f72218c..f98bdb3b31 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -13,6 +13,7 @@ + diff --git a/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/autopilot/CallerAutoPilotStatusListenerManager.kt b/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/autopilot/CallerAutoPilotStatusListenerManager.kt index c30492d5eb..03d8d9eba1 100644 --- a/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/autopilot/CallerAutoPilotStatusListenerManager.kt +++ b/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/autopilot/CallerAutoPilotStatusListenerManager.kt @@ -173,7 +173,7 @@ object CallerAutoPilotStatusListenerManager : CallerBase() { * 识别交通元素数据发生更新 回调 */ @Synchronized - fun invokeIdentifyDataUpdate(trafficData: List?) { + fun invokeAutopilotIdentifyDataUpdate(trafficData: List?) { LogUtils.dTag(TAG, "$trafficData") M_AUTOPILOT_STATUS_LISTENERS.forEach { val tag = it.key diff --git a/modules/mogo-module-adas/src/main/java/com/mogo/module/adas/AdasEventManager.java b/modules/mogo-module-adas/src/main/java/com/mogo/module/adas/AdasEventManager.java index e6fa375d17..7340e3761e 100644 --- a/modules/mogo-module-adas/src/main/java/com/mogo/module/adas/AdasEventManager.java +++ b/modules/mogo-module-adas/src/main/java/com/mogo/module/adas/AdasEventManager.java @@ -1,9 +1,12 @@ package com.mogo.module.adas; +import android.util.Log; + import androidx.annotation.NonNull; import androidx.annotation.Nullable; import com.google.gson.Gson; +import com.mogo.commons.debug.DebugConfig; import com.mogo.eagle.core.data.autopilot.AutopilotCarStateInfo; import com.mogo.eagle.core.data.autopilot.AutopilotGuardianStatusInfo; import com.mogo.eagle.core.data.autopilot.AutopilotRouteInfo; @@ -14,6 +17,8 @@ import com.mogo.eagle.core.data.traffic.TrafficData; import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotStatusListener; import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotStatusListenerManager; import com.mogo.module.adas.model.AdasServiceModel; +import com.mogo.module.common.drawer.IdentifyDataDrawer; +import com.mogo.service.statusmanager.IMogoStatusManager; import com.mogo.utils.logger.Logger; import com.mogo.utils.network.utils.GsonUtil; import com.zhidao.autopilotservice.model.AdasAIDLAutopilotStateModel; @@ -234,6 +239,18 @@ public class AdasEventManager implements OnAdasMsgConnectStatusListener, IMoGoAu @Override public void onAutopilotIdentifyDataUpdate(@Nullable List trafficData) { Logger.d(TAG, "onRectData " + trafficData); + // 仅在 vr 模式下显示 adas 识别车辆 + if (trafficData == null) { + Logger.w(TAG, "--->action is null"); + } else { + final long start = System.nanoTime(); + try { + IdentifyDataDrawer.getInstance().renderAdasRecognizedResult(trafficData); + Log.i(TAG, "接收数据 -> 发出 cost :" + TimeUnit.NANOSECONDS.toMillis((System.nanoTime() - start)) + "ms"); + } catch (Exception e) { + e.printStackTrace(); + } + } try { for (IAdasDataListener listener : iAdasEventListeners) { if (listener != null) { diff --git a/modules/mogo-module-adas/src/main/java/com/mogo/module/adas/OnAdasListenerAdapter.java b/modules/mogo-module-adas/src/main/java/com/mogo/module/adas/OnAdasListenerAdapter.java index 9931b3e9e6..1f90088712 100644 --- a/modules/mogo-module-adas/src/main/java/com/mogo/module/adas/OnAdasListenerAdapter.java +++ b/modules/mogo-module-adas/src/main/java/com/mogo/module/adas/OnAdasListenerAdapter.java @@ -37,7 +37,7 @@ public class OnAdasListenerAdapter implements OnAdasListener { @Override public void onRectData(RectInfo rectInfo) { List recognizedListResults = AdasObjectUtils.INSTANCE.regroupTrafficDataData(rectInfo.getModels()); - CallerAutoPilotStatusListenerManager.INSTANCE.invokeIdentifyDataUpdate(recognizedListResults); + CallerAutoPilotStatusListenerManager.INSTANCE.invokeAutopilotIdentifyDataUpdate(recognizedListResults); } @Override diff --git a/modules/mogo-module-common/src/main/java/com/mogo/module/common/drawer/AdasRecognizedResultDrawer.java b/modules/mogo-module-common/src/main/java/com/mogo/module/common/drawer/AdasRecognizedResultDrawer.java index 550b60c44c..377c6aab9d 100644 --- a/modules/mogo-module-common/src/main/java/com/mogo/module/common/drawer/AdasRecognizedResultDrawer.java +++ b/modules/mogo-module-common/src/main/java/com/mogo/module/common/drawer/AdasRecognizedResultDrawer.java @@ -31,7 +31,7 @@ import java.util.concurrent.TimeUnit; */ public class AdasRecognizedResultDrawer extends BaseDrawer { - private static final String TAG = "RecognizedResultDrawer"; + private static final String TAG = "AdasRecognizedResultDrawer"; private static volatile AdasRecognizedResultDrawer sInstance; diff --git a/modules/mogo-module-common/src/main/java/com/mogo/module/common/drawer/IdentifyDataDrawer.java b/modules/mogo-module-common/src/main/java/com/mogo/module/common/drawer/IdentifyDataDrawer.java new file mode 100644 index 0000000000..e2c95f4d59 --- /dev/null +++ b/modules/mogo-module-common/src/main/java/com/mogo/module/common/drawer/IdentifyDataDrawer.java @@ -0,0 +1,252 @@ +package com.mogo.module.common.drawer; + +import static com.mogo.cloud.socket.entity.SocketDownDataHelper.FROM_ADAS; + +import android.text.TextUtils; +import android.util.Log; + +import com.mogo.commons.debug.DebugConfig; +import com.mogo.eagle.core.data.map.MogoLatLng; +import com.mogo.eagle.core.data.traffic.TrafficData; +import com.mogo.map.marker.IMogoMarker; +import com.mogo.map.marker.MogoMarkerOptions; +import com.mogo.module.common.MogoApisHandler; +import com.mogo.module.common.constants.DataTypes; + +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.TimeUnit; + +/** + * @author xiaoyuzhou + * @date 2021/10/19 10:45 上午 + * 域控制器识别信息绘制 + */ +public class IdentifyDataDrawer extends BaseDrawer { + + private static final String TAG = "IdentifyDataDrawer"; + + private static volatile IdentifyDataDrawer sInstance; + + /** + * 上一帧数据的缓存 + */ + private static Map mMarkersCaches = new ConcurrentHashMap<>(); + + public IdentifyDataDrawer() { + super(); + } + + private final Map mLastPositions = new ConcurrentHashMap<>(); + + public static IdentifyDataDrawer getInstance() { + if (sInstance == null) { + synchronized (IdentifyDataDrawer.class) { + if (sInstance == null) { + sInstance = new IdentifyDataDrawer(); + } + } + } + return sInstance; + } + + public synchronized void release() { + sInstance = null; + } + + /** + * 渲染 adas 识别的数据 + * + * @param resultList adas感知融合数据 + */ + public void renderAdasRecognizedResult(List resultList) { + + final long start = System.nanoTime(); + if (resultList == null || resultList.isEmpty() || !DebugConfig.isUseAdasRecognize()) { + clearOldMarker(); + Log.w("ADAS数据延时绘制", "resultList==>" + resultList + " DebugConfig.isUseAdasRecognize()==>" + DebugConfig.isUseAdasRecognize()); + return; + } + + if (!MogoApisHandler.getInstance().getApis().getStatusManagerApi().isVrMode()) { + clearOldMarker(); + Log.w("ADAS数据延时绘制", "当前不是VR模式"); + return; + } + + + Map newAdasRecognizedMarkersCaches = new ConcurrentHashMap<>(); + List newDiffSet = new ArrayList<>(); + for (TrafficData recognizedListResult : resultList) { + + if (isUselessValue(recognizedListResult)) { + continue; + } + // 复用之前存在的 marker + String uniqueKey = recognizedListResult.getUuid(); + IMogoMarker marker = mMarkersCaches.remove(uniqueKey); + if (marker != null && !marker.isDestroyed()) { +// Log.d(TAG, "发现缓存marker id : " + uniqueKey); + updateCacheMarkerRes(marker, recognizedListResult); + renderAdasOneFrame(marker, uniqueKey, recognizedListResult, newAdasRecognizedMarkersCaches); + } else { + // 新增添加进差集 + newDiffSet.add(recognizedListResult); + } + } + removeUselessMarker(mMarkersCaches); + removeUselessLastRecord(); + int newDiffSetSize = newDiffSet.size(); +// Log.d(TAG, "原数据量 : " + resultList.size() + " 新增marker数量 : " + newDiffSetSize); + // 复用过期 marker + if (newDiffSetSize > 0) { + for (int i = 0; i < newDiffSetSize; i++) { + TrafficData recognizedListResult = newDiffSet.get(i); + String uniqueKey = recognizedListResult.getUuid(); + IMogoMarker marker = drawAdasRecognizedDataMarker(recognizedListResult); + if (marker == null) { + continue; + } +// Log.d(TAG, "新增marker id : " + uniqueKey); + renderAdasOneFrame(marker, uniqueKey, recognizedListResult, newAdasRecognizedMarkersCaches); + } + } + sendMessage(MSG_REMOVE_DIRTY_MARKERS, mMarkersCaches); + mMarkersCaches.clear(); + mMarkersCaches = newAdasRecognizedMarkersCaches; + Log.d("ADAS数据延时绘制", "render 接收数据 -> 处理结束 " + TimeUnit.NANOSECONDS.toMillis((System.nanoTime() - start)) + "ms"); + } + + /** + * todo 后面涉及到此类变化的数据均改动 + * + * @param marker + * @param recognizedListResult + */ + private void updateCacheMarkerRes(IMogoMarker marker, TrafficData recognizedListResult) { + String resIdVal; + int resId = getModelRes(recognizedListResult.getType().getType()); + resIdVal = resId + ""; + String resName = mMarkerCachesResMd5Values.get(resIdVal); + if (!TextUtils.isEmpty(resName)) { + if (!TextUtils.equals(resName, marker.getMarkerResName())) { + marker.use3DResource(resName); + } + } else { + resName = marker.use3DResource(resId); + mMarkerCachesResMd5Values.put(resIdVal, resName); + } + } + + private void removeUselessLastRecord() { // todo 最好重新设计一个数据结构,用于多线程数据过期失效的场景,参见redis数据过期 + if (mLastPositions.isEmpty()) { + return; + } + Iterator iterator = mLastPositions.values().iterator(); + Log.d("EmArrow", "removeUselessLastRecord size : " + mLastPositions.size()); + while (iterator.hasNext()) { + TrafficData result = iterator.next(); + long internal = result.getSatelliteTime() - getCurSatelliteTime(); + if (internal > 3000) { //防止帧率过低导致误删除上一个节点对象,从而出现跳跃现象 + iterator.remove(); + } + } + } + + /** + * 过滤无用数据 + * + * @param recognizedListResult {@link TrafficData} + * @return useless + */ + private boolean isUselessValue(TrafficData recognizedListResult) { + if (recognizedListResult == null) { + return true; + } + if (nonRenderType(recognizedListResult.getType().getType())) { + return true; + } + String uniqueKey = recognizedListResult.getUuid(); + return TextUtils.isEmpty(uniqueKey); + } + + /** + * 绘制某个物体的一个数据 + * + * @param recognizedListResult {@link TrafficData} + * @param newAdasRecognizedMarkersCaches 缓存集合 + */ + private void renderAdasOneFrame(IMogoMarker marker, + String uniqueKey, + TrafficData recognizedListResult, + Map newAdasRecognizedMarkersCaches) { + final long start = System.nanoTime(); +// Log.d(TAG, "renderAdasOneFrame uuid : " + uniqueKey + " type : " + recognizedListResult.type + " heading : " + recognizedListResult.heading); + TrafficData lastPosition = mLastPositions.remove(uniqueKey); + + mLastPositions.put(uniqueKey, recognizedListResult); +// Log.d(TAG, "使用缓存 id : " + uniqueKey); + long interval = 45; + if (lastPosition != null) { + interval = computeAnimDuration(lastPosition.getSatelliteTime(), recognizedListResult.getSatelliteTime()); + } + final MogoLatLng renderLoc = new MogoLatLng(recognizedListResult.getLat(), recognizedListResult.getLon()); + long cost = TimeUnit.NANOSECONDS.toMillis(System.nanoTime() - start); + Log.d("ADAS动画数据", "cost : " + cost); + final long intervalRef = interval - cost; + Log.d("ADAS动画数据", "最终赋值 : " + intervalRef + " 两帧间隔 : " + interval + " uuid : " + recognizedListResult.getUuid()); + marker.addDynamicAnchorPosition(renderLoc, (float) recognizedListResult.getHeading(), intervalRef); + String carColor = getModelRenderColor(recognizedListResult.getType().getType(), FROM_ADAS, recognizedListResult.getThreatLevel()); + marker.setAnchorColor(carColor); + + newAdasRecognizedMarkersCaches.put(uniqueKey, marker); + Log.d("ADAS数据延时", "render 刷新一台车 cost : " + TimeUnit.NANOSECONDS.toMillis((System.nanoTime() - start))); + } + + /** + * 绘制 marker + * + * @param recognizedListResult {@link TrafficData} + * @return {@link IMogoMarker} + */ + private IMogoMarker drawAdasRecognizedDataMarker(TrafficData recognizedListResult) { + long start = System.nanoTime(); + if (recognizedListResult == null) { + return null; + } + + int resId = getModelRes(recognizedListResult.getType().getType()); + String resIdVal = resId + ""; + + String carColor = getModelRenderColor(recognizedListResult.getType().getType(), FROM_ADAS, recognizedListResult.getThreatLevel()); + MogoMarkerOptions options = new MogoMarkerOptions() + .owner(DataTypes.TYPE_MARKER_ADAS) + .anchor(0.5f, 0.5f) + .set3DMode(true) + .gps(true) + .anchorColor(carColor) + .controlAngle(true) + .resName(mMarkerCachesResMd5Values.get(resIdVal)) + .icon3DRes(resId) + .rotate((float) recognizedListResult.getHeading()) + .position(new MogoLatLng(recognizedListResult.getLat(), recognizedListResult.getLon())); + IMogoMarker marker = MogoApisHandler.getInstance().getApis().getMapServiceApi().getMarkerManager(mContext).addMarker(DataTypes.TYPE_MARKER_ADAS, options); + cacheMarkerIconResMd5Val(resIdVal, marker); + Log.d("ADAS数据延时", "创建一个新 marker cost : " + TimeUnit.NANOSECONDS.toMillis((System.nanoTime() - start))); + return marker; + } + + /** + * 清除旧的 marker 数据 + */ + public void clearOldMarker() { + if (mMarkersCaches != null) { + mMarkersCaches.clear(); + } + mLastPositions.clear(); + sendMessage(MSG_REMOVE_DIRTY_MARKERS, DataTypes.TYPE_MARKER_ADAS); + } +} diff --git a/modules/mogo-module-service/src/main/java/com/mogo/module/service/marker/MapMarkerManager.java b/modules/mogo-module-service/src/main/java/com/mogo/module/service/marker/MapMarkerManager.java index 7d52f427ad..2cf4493f02 100644 --- a/modules/mogo-module-service/src/main/java/com/mogo/module/service/marker/MapMarkerManager.java +++ b/modules/mogo-module-service/src/main/java/com/mogo/module/service/marker/MapMarkerManager.java @@ -17,6 +17,7 @@ import com.mogo.module.common.ModuleNames; import com.mogo.module.common.MogoApisHandler; import com.mogo.module.common.api.CallChatApi; import com.mogo.module.common.drawer.AdasRecognizedResultDrawer; +import com.mogo.module.common.drawer.IdentifyDataDrawer; import com.mogo.module.common.drawer.MarkerDrawer; import com.mogo.module.common.drawer.OnlineCarDrawer; import com.mogo.module.common.drawer.RoadConditionDrawer; @@ -184,7 +185,7 @@ public class MapMarkerManager implements IMogoMarkerClickListener, // 使用与渠道配置一样的gps提供者提供的数据 修改fPadLenovo.gradle文件中的GPS_PROVIDER字段控制渲染来源 Logger.d(TAG, "result.addAdasRecognizedDataCallback == 3 ------> "); if (FunctionBuildConfig.gpsProvider != 2) { - AdasRecognizedResultDrawer.getInstance().renderAdasRecognizedResult(resultList); + IdentifyDataDrawer.getInstance().renderAdasRecognizedResult(resultList); } //添加自车的定位图标,碰撞只有一个预警,还需要和adas 联调, diff --git a/services/mogo-service/src/main/java/com/mogo/service/impl/adas/MogoADASController.java b/services/mogo-service/src/main/java/com/mogo/service/impl/adas/MogoADASController.java index d9252806d5..2672d07c0d 100644 --- a/services/mogo-service/src/main/java/com/mogo/service/impl/adas/MogoADASController.java +++ b/services/mogo-service/src/main/java/com/mogo/service/impl/adas/MogoADASController.java @@ -237,27 +237,6 @@ public class MogoADASController implements IMogoADASController { @Override public void onRectData(List trafficData) { - // 仅在 vr 模式下显示 adas 识别车辆 - if (!SingletonsHolder.get(IMogoStatusManager.class).isVrMode()) { - return; - } - if (!SingletonsHolder.get(IMogoStatusManager.class).isMainPageLaunched()) { - return; - } - if (trafficData == null) { - Logger.w(TAG, "--->action is null"); - return; - } - final long start = System.nanoTime(); - try { - Message message = mAdasRecognizedRecHandler.obtainMessage(); - message.obj = trafficData; - message.sendToTarget(); - Log.i("ADAS数据延时", "接收数据 -> 发出 cost :" + TimeUnit.NANOSECONDS.toMillis((System.nanoTime() - start)) + "ms"); - } catch (Exception e) { - e.printStackTrace(); - } - DebugConfig.setStatus(DebugConfig.sAdasRecognized, true); } @Override