[8.0.0][opt]调整预测的数据和绘制逻辑

This commit is contained in:
chenfufeng
2025-05-14 18:11:13 +08:00
parent e152a773b3
commit db97849736
21 changed files with 1142 additions and 100 deletions

View File

@@ -4,6 +4,7 @@ import com.mogo.eagle.core.data.traffic.TrafficData
import mogo.telematics.pad.MessagePad
import mogo.telematics.pad.MessagePad.TrackedObject
import mogo.yycp.api.proto.SocketDownData
import prediction2025.Prediction2025
interface Identify {
@@ -19,6 +20,14 @@ interface Identify {
}
fun renderPredictionResult(predictionObjectList: List<Prediction2025.mPredictionObjectApp>?) {
}
fun renderPredictionResult(predictionObjectList: List<Prediction2025.mPredictionObjectApp>?, mapInstance:String) {
}
fun renderPlanningWarningObj(planningObjects: List<MessagePad.PlanningObject>?) {
}
@@ -34,4 +43,8 @@ interface Identify {
fun clearAiMarker(mapInstance:String) {
}
fun clearPredictionMarker(mapInstance:String) {
}
}

View File

@@ -2,6 +2,7 @@ package com.mogo.eagle.core.function.business.identify
import android.os.Handler
import android.os.Message
import com.mogo.eagle.core.data.config.FunctionBuildConfig
import com.mogo.eagle.core.data.deva.chain.ChainConstant
import com.mogo.eagle.core.data.traffic.TrafficData
import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotCarConfigListener
@@ -14,6 +15,7 @@ import com.zhjt.service.chain.ChainLog
import mogo.telematics.pad.MessagePad
import mogo.telematics.pad.MessagePad.TrackedObject
import mogo.yycp.api.proto.SocketDownData
import prediction2025.Prediction2025
import java.util.concurrent.TimeUnit
object IdentifyFactory : Identify, IMoGoObuStatusListener, IMoGoAutopilotCarConfigListener {
@@ -31,21 +33,25 @@ object IdentifyFactory : Identify, IMoGoObuStatusListener, IMoGoAutopilotCarConf
// 预测
object PreDriverIdentify {
internal val preDataDrawer = IdentifyNewDataDrawer()
internal val preDataDrawer2 = IdentifyNewDataDrawer()
internal val preDataDrawer3 = IdentifyNewDataDrawer()
internal val preDataDrawer = IdentifyPredictionDataDrawer()
// internal val preDataDrawer2 = IdentifyPredictionDataDrawer()
// internal val preDataDrawer3 = IdentifyPredictionDataDrawer()
internal val preDataDrawer2 = IdentifyOriginDataDrawer()
internal val preDataDrawer3 = IdentifyOriginDataDrawer()
}
// 决策
object DesDriverIdentify {
internal val desDataDrawer = IdentifyNewDataDrawer()
internal val desDataDrawer = IdentifyOriginDataDrawer()
}
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 desIdentify: Identify = DesDriverIdentify.desDataDrawer
private var startTime: Long = 0L
@@ -71,6 +77,8 @@ object IdentifyFactory : Identify, IMoGoObuStatusListener, IMoGoAutopilotCarConf
private const val MSG_DATA_OBU_WARNING_REMOVE = 4
private const val MSG_DATA_CLEAR = 5
private const val MSG_DATA_AI_CLEAR = 6
private const val MSG_DATA_PRE_TRACK = 7
private const val MSG_DATA_PRE_CLEAR = 8
// 维护一个线程定时轮询数据进行地图绘制
private val mDrawerHandler: Handler =
@@ -89,14 +97,14 @@ object IdentifyFactory : Identify, IMoGoObuStatusListener, IMoGoAutopilotCarConf
lostFrame(internal.toString())
identify.clearOldMarker()
}
if (TimeUnit.NANOSECONDS.toMillis(System.nanoTime() - preStartTime) >= 1000) {
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()
}
if (TimeUnit.NANOSECONDS.toMillis(System.nanoTime() - desStartTime) >= 1000) {
desIdentify.clearOldMarker()
}
sendEmptyMessageDelayed(MSG_CHECK, 1000L)
}
@@ -106,13 +114,15 @@ object IdentifyFactory : Identify, IMoGoObuStatusListener, IMoGoAutopilotCarConf
identify.renderAdasRecognizedResult(objectList)
startTime = System.nanoTime()
preIdentify.renderAdasRegResult(objectList, MogoMap.SMALL_PRED_MAP)
preIdentify2.renderAdasRegResult(objectList, MogoMap.SMALL_PRED_MAP2)
preIdentify3.renderAdasRegResult(objectList, MogoMap.SMALL_PRED_MAP3)
preStartTime = System.nanoTime()
desIdentify.renderAdasRegResult(objectList, MogoMap.SMALL_DES_MAP)
desStartTime = 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()
}
}
}
@@ -125,6 +135,15 @@ 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)
// preIdentify2.renderPredictionResult(objectList, MogoMap.SMALL_PRED_MAP2)
// preIdentify3.renderPredictionResult(objectList, MogoMap.SMALL_PRED_MAP3)
}
}
MSG_DATA_WARNING -> {
if (msg.obj is List<*>) {
identify.renderPlanningWarningObj(msg.obj as List<MessagePad.PlanningObject>?)
@@ -150,6 +169,12 @@ object IdentifyFactory : Identify, IMoGoObuStatusListener, IMoGoAutopilotCarConf
MSG_DATA_AI_CLEAR -> {
aiCloudIdentify!!.clearAiMarker(msg.data.getString("mapInstance")!!)
}
MSG_DATA_PRE_CLEAR -> {
preIdentify.clearPredictionMarker(MogoMap.SMALL_PRED_MAP)
preIdentify2.clearPredictionMarker(MogoMap.SMALL_PRED_MAP2)
preIdentify3.clearPredictionMarker(MogoMap.SMALL_PRED_MAP3)
}
}
}
}
@@ -161,6 +186,13 @@ object IdentifyFactory : Identify, IMoGoObuStatusListener, IMoGoAutopilotCarConf
mDrawerHandler.sendMessage(message)
}
override fun renderPredictionResult(predictionObjectList: List<Prediction2025.mPredictionObjectApp>?) {
val message = Message.obtain()
message.what = MSG_DATA_PRE_TRACK
message.obj = predictionObjectList
mDrawerHandler.sendMessage(message)
}
override fun renderAiCloudResult(
resultList: List<SocketDownData.CloudRoadDataProto>,
mapInstance: String
@@ -192,6 +224,12 @@ object IdentifyFactory : Identify, IMoGoObuStatusListener, IMoGoAutopilotCarConf
mDrawerHandler.sendMessage(message)
}
override fun clearPredictionMarker(mapInstance: String) {
val message = Message.obtain()
message.what = MSG_DATA_PRE_CLEAR
mDrawerHandler.sendMessage(message)
}
override fun updateTrackerWarningInfo(trafficData: TrafficData) {
super.updateTrackerWarningInfo(trafficData)
val message = Message.obtain()

View File

@@ -87,6 +87,45 @@ class IdentifyOriginDataDrawer : Identify {
}
}
override fun renderAdasRegResult(resultList: List<TrackedObject>?, mapInstance: 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)
MogoIdentifyManager.getInstance()
.removeMarker(key, mapInstance)
TrackerSourceFilterHelper.removeBottomMarker(key)
}
val filterList = filterTrafficData(resultList)
if (filterList.size > 0) {
// 绘制新数据
MogoIdentifyManager.getInstance()
.updateBatchMarkerPosition(filterList, mapInstance)
}
}
/**
* 数据过滤器
*

View File

@@ -5,19 +5,18 @@ import androidx.collection.ArraySet
import com.mogo.commons.module.status.MogoStatusManager
import com.mogo.eagle.core.data.traffic.TrafficData
import com.mogo.map.identify.MogoIdentifyManager
import mogo.telematics.pad.MessagePad.PlanningObject
import mogo.telematics.pad.MessagePad.TrackedObject
import prediction2025.Prediction2025
import java.util.concurrent.ConcurrentHashMap
/**
* 域控制器识别信息绘制
* 域控制器预测数据绘制
*/
class IdentifyNewDataDrawer : Identify {
class IdentifyPredictionDataDrawer : Identify {
/**
* 上一帧数据的缓存
*/
private val mMarkersCaches = ConcurrentHashMap<String, TrackedObject>()
private val mMarkersCaches = ConcurrentHashMap<String, Prediction2025.mPredictionObjectApp>()
/**
* 记录每次实际绘制的交通元素UUID
@@ -29,25 +28,17 @@ class IdentifyNewDataDrawer : Identify {
* 过滤后的数据集合
*/
@SuppressLint("NewApi")
private val mFilterTrafficData = HashMap<String, TrackedObject>()
@SuppressLint("NewApi")
override fun renderPlanningWarningObj(planningObjects: List<PlanningObject>?) {
WarningHelper.renderPlanningOriginWarningObj(planningObjects, mMarkersCaches)
}
private val mFilterTrafficData = HashMap<String, Prediction2025.mPredictionObjectApp>()
override fun renderOBUWarningObj(exist: Boolean, obuTrafficData: TrafficData) {
WarningHelper.renderOBUWarningObj(exist, obuTrafficData)
}
/**
* 渲染 adas 识别的数据
*
* @param resultList adas感知融合数据
*/
@SuppressLint("NewApi")
override fun renderAdasRegResult(resultList: List<TrackedObject>?, mapInstance:String) {
if (resultList == null || resultList.isEmpty()) {
override fun renderPredictionResult(
predictionObjectList: List<Prediction2025.mPredictionObjectApp>?,
mapInstance: String
) {
if (predictionObjectList.isNullOrEmpty()) {
clearOldMarker()
return
}
@@ -55,14 +46,10 @@ class IdentifyNewDataDrawer : Identify {
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())
for (data in predictionObjectList) {
if (trafficDataUuidList.size > 0 && trafficDataUuidList.contains("" + data.mNid)) {
trafficDataUuidList.remove("" + data.mNid)
}
}
@@ -73,15 +60,14 @@ class IdentifyNewDataDrawer : Identify {
it.remove()
mMarkersCaches.remove(key)
MogoIdentifyManager.getInstance()
.removeMarker(key, mapInstance)
TrackerSourceFilterHelper.removeBottomMarker(key)
.removeMarker(key.hashCode().toString(), mapInstance)
}
val filterList = filterTrafficData(resultList)
val filterList = filterTrafficData(predictionObjectList)
if (filterList.size > 0) {
// 绘制新数据
MogoIdentifyManager.getInstance()
.updateBatchMarkerPosition(filterList, mapInstance)
.updatePreMarkerPosition(filterList, mapInstance)
}
}
@@ -91,32 +77,28 @@ class IdentifyNewDataDrawer : Identify {
* @return 过滤后的数据集合
*/
@SuppressLint("NewApi")
private fun filterTrafficData(trafficData: List<TrackedObject>): HashMap<String, TrackedObject> {
private fun filterTrafficData(trafficData: List<Prediction2025.mPredictionObjectApp>): HashMap<String, Prediction2025.mPredictionObjectApp> {
mFilterTrafficData.clear()
trafficDataUuidList.clear()
for (data in trafficData) {
// 过滤掉未知感知数据
if (TrackerSourceFilterHelper.filterData(data)) {
continue
}
var temp: TrackedObject = data
val uuid = data.uuid.toString()
val cacheData = mMarkersCaches[uuid]
if (cacheData != null) {
val color = TrackerSourceFilterHelper.getDefaultColor(data)
temp = data.toBuilder().setColor(color).build()
}
mFilterTrafficData[uuid] = temp
mMarkersCaches[uuid] = temp
val uuid = "" + data.mNid
mMarkersCaches[uuid] = data
trafficDataUuidList.add(uuid)
// TrackerSourceFilterHelper.filterZombieMarker(data)
mFilterTrafficData[uuid] = data
}
return mFilterTrafficData
}
/**
* 清除旧的 marker 数据
*/
@SuppressLint("NewApi")
override fun clearPredictionMarker(mapInstance:String) {
trafficDataUuidList.clear()
mMarkersCaches.forEach { (uuid, _) ->
mMarkersCaches.remove(uuid)
MogoIdentifyManager.getInstance()
.removeMarker(uuid.hashCode().toString(), mapInstance)
}
mFilterTrafficData.clear()
}
override fun clearOldMarker() {
for (uuid in trafficDataUuidList) {
MogoIdentifyManager.getInstance()
@@ -127,5 +109,4 @@ class IdentifyNewDataDrawer : Identify {
mMarkersCaches.clear()
WarningHelper.clear()
}
}

View File

@@ -1,17 +1,23 @@
package com.mogo.eagle.core.function.business.identify
import com.mogo.eagle.core.data.config.FunctionBuildConfig
import com.mogo.eagle.core.data.map.MogoLocation
import com.mogo.eagle.core.data.traffic.TrafficData
import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotIdentifyListener
import com.mogo.eagle.core.function.api.base.IMoGoSubscriber
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.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 mogo.telematics.pad.MessagePad
import mogo.telematics.pad.MessagePad.TrackedObject
import mogo.yycp.api.proto.SocketDownData
import prediction2025.Prediction2025
/**
* 订阅感知数据的订阅者
@@ -59,6 +65,47 @@ class MapIdentifySubscriber private constructor() : IMoGoSubscriber,
}
}
private var carPoiList1: List<geometry.Geometry.Point>? = null
private var carPoiList2: List<geometry.Geometry.Point>? = null
private var location1: MogoLocation? = null
private var location2: MogoLocation? = null
override fun onPredictionObstacleTrajectory(predictionObjects: Prediction2025.mPredictionObjects) {
if (FunctionBuildConfig.isDrawPreIdentifyData) {
try {
ThreadUtils.getSinglePool().execute {
// 渲染它车
IdentifyFactory.renderPredictionResult(predictionObjects.objsAppList)
// 渲染自车
predictionObjects.objsAppList.forEach { preObj ->
if (preObj.mNid == 800000L) {
// 自车有2条轨迹一条概率大、一条概率小
if (preObj.predictionTrajectoryList == null || preObj.predictionTrajectoryList.size < 2) return@forEach
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)
if (location1 == null || location2 == null) return@forEach
if (preObj.predictionTrajectoryList[0].predictionProbability >= preObj.predictionTrajectoryList[1].predictionProbability) {
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)
MogoIdentifyManager.getInstance().updateGps(location1!!, MogoMap.SMALL_PRED_MAP2)
MogoIdentifyManager.getInstance().updateGps(location2!!, MogoMap.SMALL_PRED_MAP3)
}
}
}
} catch (e: Exception) {
e.printStackTrace()
}
}
}
fun renderAiCloudResult(cloudData: List<SocketDownData.CloudRoadDataProto>, mapInstance:String = MogoMap.DEFAULT) {
try {
ThreadUtils.getSinglePool().execute {

View File

@@ -131,12 +131,16 @@ public class MogoRouteOverlayManager implements
// Log.d(TAG, "-- onChassisLocationGCJ02 -- 1 ---" + ":auto-mode:" + autoPilotState + ", isArriveAtStation: " + isArriveAtStation);
if (isArriveAtStation && autoPilotState != 2) {
RouteOverlayDrawer.getInstance().clearMogoRouteOverlay();
PredictionOverlayDrawer.getInstance().clearPreRouteOverlay();
PredictionOverlayDrawer2.getInstance().clearPreRouteOverlay();
return;
}
// Log.d(TAG, "-- onChassisLocationGCJ02 -- 2 ---" + "auto-mode:" + autoPilotState + ", isDemoMode:" + FunctionBuildConfig.isDemoMode + ", force:" + FunctionBuildConfig.isForceDrawAutopilotTrajectoryByDebugSettingView);
boolean force = hasGreenWave.get() || FunctionBuildConfig.isForceDrawAutopilotTrajectoryByDebugSettingView || FunctionBuildConfig.isDemoMode && FunctionBuildConfig.isIgnoreConditionsDrawAutopilotTrajectoryData;
if (!force && autoPilotState != 2) {
RouteOverlayDrawer.getInstance().clearMogoRouteOverlay();
PredictionOverlayDrawer.getInstance().clearPreRouteOverlay();
PredictionOverlayDrawer2.getInstance().clearPreRouteOverlay();
return;
}
// Log.d(TAG, "-- onChassisLocationGCJ02 -- 3 ---");

View File

@@ -0,0 +1,369 @@
package com.mogo.eagle.core.function.business.routeoverlay;
import static com.mogo.map.MogoMap.DEFAULT;
import static com.mogo.map.MogoMap.SMALL_DES_MAP;
import static com.mogo.map.MogoMap.SMALL_PRED_MAP;
import static com.mogo.map.MogoMap.SMALL_PRED_MAP2;
import static com.mogo.map.MogoMap.SMALL_PRED_MAP3;
import android.annotation.SuppressLint;
import android.graphics.Color;
import android.os.Handler;
import android.os.HandlerThread;
import android.util.Log;
import androidx.core.util.Pools;
import com.mogo.eagle.core.data.config.FunctionBuildConfig;
import com.mogo.eagle.core.data.map.MogoLatLng;
import com.mogo.eagle.core.function.call.autopilot.CallerChassisLocationWGS84ListenerManager;
import com.mogo.eagle.core.function.call.map.CallerMapUIServiceManager;
import com.mogo.eagle.core.utilcode.mogo.AppIdentityModeUtils;
import com.mogo.eagle.core.utilcode.util.DrivingDirectionUtils;
import com.mogo.map.IMogoMap;
import com.mogo.map.MogoMap;
import com.mogo.map.overlay.IMoGoOverlayManager;
import com.mogo.map.overlay.core.Level;
import com.mogo.map.overlay.line.Polyline;
import com.zhidaoauto.map.sdk.open.common.tools.MapTools;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;
import kotlin.Pair;
import mogo.telematics.pad.MessagePad;
public class PredictionOverlayDrawer {
private static final String TAG = "PredictionOverlayDrawer";
// 连接线参数
private Handler mRenderHandler;
private final IMoGoOverlayManager mogoOverlayManager;
private static volatile PredictionOverlayDrawer sInstance;
private static final byte[] obj = new byte[0];
private static final int COLOR_LIGHT = Color.parseColor("#BAEBF5");
private final List<Integer> greenWaveColors = new ArrayList<>();
private PredictionOverlayDrawer() {
// 渐变色
mogoOverlayManager = CallerMapUIServiceManager.INSTANCE.getOverlayManager();
if (mogoOverlayManager != null) {
// 线条粗细,渐变,渐变色值
HandlerThread renderTask = new HandlerThread("prediction_render") {
@Override
protected void onLooperPrepared() {
super.onLooperPrepared();
mRenderHandler = new Handler(getLooper());
}
};
renderTask.start();
ArrayList<Pair<Integer, Integer>> temps = new ArrayList<>();
temps.add(new Pair<>(0, 51));
temps.add(new Pair<>(10, 102));
temps.add(new Pair<>(30, 51));
temps.add(new Pair<>(100, 0));
List<Integer> alphas = MapTools.INSTANCE.getColorAlpha(temps);
if (alphas != null && !alphas.isEmpty()) {
for (int i : alphas) {
greenWaveColors.add(Color.argb(i, 48, 163, 255));
}
}
}
}
public static PredictionOverlayDrawer getInstance() {
if (sInstance == null) {
synchronized (obj) {
if (sInstance == null) {
sInstance = new PredictionOverlayDrawer();
}
}
}
return sInstance;
}
public void clearPreRouteOverlay() {
if (mogoOverlayManager != null) {
if (mPreRenderTask != null) {
mRenderHandler.removeCallbacks(mPreRenderTask);
}
mogoOverlayManager.hideAllLinesInLevel(Level.GUIDE_ROUTE_LINE);
}
}
private class RenderTask implements Runnable {
private volatile List<MogoLatLng> predictionList;
private final Pools.Pool<MogoLatLng> pools;
private final LinkedList<MogoLatLng> points;
private double bearing;
private boolean hasGreenWave;
private int preViewType;
private int largeType;
private Polyline.Options mPolylineOptions;
//用于taxi乘客屏渐变颜色集合
private List<Integer> colors = null;
public RenderTask() {
this.pools = new Pools.SimplePool<>(500);
this.points = new LinkedList<>();
mPolylineOptions = new Polyline.Options.Builder("prediction_overlay" + preViewType, Level.GUIDE_ROUTE_LINE)
.setUseGps(true)
.setWidth(20)
.setIsGradient(true)
.build();
}
public void setPreData(List<MogoLatLng> data, double bearing, boolean hasGreenWave, int preType, int largeType) {
predictionList = data;
this.bearing = bearing;
this.hasGreenWave = hasGreenWave;
preViewType = preType;
this.largeType = largeType;
}
@SuppressLint("LongLogTag")
@Override
public void run() {
IMoGoOverlayManager overlayManager = mogoOverlayManager;
if (overlayManager == null) {
return;
}
LinkedList<MogoLatLng> pps = this.points;
boolean isExcept = false;
int total;
try {
pps.clear();
List<MogoLatLng> routes = this.predictionList;
if (routes == null || (total = routes.size()) < 2) {
isExcept = true;
return;
}
boolean isColorfulStrategy = !hasGreenWave && !AppIdentityModeUtils.isTaxi(FunctionBuildConfig.appIdentityMode) || !AppIdentityModeUtils.isPassenger(FunctionBuildConfig.appIdentityMode);
if (isColorfulStrategy) {
RouteStrategy.INSTANCE.start();
} else {
if (colors == null || colors.isEmpty()) {
ArrayList<Pair<Integer, Integer>> temps = new ArrayList<>();
temps.add(new Pair<>(0, 51));
temps.add(new Pair<>(10, 102));
temps.add(new Pair<>(30, 51));
temps.add(new Pair<>(100, 0));
List<Integer> alphas = MapTools.INSTANCE.getColorAlpha(temps);
if (alphas != null && !alphas.isEmpty()) {
colors = new CopyOnWriteArrayList<>();
for (int i : alphas) {
colors.add(Color.argb(i, 48, 163, 255));
}
}
}
}
for (int i = 0; i < total; i++) {
MogoLatLng route = null;
try {
route = routes.get(i);
if (route == null) {
continue;
}
} catch (Throwable t) {
Log.d("Route", "render-error:" + t.getMessage());
}
if (route == null) {
//数组越界了,结束循环
break;
}
MogoLatLng acquire = pools.acquire();
double latitude = route.getLat();
double longitude = route.getLon();
if (acquire == null) {
acquire = new MogoLatLng(latitude, longitude);
} else {
acquire.lon = longitude;
acquire.lat = latitude;
}
acquire.acc = 0.0;// 加速度
acquire.speed = 0.0;// 速度
pps.add(acquire);
if (isColorfulStrategy) {
RouteStrategy.INSTANCE.check(0.0, 0.0, predictionList.size());
}
}
double lon = CallerChassisLocationWGS84ListenerManager.INSTANCE.getChassisLocationWGS84().getLongitude();
double lat = CallerChassisLocationWGS84ListenerManager.INSTANCE.getChassisLocationWGS84().getLatitude();
if (!points.isEmpty()) {
MogoLatLng top = null;
while (!points.isEmpty()) {
MogoLatLng first = points.peek();
if (first == null) {
continue;
}
if (first == top) {
break;
}
lon = CallerChassisLocationWGS84ListenerManager.INSTANCE.getChassisLocationWGS84().getLongitude();
lat = CallerChassisLocationWGS84ListenerManager.INSTANCE.getChassisLocationWGS84().getLatitude();
long angle = isPointOnCarFront(lon, lat, bearing, first.lon, first.lat);
if (angle >= 90) {
if (isColorfulStrategy) {
RouteStrategy.INSTANCE.remove(first.acc);
}
pools.release(first);
points.poll();
}
top = first;
}
if (points.isEmpty()) {
isExcept = true;
return;
}
MogoLatLng self = pools.acquire();
if (self == null) {
self = new MogoLatLng(lat, lon);
} else {
self.lat = lat;
self.lon = lon;
}
points.addFirst(self);
Polyline.Options.Builder builder;
if (mPolylineOptions == null) {
builder = new Polyline.Options.Builder("router_overlay", Level.GUIDE_ROUTE_LINE)
.setUseGps(true)
.setWidth(20)
.setIsGradient(true);
} else {
builder = mPolylineOptions.builder();
}
if (isColorfulStrategy) {
RouteStrategy.INSTANCE.end();
Strategy strategy = RouteStrategy.INSTANCE.getStrategy();
List<Integer> colors = strategy.getColors();
boolean isLightOn = strategy instanceof ColorfulStrategy && ((ColorfulStrategy) strategy).isLightOn();
builder.colors(colors);
builder.setLightOn(isLightOn);
builder.setLightColor(COLOR_LIGHT);
builder.setLightSpeed(0.3f);
} else {
if (!hasGreenWave) {
if (colors != null && !colors.isEmpty()) {
builder.colors(colors);
builder.setIsGradient(true);
builder.setLightOn(true);
builder.isShowArrow(false);
builder.setLightColor(COLOR_LIGHT);
builder.setLightSpeed(0.3f);
}
} else {
builder.colors(greenWaveColors)
.setIsGradient(true)
.setLightOn(false)
.isShowArrow(true);
}
}
builder.points(points);
builder.setVisible(true);
Polyline.Options options = builder.build();
if (mPolylineOptions == null) {
mPolylineOptions = options;
}
if (FunctionBuildConfig.isDrawDecIdentifyData) {
if (preViewType == 2) {
overlayManager.showOrUpdateLine(options, SMALL_PRED_MAP2);
} else if (preViewType == 3) {
overlayManager.showOrUpdateLine(options, SMALL_PRED_MAP3);
}
if (preViewType == largeType) {
overlayManager.showOrUpdateLine(options, SMALL_PRED_MAP);
}
}
} else {
isExcept = true;
}
} catch (Throwable t) {
t.printStackTrace();
} finally {
if (isExcept) {
setVisible(false);
}
if (!points.isEmpty()) {
for (int i = 0; i < points.size(); i++) {
MogoLatLng latLng = points.get(i);
if (latLng == null) {
continue;
}
pools.release(latLng);
}
}
}
}
private long isPointOnCarFront(double car_lon, double car_lat, double car_head, double lon, double lat) {
return DrivingDirectionUtils.getDegreeOfCar2Poi2(car_lon, car_lat, lon, lat, car_head);
}
}
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;
if (mogoOverlayManager != null && iMogoMap != null) {
if (mPreRenderTask == null) {
mPreRenderTask = 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[1], arr[0]));
}
if (latLngList.isEmpty()) return;
mPreRenderTask.setPreData(latLngList, bearing, hasGreenWave, preType, largeType);
if (mRenderHandler != null) {
mRenderHandler.removeCallbacks(mPreRenderTask);
mRenderHandler.post(mPreRenderTask);
}
}
}
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) {
mogoOverlayManager.showAllLinesInLevel(Level.GUIDE_ROUTE_LINE);
} else {
mogoOverlayManager.hideAllLinesInLevel(Level.GUIDE_ROUTE_LINE);
}
}
}
}

View File

@@ -0,0 +1,344 @@
package com.mogo.eagle.core.function.business.routeoverlay;
import static com.mogo.map.MogoMap.DEFAULT;
import static com.mogo.map.MogoMap.SMALL_PRED_MAP;
import static com.mogo.map.MogoMap.SMALL_PRED_MAP2;
import static com.mogo.map.MogoMap.SMALL_PRED_MAP3;
import android.annotation.SuppressLint;
import android.graphics.Color;
import android.os.Handler;
import android.os.HandlerThread;
import android.util.Log;
import androidx.core.util.Pools;
import com.mogo.eagle.core.data.config.FunctionBuildConfig;
import com.mogo.eagle.core.data.map.MogoLatLng;
import com.mogo.eagle.core.function.call.autopilot.CallerChassisLocationWGS84ListenerManager;
import com.mogo.eagle.core.function.call.map.CallerMapUIServiceManager;
import com.mogo.eagle.core.utilcode.mogo.AppIdentityModeUtils;
import com.mogo.eagle.core.utilcode.util.DrivingDirectionUtils;
import com.mogo.map.IMogoMap;
import com.mogo.map.MogoMap;
import com.mogo.map.overlay.IMoGoOverlayManager;
import com.mogo.map.overlay.core.Level;
import com.mogo.map.overlay.line.Polyline;
import com.zhidaoauto.map.sdk.open.common.tools.MapTools;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;
import kotlin.Pair;
public class PredictionOverlayDrawer2 {
private static final String TAG = "PredictionOverlayDrawer2";
// 连接线参数
private Handler mRenderHandler;
private final IMoGoOverlayManager mogoOverlayManager;
private static volatile PredictionOverlayDrawer2 sInstance;
private static final byte[] obj = new byte[0];
private static final int COLOR_LIGHT = Color.parseColor("#BAEBF5");
private final List<Integer> greenWaveColors = new ArrayList<>();
private PredictionOverlayDrawer2() {
// 渐变色
mogoOverlayManager = CallerMapUIServiceManager.INSTANCE.getOverlayManager();
if (mogoOverlayManager != null) {
// 线条粗细,渐变,渐变色值
HandlerThread renderTask = new HandlerThread("prediction_render") {
@Override
protected void onLooperPrepared() {
super.onLooperPrepared();
mRenderHandler = new Handler(getLooper());
}
};
renderTask.start();
ArrayList<Pair<Integer, Integer>> temps = new ArrayList<>();
temps.add(new Pair<>(0, 51));
temps.add(new Pair<>(10, 102));
temps.add(new Pair<>(30, 51));
temps.add(new Pair<>(100, 0));
List<Integer> alphas = MapTools.INSTANCE.getColorAlpha(temps);
if (alphas != null && !alphas.isEmpty()) {
for (int i : alphas) {
greenWaveColors.add(Color.argb(i, 48, 163, 255));
}
}
}
}
public static PredictionOverlayDrawer2 getInstance() {
if (sInstance == null) {
synchronized (obj) {
if (sInstance == null) {
sInstance = new PredictionOverlayDrawer2();
}
}
}
return sInstance;
}
public void clearPreRouteOverlay() {
if (mogoOverlayManager != null) {
if (mPreRenderTask != null) {
mRenderHandler.removeCallbacks(mPreRenderTask);
}
mogoOverlayManager.hideAllLinesInLevel(Level.GUIDE_ROUTE_LINE);
}
}
private class RenderTask implements Runnable {
private volatile List<MogoLatLng> predictionList;
private final Pools.Pool<MogoLatLng> pools;
private final LinkedList<MogoLatLng> points;
private double bearing;
private boolean hasGreenWave;
private int preViewType;
private int largeType;
private Polyline.Options mPolylineOptions;
//用于taxi乘客屏渐变颜色集合
private List<Integer> colors = null;
public RenderTask() {
this.pools = new Pools.SimplePool<>(500);
this.points = new LinkedList<>();
mPolylineOptions = new Polyline.Options.Builder("prediction_overlay" + preViewType, Level.GUIDE_ROUTE_LINE)
.setUseGps(true)
.setWidth(20)
.setIsGradient(true)
.build();
}
public void setPreData(List<MogoLatLng> data, double bearing, boolean hasGreenWave, int preType, int largeType) {
predictionList = data;
this.bearing = bearing;
this.hasGreenWave = hasGreenWave;
preViewType = preType;
this.largeType = largeType;
}
@SuppressLint("LongLogTag")
@Override
public void run() {
IMoGoOverlayManager overlayManager = mogoOverlayManager;
if (overlayManager == null) {
return;
}
LinkedList<MogoLatLng> pps = this.points;
boolean isExcept = false;
int total;
try {
pps.clear();
List<MogoLatLng> routes = this.predictionList;
if (routes == null || (total = routes.size()) < 2) {
isExcept = true;
return;
}
boolean isColorfulStrategy = !hasGreenWave && !AppIdentityModeUtils.isTaxi(FunctionBuildConfig.appIdentityMode) || !AppIdentityModeUtils.isPassenger(FunctionBuildConfig.appIdentityMode);
if (isColorfulStrategy) {
RouteStrategy.INSTANCE.start();
} else {
if (colors == null || colors.isEmpty()) {
ArrayList<Pair<Integer, Integer>> temps = new ArrayList<>();
temps.add(new Pair<>(0, 51));
temps.add(new Pair<>(10, 102));
temps.add(new Pair<>(30, 51));
temps.add(new Pair<>(100, 0));
List<Integer> alphas = MapTools.INSTANCE.getColorAlpha(temps);
if (alphas != null && !alphas.isEmpty()) {
colors = new CopyOnWriteArrayList<>();
for (int i : alphas) {
colors.add(Color.argb(i, 48, 163, 255));
}
}
}
}
for (int i = 0; i < total; i++) {
MogoLatLng route = null;
try {
route = routes.get(i);
if (route == null) {
continue;
}
} catch (Throwable t) {
Log.d("Route", "render-error:" + t.getMessage());
}
if (route == null) {
//数组越界了,结束循环
break;
}
MogoLatLng acquire = pools.acquire();
double latitude = route.getLat();
double longitude = route.getLon();
if (acquire == null) {
acquire = new MogoLatLng(latitude, longitude);
} else {
acquire.lon = longitude;
acquire.lat = latitude;
}
acquire.acc = 0.0;// 加速度
acquire.speed = 0.0;// 速度
pps.add(acquire);
if (isColorfulStrategy) {
RouteStrategy.INSTANCE.check(0.0, 0.0, predictionList.size());
}
}
double lon = CallerChassisLocationWGS84ListenerManager.INSTANCE.getChassisLocationWGS84().getLongitude();
double lat = CallerChassisLocationWGS84ListenerManager.INSTANCE.getChassisLocationWGS84().getLatitude();
if (!points.isEmpty()) {
MogoLatLng top = null;
while (!points.isEmpty()) {
MogoLatLng first = points.peek();
if (first == null) {
continue;
}
if (first == top) {
break;
}
lon = CallerChassisLocationWGS84ListenerManager.INSTANCE.getChassisLocationWGS84().getLongitude();
lat = CallerChassisLocationWGS84ListenerManager.INSTANCE.getChassisLocationWGS84().getLatitude();
long angle = isPointOnCarFront(lon, lat, bearing, first.lon, first.lat);
if (angle >= 90) {
if (isColorfulStrategy) {
RouteStrategy.INSTANCE.remove(first.acc);
}
pools.release(first);
points.poll();
}
top = first;
}
if (points.isEmpty()) {
isExcept = true;
return;
}
MogoLatLng self = pools.acquire();
if (self == null) {
self = new MogoLatLng(lat, lon);
} else {
self.lat = lat;
self.lon = lon;
}
points.addFirst(self);
Polyline.Options.Builder builder;
if (mPolylineOptions == null) {
builder = new Polyline.Options.Builder("router_overlay", Level.GUIDE_ROUTE_LINE)
.setUseGps(true)
.setWidth(20)
.setIsGradient(true);
} else {
builder = mPolylineOptions.builder();
}
if (isColorfulStrategy) {
RouteStrategy.INSTANCE.end();
Strategy strategy = RouteStrategy.INSTANCE.getStrategy();
List<Integer> colors = strategy.getColors();
boolean isLightOn = strategy instanceof ColorfulStrategy && ((ColorfulStrategy) strategy).isLightOn();
builder.colors(colors);
builder.setLightOn(isLightOn);
builder.setLightColor(COLOR_LIGHT);
builder.setLightSpeed(0.3f);
} else {
if (!hasGreenWave) {
if (colors != null && !colors.isEmpty()) {
builder.colors(colors);
builder.setIsGradient(true);
builder.setLightOn(true);
builder.isShowArrow(false);
builder.setLightColor(COLOR_LIGHT);
builder.setLightSpeed(0.3f);
}
} else {
builder.colors(greenWaveColors)
.setIsGradient(true)
.setLightOn(false)
.isShowArrow(true);
}
}
builder.points(points);
builder.setVisible(true);
Polyline.Options options = builder.build();
if (mPolylineOptions == null) {
mPolylineOptions = options;
}
if (FunctionBuildConfig.isDrawDecIdentifyData) {
if (preViewType == 2) {
overlayManager.showOrUpdateLine(options, SMALL_PRED_MAP2);
} else if (preViewType == 3) {
overlayManager.showOrUpdateLine(options, SMALL_PRED_MAP3);
}
if (preViewType == largeType) {
overlayManager.showOrUpdateLine(options, SMALL_PRED_MAP);
}
}
} else {
isExcept = true;
}
} catch (Throwable t) {
t.printStackTrace();
} finally {
if (isExcept) {
setVisible(false);
}
if (!points.isEmpty()) {
for (int i = 0; i < points.size(); i++) {
MogoLatLng latLng = points.get(i);
if (latLng == null) {
continue;
}
pools.release(latLng);
}
}
}
}
private long isPointOnCarFront(double car_lon, double car_lat, double car_head, double lon, double lat) {
return DrivingDirectionUtils.getDegreeOfCar2Poi2(car_lon, car_lat, lon, lat, car_head);
}
}
private volatile RenderTask mPreRenderTask;
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;
if (mogoOverlayManager != null && iMogoMap != null) {
if (mPreRenderTask == null) {
mPreRenderTask = 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[1], arr[0]));
}
if (latLngList.isEmpty()) return;
mPreRenderTask.setPreData(latLngList, bearing, hasGreenWave, preType, largeType);
if (mRenderHandler != null) {
mRenderHandler.removeCallbacks(mPreRenderTask);
mRenderHandler.post(mPreRenderTask);
}
}
}
public void setVisible(boolean isVisible) {
if (mogoOverlayManager != null) {
if (isVisible) {
mogoOverlayManager.showAllLinesInLevel(Level.GUIDE_ROUTE_LINE);
} else {
mogoOverlayManager.hideAllLinesInLevel(Level.GUIDE_ROUTE_LINE);
}
}
}
}

View File

@@ -267,7 +267,9 @@ public class RouteOverlayDrawer {
mPolylineOptions = options;
}
overlayManager.showOrUpdateLine(options,DEFAULT);
overlayManager.showOrUpdateLine(options,SMALL_DES_MAP);
if (FunctionBuildConfig.isDrawDecIdentifyData) {
overlayManager.showOrUpdateLine(options,SMALL_DES_MAP);
}
} else {
isExcept = true;
}

View File

@@ -0,0 +1,45 @@
package com.mogo.eagle.core.function.utils
import com.mogo.eagle.core.data.map.MogoLocation
import com.mogo.eagle.core.utilcode.util.DrivingDirectionUtils
import com.mogo.map.MogoMap
import com.mogo.map.MogoMap.Companion.mapInstance
object LocationUtils {
/**
* 必须先根据定位计算度带即调用switchData(gnssInfo.longitude, gnssInfo.latitude, true)
*/
fun generateLocation(x: Double, y: Double, heading: Double): MogoLocation? {
val mogoMap = mapInstance.getMogoMap(MogoMap.DEFAULT)
if (mogoMap != null) {
val lonLat = mogoMap.switchData(x, y, false)
if (lonLat == null || lonLat.size < 2) return null
val location = MogoLocation()
location.longitude = lonLat[0]
location.latitude = lonLat[1]
location.heading = heading
return location
} else {
return null
}
}
/**
* 同上,必须先根据定位计算度带
*/
fun generateLocation(x: Double, y: Double, preX: Double, preY: Double): MogoLocation? {
val mogoMap = mapInstance.getMogoMap(MogoMap.DEFAULT)
if (mogoMap != null) {
val lonLat = mogoMap.switchData(x, y, false)
val preLonLat = mogoMap.switchData(preX, preY, false)
if (lonLat == null || lonLat.size < 2 || preLonLat == null || preLonLat.size < 2) return null
val location = MogoLocation()
location.longitude = lonLat[0]
location.latitude = lonLat[1]
location.heading = DrivingDirectionUtils.getLineAngle(lonLat[0], lonLat[1], preLonLat[0], preLonLat[1])
return location
} else {
return null
}
}
}

View File

@@ -109,7 +109,6 @@ class PredictionMap2View(context: Context, attrs: AttributeSet) : MogoMapView(co
override fun onChassisLocationWGS84(gnssInfo: MogoLocation) {
// 跟新地图控件
setExtraGPSData(gnssInfo)
// setExtraGPSData(gnssInfo)
}
}

View File

@@ -109,7 +109,7 @@ class PredictionMap3View(context: Context, attrs: AttributeSet) : MogoMapView(co
override fun onChassisLocationWGS84(gnssInfo: MogoLocation) {
// 跟新地图控件
setExtraGPSData(gnssInfo)
// setExtraGPSData(gnssInfo)
}
}

View File

@@ -11,12 +11,13 @@ import com.mogo.eagle.core.data.map.MogoLocation
import com.mogo.eagle.core.function.api.autopilot.IMoGoChassisLocationWGS84Listener
import com.mogo.eagle.core.function.api.map.road.IMoGoMapRoadListener
import com.mogo.eagle.core.function.call.autopilot.CallerChassisLocationWGS84ListenerManager
import com.mogo.eagle.core.function.view.PredictionMap2View.Companion
import com.mogo.eagle.core.utilcode.mogo.AppIdentityModeUtils
import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger
import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.Companion.M_MAP
import com.mogo.eagle.core.widget.media.video.TextureVideoViewOutlineProvider
import com.mogo.map.MogoMap
import com.mogo.map.MogoMap.Companion.SMALL_PRED_MAP
import com.mogo.map.MogoMap.Companion.mapInstance
import com.mogo.map.MogoMapView
import com.zhidaoauto.map.sdk.open.abs.OnMapLoadedListener
import com.zhidaoauto.map.sdk.open.view.HDTypes
@@ -42,6 +43,9 @@ class PredictionMapView(context: Context, attrs: AttributeSet) : MogoMapView(con
// typedArray.recycle()
// }
@Volatile
private var lastTime: Long = 0L
override fun onAttachedToWindow() {
super.onAttachedToWindow()
initMapView()
@@ -118,7 +122,11 @@ class PredictionMapView(context: Context, attrs: AttributeSet) : MogoMapView(con
override fun onChassisLocationWGS84(gnssInfo: MogoLocation) {
// 跟新地图控件
setExtraGPSData(gnssInfo)
// setExtraGPSData(gnssInfo)
if (System.currentTimeMillis() - lastTime >= 5000) {
// 预测给的UTM坐标数据没有带上度带信息根据定位计算度带
mapInstance.getMogoMap(MogoMap.DEFAULT)?.switchData(gnssInfo.longitude, gnssInfo.latitude, true)
lastTime = System.currentTimeMillis()
}
}
}