Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
I
integrated-scheduling-v3
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
1
Merge Requests
1
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
张晓彤
integrated-scheduling-v3
Commits
9efa2d93
Commit
9efa2d93
authored
Oct 19, 2023
by
Allvey
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
加入经纬信息距离判断
parent
35032303
Show whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
93 additions
and
69 deletions
+93
-69
group.py
core/group.py
+23
-59
truck.py
equipment/truck.py
+37
-0
area_analysis.py
util/area_analysis.py
+33
-10
No files found.
core/group.py
View file @
9efa2d93
...
...
@@ -554,12 +554,10 @@ class GroupDispatcher:
raise
Exception
(
f
'车辆 {truck_name} 任务信息丢失'
)
except
Exception
as
es
:
self
.
logger
.
error
(
es
)
# truck_dispatch[truck_id] = [None, None]
return
# 获取车辆位置信息
try
:
# truck_locate = self.group.truck.get_truck_lane_locate_dict()[truck_id]
truck_locate
=
self
.
group
.
truck
.
truck_lane_locate_dict
[
truck_id
]
except
Exception
as
es
:
...
...
@@ -578,31 +576,6 @@ class GroupDispatcher:
if
truck_task
==
3
:
self
.
logger
.
info
(
"正常重载行驶, 执行重载周期调度"
)
self
.
heavy_period_dispatch
(
s
,
truck_dispatch
,
truck_id
,
truck_info
,
truck_task
,
truck_trip
)
# if self.group.topo is not None and truck_locate is not None:
# self.logger.info("潜在二次调度车辆状态")
# self.logger.info(f'车辆 {truck_name}')
# self.logger.info(f'车辆位置 {truck_locate}')
# self.logger.info(f'车辆状态 {self.group.truck.truck_current_state[truck_id]}')
# self.logger.info(f'车辆任务 {truck_task}')
# self.logger.info(f'车辆临时 {truck_is_temp}')
# self.logger.info(self.group.topo.cross_bf_lanes)
# self.logger.info(self.group.truck.truck_current_state)
# # 车辆当前位于交叉路口前,且排队等待
# if (truck_locate in self.group.topo.cross_bf_lanes) and (not truck_is_temp):
# self.logger.info("触发二次调度")
# # self.redispatch_to_dump(truck_id, truck_dispatch, truck_locate, truck_trip)
# try:
# truck_info.redispatch =\
# self.redispatcher.redispatch_to_dump(truck_id, truck_dispatch, truck_locate, truck_trip, truck_info)
# except Exception as es:
# self.logger.error("二次调度至卸载点失败")
# self.logger.error(es)
# else:
# self.logger.info("未触发二次调度, 执行重载周期调度")
# self.heavy_period_dispatch(s, truck_dispatch, truck_id, truck_info, truck_task, truck_trip)
# else:
# self.logger.info("正常重载行驶, 执行重载周期调度")
# self.heavy_period_dispatch(s, truck_dispatch, truck_id, truck_info, truck_task, truck_trip)
else
:
self
.
logger
.
info
(
"卸载区内, 执行重载周期调度"
)
...
...
@@ -610,40 +583,31 @@ class GroupDispatcher:
# 车辆位于装载区内, 调度车辆前往卸载区
elif
truck_task
in
[
0
,
1
,
2
]:
if
truck_task
==
0
:
if
self
.
gothrough_active
:
if
truck_task
==
0
and
self
.
gothrough_active
and
truck_locate
is
not
None
:
self
.
logger
.
info
(
"穿越装载区调度开启"
)
self
.
gothroghdispatcher
.
update_lanes_info
()
try
:
excavator_prise_location
=
get_excavator_prise_location
(
self
.
gothroghdispatcher
.
closer_excavator_id
)
truck_prise_location
=
self
.
group
.
truck
.
truck_current_prise_location
[
truck_id
]
except
Exception
as
es
:
self
.
logger
.
error
(
"挖机或车辆经纬信息未知"
)
self
.
logger
.
error
(
es
)
excavator_prise_location
=
[
-
1
,
-
1
]
truck_prise_location
=
[
-
1
,
-
1
]
self
.
logger
.
info
(
f
'挖机经纬度信息 {excavator_prise_location}'
)
self
.
logger
.
info
(
f
'车辆经纬度信息 {truck_prise_location}'
)
from
haversine
import
haversine
self
.
logger
.
info
(
haversine
(
excavator_prise_location
,
truck_prise_location
))
if
excavator_prise_location
[
0
]
!=
-
1
and
\
truck_prise_location
[
0
]
!=
-
1
and
\
haversine
(
excavator_prise_location
,
truck_prise_location
)
>
0.070
and
\
truck_locate
in
self
.
gothroghdispatcher
.
closer_area_backtrack_lanes
:
self
.
gothroghdispatcher
.
redispatch_request
(
request_truck_id
=
truck_id
,
truck
=
self
.
group
.
truck
,
truck_dispatch
=
truck_dispatch
)
# if self.group.topo is not None and truck_locate is not None:
# # 穿越装载区判断
# if self.gothrough_active:
# self.logger.info("穿越装载区调度开启")
# self.gothroghdispatcher.update_lanes_info()
# self.gothroghdispatcher.redispatch_request(request_truck_id=truck_id, truck=self.group.truck)
# self.logger.info("潜在二次调度车辆状态")
#
# # 车辆当前位于交叉路口前,且排队等待
# self.logger.info(f'车辆 {truck_name}')
# self.logger.info(f'车辆位置 {truck_locate}')
# self.logger.info(f'车辆状态 {self.group.truck.truck_current_state[truck_id]}')
# self.logger.info(f'车辆临时 {truck_is_temp}')
# self.logger.info(self.group.topo.cross_bf_lanes)
# self.logger.info(self.group.truck.truck_current_state)
# if (truck_locate in self.group.topo.cross_bf_lanes) and (not truck_is_temp):
# self.logger.info("触发二次调度")
#
# try:
# truck_info.redispatch =\
# self.redispatcher.redispatch_to_excavator(truck_id, truck_dispatch, truck_locate,
# truck_trip, truck_info)
# except Exception as es:
# self.logger.error("二次调度至装载点失败")
# self.logger.error(es)
# else:
# self.logger.info("未触发二次调度,执行空载周期调度")
# self.empty_period_dispatch(s, truck_dispatch, truck_id, truck_info, truck_trip)
else
:
self
.
logger
.
info
(
"正常空载行驶,执行空载周期调度"
)
...
...
@@ -1329,7 +1293,7 @@ class GoThroughDispatcher:
self
.
logger
.
error
(
es
)
if
(
target_excavator
is
not
None
)
and
(
excavator_now
!=
target_excavator
):
self
.
logger
.
info
(
f
'
更新车辆
{request_truck_name} 派车计划前往 {target_excavator}'
)
self
.
logger
.
info
(
f
'
近端lanes
{request_truck_name} 派车计划前往 {target_excavator}'
)
# 派车计划写入redis
truck_dispatch_to_redis
(
request_truck_id
,
group_id
,
target_excavator
)
...
...
equipment/truck.py
View file @
9efa2d93
...
...
@@ -89,6 +89,8 @@ class TruckInfo(WalkManage):
self
.
truck_lane_locate_dict
=
{}
# 车辆临时调度
self
.
truck_is_temp
=
{}
# 矿卡经纬信息
self
.
truck_current_prise_location
=
{}
def
get_truck_current_trip
(
self
):
return
self
.
truck_current_trip
...
...
@@ -173,6 +175,38 @@ class TruckInfo(WalkManage):
self
.
logger
.
info
(
"矿卡任务信息"
)
self
.
logger
.
info
(
self
.
truck_current_task
)
def
update_truck_prise_location
(
self
):
self
.
truck_current_prise_location
=
{}
device_name_set
=
redis2
.
keys
()
truck_name_to_uuid_dict
=
get_value
(
"truck_name_to_uuid_dict"
)
for
item
in
device_name_set
:
try
:
item
=
item
.
decode
(
encoding
=
"utf-8"
)
key_value_dict
=
redis2
.
hgetall
(
item
)
# reids str可以自动转为bytes
if
str_to_byte
(
"type"
)
in
key_value_dict
:
device_type
=
int
(
key_value_dict
[
str_to_byte
(
"type"
)])
else
:
continue
if
device_type
==
1
:
if
item
not
in
truck_name_to_uuid_dict
:
raise
CoreException
(
107
,
f
'车辆{item}不存在于truck_name_to_uuid_dict'
)
if
truck_name_to_uuid_dict
[
item
]
in
self
.
dynamic_truck_set
:
currentLongitude
=
float
(
byte_to_str
(
key_value_dict
[
str_to_byte
(
"longitude"
)]))
currentLatitude
=
float
(
byte_to_str
(
key_value_dict
[
str_to_byte
(
"latitude"
)]))
self
.
truck_current_prise_location
[
truck_name_to_uuid_dict
[
item
]
]
=
(
currentLatitude
,
currentLongitude
)
except
Exception
as
es
:
self
.
logger
.
warning
(
"读取矿卡经纬信息异常-reids读取异常"
)
self
.
logger
.
warning
(
es
)
self
.
logger
.
info
(
"矿卡经纬信息"
)
self
.
logger
.
info
(
self
.
truck_current_prise_location
)
def
update_truck_is_temp
(
self
):
"""
...
...
@@ -919,3 +953,6 @@ class TruckInfo(WalkManage):
# 矿卡位置更新
self
.
update_trucks_lane_locate
()
# 更新矿卡经纬信息
self
.
update_truck_prise_location
()
util/area_analysis.py
View file @
9efa2d93
...
...
@@ -10,6 +10,7 @@ from data.para_config import *
from
data.dispatchInfo
import
DispatchInfo
import
uuid
def
area_choose
(
excavators_id
,
closer_area_id
,
further_area_id
,
further_lane_set
,
closer_lane_set
,
logger
,
truck
,
truck_locates_dict
,
closer_excavator_state
,
further_excavator_state
):
"""
...
...
@@ -50,7 +51,7 @@ def area_choose(excavators_id, closer_area_id, further_area_id, further_lane_set
logger
.
info
(
arrival_truck_list
)
logger
.
info
(
f
"输入的closer_lane_set{closer_lane_set}"
)
closer_lane_set_nearest
=
[
closer_lane_set
[
-
1
]]
closer_lane_set_nearest
=
[
closer_lane_set
[
0
]]
# 统计不同状态车辆数量
goto_closer_area_num
=
0
goto_further_area_num
=
0
...
...
@@ -109,9 +110,8 @@ def area_choose(excavators_id, closer_area_id, further_area_id, further_lane_set
# target_excavator = DispatchInfo.load_excavator_dict[closer_area_id]
# # truck_dispatch_to_redis(request_truck_id, group_id, DispatchInfo.load_excavator_dict[closer_area_id])
# 近端挖机空闲
if
closer_excavator_state
==
0
and
goto_closer_area_num
==
0
:
if
closer_excavator_state
==
0
:
logger
.
info
(
"近端挖机空闲, 调度车辆前往近端装载区"
)
target_excavator
=
DispatchInfo
.
load_excavator_dict
[
closer_area_id
]
# truck_dispatch_to_redis(request_truck_id, group_id, DispatchInfo.load_excavator_dict[closer_area_id])
...
...
@@ -140,10 +140,10 @@ def area_analysis(load_area_uuid):
load_area_uuid
[
0
]
=
excavator_uuid_to_load_area_uuid_dict
[
load_area_uuid
[
0
]]
load_area_uuid
[
1
]
=
excavator_uuid_to_load_area_uuid_dict
[
load_area_uuid
[
1
]]
distance_a
=
session_postgre
.
query
(
WalkTimePark
)
\
distance_a
=
session_postgre
.
query
(
WalkTimePark
)
\
.
filter_by
(
load_area_id
=
load_area_uuid
[
0
])
.
first
()
.
park_load_distance
distance_b
=
session_postgre
.
query
(
WalkTimePark
)
\
distance_b
=
session_postgre
.
query
(
WalkTimePark
)
\
.
filter_by
(
load_area_id
=
load_area_uuid
[
1
])
.
first
()
.
park_load_distance
if
distance_a
>
distance_b
:
...
...
@@ -265,9 +265,6 @@ def truck_dispatch_to_redis(truck_id, group_id, excavator_id):
item
=
(
session_mysql
.
query
(
DispatchSetting
)
.
filter_by
(
group_id
=
group_id
,
isdeleted
=
0
,
)
.
first
())
logger
.
error
(
es
)
logger
.
info
(
f
"{type(truck_id)}"
)
logger
.
info
(
f
"{type(item.truck_id)}"
)
if
str
(
truck_id
)
!=
str
(
item
.
truck_id
):
logger
.
info
(
"无重复派车计划,重新生成中"
)
# 其余调度信息写入
try
:
...
...
@@ -289,8 +286,6 @@ def truck_dispatch_to_redis(truck_id, group_id, excavator_id):
logger
.
error
(
es
)
finally
:
redis5
.
set
(
truck_id
,
str
(
json
.
dumps
(
record
)))
else
:
logger
.
info
(
"调度计划相同,无需变更"
)
def
get_lanes_between_entrances
(
closer_node_id
,
further_node_id
):
...
...
@@ -353,3 +348,31 @@ def get_excavator_state(excavator_id):
logger
.
error
(
"挖机状态读取异常"
)
logger
.
error
(
es
)
return
0
def
get_excavator_prise_location
(
excavator_id
):
"""
get group_excavators prise location.
:param excavator_id:
:return: location
"""
try
:
logger
.
error
(
excavator_id
)
device_name
=
session_mysql
.
query
(
Equipment
)
.
filter_by
(
id
=
excavator_id
,
device_type
=
2
)
.
first
()
.
device_name
are_entrance_key
=
str
(
"Area_"
+
device_name
)
key_value_dict
=
json
.
loads
(
byte_to_str
(
redis0
.
get
(
are_entrance_key
)))
loc_str
=
key_value_dict
[
'Entrance'
]
.
split
(
","
)
longitude
=
float
(
loc_str
[
0
])
latitude
=
float
(
loc_str
[
1
])
location
=
(
latitude
,
longitude
)
return
location
except
Exception
as
es
:
logger
.
error
(
"挖机状态读取异常"
)
logger
.
error
(
es
)
location
=
(
-
1
,
-
1
)
return
location
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