Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Menu
Open sidebar
p x
SuZhouAvp
Commits
bd9ceed0
"mapapi/src/main/res/drawable/circle_white.xml" did not exist on "31fad494e509f03270535487b33360958dc38b9c"
Commit
bd9ceed0
authored
Dec 18, 2025
by
p x
Browse files
模拟召车
parent
f2f64488
Changes
12
Expand all
Hide whitespace changes
Inline
Side-by-side
app/src/main/assets/mock/Car_fangzhen_call.txt
View file @
bd9ceed0
This diff is collapsed.
Click to expand it.
app/src/main/assets/mock/PerTarget.txt
View file @
bd9ceed0
This diff is collapsed.
Click to expand it.
app/src/main/assets/mock/call_shangren.txt
0 → 100644
View file @
bd9ceed0
[{"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
app/src/main/assets/mock/callpath.txt
0 → 100644
View file @
bd9ceed0
This diff is collapsed.
Click to expand it.
app/src/main/java/com/sd/cavphmi/bean/AvpStatuBean.kt
View file @
bd9ceed0
...
...
@@ -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
)
...
...
app/src/main/java/com/sd/cavphmi/ui/MainActivity.kt
View file @
bd9ceed0
...
...
@@ -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预警
...
...
app/src/main/java/com/sd/cavphmi/ui/fragment/UnityFragment.kt
View file @
bd9ceed0
...
...
@@ -110,7 +110,7 @@ class UnityFragment : Fragment() {
// HighMapApi.setCameraAngle(90f)
// HighMapApi.setCameraDistance(80f)
HighMapApi
.
setCameraAngle
(
30f
)
HighMapApi
.
setCameraDistance
(
5
f
)
HighMapApi
.
setCameraDistance
(
8
f
)
// } catch (e: Exception) {
// }
// }, 300)
...
...
app/src/main/java/com/sd/cavphmi/viewmodels/MainVm.kt
View file @
bd9ceed0
...
...
@@ -103,7 +103,7 @@ class MainVm @Inject constructor(
lateinit
var
mockVM
:
MockVM
//是否需要模拟
var
isMock
=
fals
e
var
isMock
=
tru
e
//车辆位姿数据
// 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
.
businessStatu
s
!=
null
){
if
(
result
.
vehiclePo
s
!=
null
){
FileSdCardUtils
.
writeFileToDownload
(
data
,
"CarVehicle.txt"
)
}
carVehicle
.
value
=
result
...
...
app/src/main/java/com/sd/cavphmi/viewmodels/MapOpt.kt
View file @
bd9ceed0
...
...
@@ -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
(
6
f
)
HighMapApi
.
setCameraDistance
(
8
f
)
}
// if (isReversePark)
// return
// isReversePark = true
}
else
{
HighMapApi
.
setCameraAngle
(
30f
)
HighMapApi
.
setCameraDistance
(
6
f
)
HighMapApi
.
setCameraDistance
(
8
f
)
}
}
...
...
app/src/main/java/com/sd/cavphmi/viewmodels/MockVM.kt
View file @
bd9ceed0
...
...
@@ -91,10 +91,10 @@ class MockVM @Inject constructor(
addEndMarker
(
LatLng
(
39.809039362307594
,
116.50254394816011
))
//用矩形框柱
drawEndArea
(
116.50238005214746
,
39.81014469509955
,
116.502
54394816011
,
116.502
38005214746
,
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.80
881912
,
116.502
72019
,
39.809955271
,
116.50204936
39.80
90317
,
116.502
4625
,
39.809955271
625505
,
116.50204936
866068
)
//挂前进挡
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
(
3
00
)
//
drawEndArea(
//
it[1], it[0],
//
39.809955271,
//
116.50204936
//
)
delay
(
2
00
)
}
//消除全局路径
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
()
}
}
...
...
app/src/main/res/layout/activity_login.xml
View file @
bd9ceed0
...
...
@@ -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=
"
visibl
e"
/>
android:visibility=
"
gon
e"
/>
<Button
android:id=
"@+id/bt_avpstatu"
...
...
app/src/main/res/layout/activity_main.xml
View file @
bd9ceed0
...
...
@@ -58,7 +58,7 @@
<LinearLayout
android:id=
"@+id/ll_1"
android:layout_width=
"match_parent"
android:layout_height=
"2
5
dp"
android:layout_height=
"2
3
dp"
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=
"
5
dp"
android:layout_marginLeft=
"
3
dp"
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=
"
5
dp"
android:layout_marginLeft=
"
3
dp"
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=
"
5
dp"
android:layout_marginLeft=
"
3
dp"
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=
"
5
dp"
android:layout_marginLeft=
"
3
dp"
android:background=
"@color/text_blue"
android:text=
"预警人"
android:gravity=
"center"
android:textColor=
"@color/white"
/>
</LinearLayout>
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment