Commit bd9ceed0 authored by p x's avatar p x
Browse files

模拟召车

parent f2f64488
This diff is collapsed.
[{"id":"3743379f-ddea-4816-9a34-e3b699810c50","deviceCode":"C-HK-38","deviceId":"DW17-XJ-003-034","intersectionCode":"yz-17","reportTime":1758163422384,"accessTime":1758163345458,"receiveTime":1758163422384,"participants":[{"ptcId":"50332456-3030-3030-3530-303334533955","ptcType":"pedestrian","longitude":"116.50230306","latitude":"39.80994386","heading":145,"speed":8.14,"gear":0,"color":0}]}]
[{"id":"3743379f-ddea-4816-9a34-e3b699810c50","deviceCode":"C-HK-38","deviceId":"DW17-XJ-003-034","intersectionCode":"yz-17","reportTime":1758163422384,"accessTime":1758163345458,"receiveTime":1758163422384,"participants":[{"ptcId":"50332456-3030-3030-3530-303334533955","ptcType":"pedestrian","longitude":"116.50226374","latitude":"39.80999206","heading":145,"speed":8.14,"gear":0,"color":0}]}]
[{"id":"3743379f-ddea-4816-9a34-e3b699810c50","deviceCode":"C-HK-38","deviceId":"DW17-XJ-003-034","intersectionCode":"yz-17","reportTime":1758163422384,"accessTime":1758163345458,"receiveTime":1758163422384,"participants":[{"ptcId":"50332456-3030-3030-3530-303334533955","ptcType":"pedestrian","longitude":"116.50220032","latitude":"39.80999713","heading":145,"speed":8.14,"gear":0,"color":0}]}]
[{"id":"3743379f-ddea-4816-9a34-e3b699810c50","deviceCode":"C-HK-38","deviceId":"DW17-XJ-003-034","intersectionCode":"yz-17","reportTime":1758163422384,"accessTime":1758163345458,"receiveTime":1758163422384,"participants":[{"ptcId":"50332456-3030-3030-3530-303334533955","ptcType":"pedestrian","longitude":"116.50204936866068","latitude":"39.809955271625505","heading":145,"speed":8.14,"gear":0,"color":0}]}]
[{"id":"3743379f-ddea-4816-9a34-e3b699810c50","deviceCode":"C-HK-38","deviceId":"DW17-XJ-003-034","intersectionCode":"yz-17","reportTime":1758163422384,"accessTime":1758163345458,"receiveTime":1758163422384,"participants":[{"ptcId":"50332456-3030-3030-3530-303334533955","ptcType":"pedestrian","longitude":"116.50204936866068","latitude":"39.809955271625505","heading":145,"speed":8.14,"gear":0,"color":0}]}]
\ No newline at end of file
This diff is collapsed.
......@@ -19,13 +19,14 @@ data class AvpStatuBean(
)
data class DrivenDecision(
val endPoint: EndPoint,
val endPoint: EndPoint,//终点
// val progress: Any,
// val routing: Any,
val startPoint: StartPoint,
val trajectory: Trajectory
val startPoint: StartPoint,//起点
val trajectory: Trajectory //// 全局路径
)
//车位信息
data class Space(
val centerLatitude: Double,
val centerLongitude: Double,
......@@ -97,13 +98,14 @@ data class StartPoint(
val verticalAcce: Any
)
// 全局路径
data class Trajectory(
val arrived: Boolean,
val endPoint: EndPointX,
val length: Double,
val pathArray: Any,
val pathLine: String,
val points: List<Point>,
val points: List<Point>,// 全局路径 02坐标系
val startPoint: StartPointX,
val time: Int
)
......
......@@ -20,6 +20,7 @@ import com.sd.cavphmi.base.BaseActivity
import com.sd.cavphmi.base.MyBaseViewModel
import com.sd.cavphmi.bean.AvpStatuBean
import com.sd.cavphmi.bean.CarVehicle
import com.sd.cavphmi.bean.PerceptionBean
import com.sd.cavphmi.databinding.ActivityMainBinding
import com.sd.cavphmi.highmap.HighMapApi
import com.sd.cavphmi.highmap.LockStatu
......@@ -274,6 +275,10 @@ class MainActivity : BaseActivity<ActivityMainBinding, MyBaseViewModel>() {
}
}
}
//召车的时候临时开一下
mainVm.targetPre.observe(this) {
showPre(it)
}
}
//显示车辆位姿UI
......@@ -307,32 +312,36 @@ class MainActivity : BaseActivity<ActivityMainBinding, MyBaseViewModel>() {
//联网车辆感知物
private fun getTarget() {
mainVm.subTarget().observe(this) { it ->
if (it.getOrNull(0) == null) {
showPre(it)
}
}
return@observe
}
var parts = it.flatMap { it.participants }
if (parts.count() == 0) {
HighMapApi.clearPtcData()
return@observe
}
var ptcList = parts.map {
var unityPtc = UnityPtc().apply {
lat = it.latitude
lon = it.longitude
ptcid = it.ptcId
heading = it.heading
/**绘制感知物****/
private fun showPre(it: PerceptionBean) {
if (it.getOrNull(0) == null) {
return
}
var parts = it.flatMap { it.participants }
if (parts.count() == 0) {
HighMapApi.clearPtcData()
return
}
var ptcList = parts.map {
var unityPtc = UnityPtc().apply {
lat = it.latitude
lon = it.longitude
ptcid = it.ptcId
heading = it.heading
pType = 1
if (it.ptcType == "car") {
pType = 1
if (it.ptcType == "car") {
pType = 1
} else if (it.ptcType == "pedestrian") {
pType = 2
}
} else if (it.ptcType == "pedestrian") {
pType = 2
}
return@map unityPtc
}
HighMapApi.setPtcData(ptcList)
return@map unityPtc
}
HighMapApi.setPtcData(ptcList)
}
//开启v2x预警
......
......@@ -110,7 +110,7 @@ class UnityFragment : Fragment() {
// HighMapApi.setCameraAngle(90f)
// HighMapApi.setCameraDistance(80f)
HighMapApi.setCameraAngle(30f)
HighMapApi.setCameraDistance(5f)
HighMapApi.setCameraDistance(8f)
// } catch (e: Exception) {
// }
// }, 300)
......
......@@ -103,7 +103,7 @@ class MainVm @Inject constructor(
lateinit var mockVM: MockVM
//是否需要模拟
var isMock = false
var isMock = true
//车辆位姿数据
// var carVehicle = MutableLiveData<CarVehicle>()
......@@ -221,10 +221,10 @@ class MainVm @Inject constructor(
) {
viewModelScope.launch {
if (data.isNotEmpty()) {
// println("-------AVP状态 = ${data}")
println("-------AVP状态 = ${data}")
try {
var result = gson.fromJson<AvpStatuBean>(data, AvpStatuBean::class.java)
if (result.haulingStageState != null) {
if (result.haulingStageState != null) {//businessType
FileSdCardUtils.writeFileToDownload(data, "avp_status.txt")
}
avpStatu.emit(result)
......@@ -256,7 +256,7 @@ class MainVm @Inject constructor(
if (isMock) {
// mockVM.subVehicle(carVehicle)
// mockVM.onVehicleMockPark(carVehicle)
mockVM.onVehicleMockCall(carVehicle)
mockVM.onVehicleMockCall(carVehicle,targetPre)
} else {
var url = "${MyContants.HOST}/api/avpweb/hmi/monitor/v1/monitorDrivenStatus"
carCb.url = url
......@@ -284,7 +284,7 @@ class MainVm @Inject constructor(
// println("-----车辆位姿 = ${data}")
try {
var result = gson.fromJson<CarVehicle>(data, CarVehicle::class.java)
if (result.businessStatus!=null){
if (result.vehiclePos!=null){
FileSdCardUtils.writeFileToDownload(data, "CarVehicle.txt")
}
carVehicle.value = result
......
......@@ -238,7 +238,7 @@ class MapOpt @Inject constructor(
mMineMap?.setPointToCenter(point.x, point.y)
} else {
if (drawAreaCount.div(50) == 0) {
println("----------drawAreaCount = $drawAreaCount")
// println("----------drawAreaCount = $drawAreaCount")
var lon1 = car.vehiclePos!!.get(0)
var lat1 = car.vehiclePos!!.get(1)
var lon2 = sLatLngs!!.last().x.div(100000.0)
......@@ -302,14 +302,14 @@ class MapOpt @Inject constructor(
HighMapApi.setParkComplete(true)
} else {
HighMapApi.setCameraAngle(30f)
HighMapApi.setCameraDistance(6f)
HighMapApi.setCameraDistance(8f)
}
// if (isReversePark)
// return
// isReversePark = true
} else {
HighMapApi.setCameraAngle(30f)
HighMapApi.setCameraDistance(6f)
HighMapApi.setCameraDistance(8f)
}
}
......
......@@ -91,10 +91,10 @@ class MockVM @Inject constructor(
addEndMarker(LatLng(39.809039362307594, 116.50254394816011))
//用矩形框柱
drawEndArea(
116.50238005214746,
39.81014469509955,
116.50254394816011,
116.50238005214746,
39.809039362307594,
116.50254394816011,
)
//画出全局路径
var lines = mRoutes.rs.map {
......@@ -159,7 +159,7 @@ class MockVM @Inject constructor(
// }
// HighMapApi.setLockStatus(lockStatu)
//开始泊车
var parkStr = FileIoUtils.getAsset(context, "mock/parkpath.txt") //Qgis里取的点和四维取得点混合
var parkStr = FileIoUtils.getAsset(context, "mock/parkpath.txt")
val parkPath = gson.fromJson<ParkPath>(parkStr, ParkPath::class.java)
//改变镜头角度
HighMapApi.setCameraAngle(60f)
......@@ -239,55 +239,105 @@ class MockVM @Inject constructor(
}
fun drawEndArea(lat1: Double, lon1: Double, lat2: Double, lon2: Double) {
var minLat = Math.min(lat1, lat2).times(100000).toInt() - 10
var maxLat = Math.max(lat1, lat2).times(100000).toInt() + 10
var minLon = minOf(lon1, lon2).times(100000).toInt() - 10
var maxLon = maxOf(lon1, lon2).times(100000).toInt() + 10
val MU = 100000
var minLat = Math.min(lat1, lat2).times(MU).toInt() - 100
var maxLat = Math.max(lat1, lat2).times(MU).toInt() + 100
var minLon = Math.min(lon1, lon2).times(MU).toInt() - 10
var maxLon = Math.max(lon1, lon2).times(MU).toInt() + 10
var rect = Rect(
minLon, minLat,
maxLon, maxLat
minLon, minLat, maxLon, maxLat
)
mMineMap?.fitWorldArea(rect)
}
//召车 航向角 238.38134765625
fun onVehicleMockCall(
carVehicle: MutableStateFlow<CarVehicle>
carVehicle: MutableStateFlow<CarVehicle>,
targetPre: MutableLiveData<PerceptionBean>?
) {
viewModelScope.launch {
var cCar: CarVehicle
//初始镜头角度
HighMapApi.setCameraAngle(90f)
HighMapApi.setCameraDistance(20f)
var gson = Gson()
var str =
FileIoUtils.getAsset(context, "mock/Car_fangzhen_call.txt")
val mRoutes = gson.fromJson<MRoutes>(str, MRoutes::class.java)
delay(3000)
//2旁车辆占用
var spinfos = listOf(Spinfo().apply {
code = "B016"
state = true
}, Spinfo().apply {
code = "B018"
state = true
})
HighMapApi.setParkStatu(ParkStatu(spinfos))
delay(5000)
var cCar: CarVehicle
var gson = Gson()
//画局部图小车
drawNavingCar(Tools.latLngToPoint(LatLng(39.80881912, 116.50272019)))
//画局部图路径
smallLineMock(mRoutes)
drawNavingCar(Tools.latLngToPoint(LatLng(39.8090317, 116.5024625)))
//画终点
addEndMarker(LatLng(39.809955271, 116.50204936))
//用矩形框柱
drawEndArea(
39.80881912,
116.50272019,
39.809955271,
116.50204936
39.8090317,
116.5024625,
39.809955271625505,
116.50204936866068
)
//挂前进挡
CarPanelBean.instance.tapPos.set(2)
//开始出库
/* var callStr = FileIoUtils.getAsset(context, "mock/callpath.txt")
val callPath = gson.fromJson<ParkPath>(callStr, ParkPath::class.java)
CarPanelBean.instance.speed.set(5)//减速
var forword = callPath.result.routes.find { it.gear == 3 }
forword?.polyline?.forEach { poly ->
cCar = CarVehicle().apply {
this.vehiclePos = listOf(poly.get(0), poly.get(1), poly.get(3))
}
//更新主车位置
carVehicle.value = cCar
//更新小地图小车
showNavingCarPosition(
Tools.latLngToNdsPoint(
LatLng(
cCar.vehiclePos!!.get(1),
cCar.vehiclePos!!.get(0)
)
),
cCar.vehiclePos!!.get(2).toFloat()
)
delay(200)
}*/
var str =
FileIoUtils.getAsset(context, "mock/Car_fangzhen_call.txt")
val mRoutes = gson.fromJson<MRoutes>(str, MRoutes::class.java)
//生成局部图路径
smallLineMock(mRoutes)
//画出全局路径
var lines = mRoutes.rs.map {
AllLine(it[1], it[0])
}
HighMapApi.setCarNavPath(lines, showdistance = 200)
//开始跟车
HighMapApi.setCameraAngle(30f)
HighMapApi.setCameraDistance(8f)
//加速
CarPanelBean.instance.speed.set(25)
//模拟车辆移动
var head = 0.0
var oldHead = 0.0
var bearing = 0.0
mRoutes.rs.forEachIndexed { index, it ->
if (index > 0 && index < mRoutes.rs.count()) {
if (index > 0 && index < mRoutes.rs.count()) {
var p1 = mRoutes.rs.get(index - 1)
var pc = mRoutes.rs.get(index)
// head = BasicTools.calculateBearing(p1[0],p1[1], pc[1], pc[0])
......@@ -295,43 +345,58 @@ class MockVM @Inject constructor(
LatLng(p1[1], p1[0]),
LatLng(pc[1], pc[0])
)
// bearing = head
// println("-------- head = ${head} oldHead = ${oldHead} ${(head - oldHead).absoluteValue.toInt()}")
// if (oldHead!=0.0 && (head - oldHead).absoluteValue.toInt() < 45) {
// bearing = head
// }
cCar = CarVehicle().apply {
this.vehiclePos = listOf(it[0], it[1], head)
}
//更新主车位置
carVehicle.value = cCar
oldHead = head
//更新小地图小车
showNavingCarPosition(
Tools.latLngToNdsPoint(
LatLng(
cCar.vehiclePos!!.get(1),
cCar.vehiclePos!!.get(0)
)
),
cCar.vehiclePos!!.get(2).toFloat()
)
//更新小地图路径
upSmallLine(index, mRoutes)
}
if ((head - oldHead).absoluteValue < 45) {
bearing = head
}
cCar = CarVehicle().apply {
this.vehiclePos = listOf(it[0], it[1], bearing)
}
oldHead = head
//更新主车位置
carVehicle.value = cCar
//更新小地图小车
showNavingCarPosition(
Tools.latLngToNdsPoint(
LatLng(
cCar.vehiclePos!!.get(1),
cCar.vehiclePos!!.get(0)
)
),
cCar.vehiclePos!!.get(2).toFloat()
)
//更新小地图路径
upSmallLine(index, mRoutes)
//用矩形框柱
drawEndArea(
it[1], it[0],
39.809955271,
116.50204936
)
delay(300)
// drawEndArea(
// it[1], it[0],
// 39.809955271,
// 116.50204936
// )
delay(200)
}
//消除全局路径
HighMapApi.setCarNavPath(listOf())
//删除终点mark
deleteEndMarker()
//挂P档
CarPanelBean.instance.tapPos.set(1)
//挂N档等人
CarPanelBean.instance.tapPos.set(0)
CarPanelBean.instance.speed.set(0)
//上人
val parts = mutableListOf<String>()
FileIoUtils.getAssetMock(context, "mock/call_shangren.txt", parts)
parts.forEach { str ->
if (str.isNotEmpty()) {
var bean = parseDataBean(str, PerceptionBean::class.java)
if (bean != null) {
targetPre?.value = bean
delay(500)
}
}
}
HighMapApi.clearPtcData()
}
}
......
......@@ -117,13 +117,12 @@
android:orientation="horizontal">
<Button
android:id="@+id/bt_spaceinfo"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="车位占用情况"
android:visibility="visible" />
android:visibility="gone" />
<Button
android:id="@+id/bt_avpstatu"
......
......@@ -58,7 +58,7 @@
<LinearLayout
android:id="@+id/ll_1"
android:layout_width="match_parent"
android:layout_height="25dp"
android:layout_height="23dp"
android:layout_alignParentBottom="true"
android:orientation="horizontal"
android:visibility="visible">
......@@ -79,16 +79,17 @@
android:layout_height="match_parent"
android:layout_marginLeft="3dp"
android:background="@color/text_blue"
android:text="感知物"
android:text="感知物" android:gravity="center"
android:textColor="@color/white" />
<TextView
android:id="@+id/bt_v2x"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_marginLeft="5dp"
android:layout_marginLeft="3dp"
android:background="@color/text_blue"
android:text="V2X预警开始"
android:gravity="center"
android:textColor="@color/white" />
......@@ -96,9 +97,10 @@
android:id="@+id/bt_avpStatu"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_marginLeft="5dp"
android:layout_marginLeft="3dp"
android:background="@color/text_blue"
android:text="AVP状态"
android:gravity="center"
android:textColor="@color/white" />
<TextView
......@@ -149,18 +151,20 @@
android:id="@+id/warn_car"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_marginLeft="5dp"
android:layout_marginLeft="3dp"
android:background="@color/text_blue"
android:text="预警车"
android:gravity="center"
android:textColor="@color/white" />
<TextView
android:id="@+id/warn_peo"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_marginLeft="5dp"
android:layout_marginLeft="3dp"
android:background="@color/text_blue"
android:text="预警人"
android:gravity="center"
android:textColor="@color/white" />
</LinearLayout>
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment