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
94b4364e
Commit
94b4364e
authored
Jun 25, 2025
by
Allvey
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
空车智能增加穿越装载区功能 & 增加挖机禁止功能(仅限穿越装载区及二次调度)
parent
81aa8aa4
Hide whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
101 additions
and
11 deletions
+101
-11
config.json
config.json
+3
-3
group.py
core/group.py
+28
-6
util.py
core/util.py
+26
-0
dispatchInfo.py
data/dispatchInfo.py
+18
-1
area_analysis.py
util/area_analysis.py
+26
-1
No files found.
config.json
View file @
94b4364e
...
...
@@ -27,11 +27,11 @@
"password"
:
"Huituo@123"
},
"gothrough"
:
{
"closer_area_name"
:
"
哈装测试
"
,
"further_area_name"
:
"
哈装2
"
,
"closer_area_name"
:
"
7#装载
"
,
"further_area_name"
:
"
6#装载区
"
,
"factor"
:
0.6
},
"geom"
:
{
"redispatch_minimal_distance"
:
4
0
"redispatch_minimal_distance"
:
2
0
}
}
core/group.py
View file @
94b4364e
...
...
@@ -568,7 +568,7 @@ class GroupDispatcher:
truck_prise_location
=
self
.
group
.
truck
.
truck_current_prise_location
[
truck_id
]
if
not
is_close_to_cross
(
cross_lane
,
truck_prise_location
):
self
.
logger
.
info
(
f
'距离过近无法触发穿越装载区调度'
)
#
self.logger.info(f'距离过近无法触发穿越装载区调度')
try
:
# 获取近端装载区入场点经纬度信息
...
...
@@ -589,11 +589,16 @@ class GroupDispatcher:
truck_to_entrance_point_dis
=
haversine
(
excavator_prise_location
,
truck_prise_location
)
self
.
logger
.
info
(
f
'车辆到近端装载区入场点距离 {truck_to_entrance_point_dis}'
)
self
.
logger
.
info
(
"穿越装载区触发路段"
)
self
.
logger
.
info
(
truck_locate
)
self
.
logger
.
info
(
self
.
gothroghdispatcher
.
closer_area_backtrack_lanes
[
1
:
3
])
self
.
logger
.
info
(
self
.
gothroghdispatcher
.
closer_area_backtrack_lanes
)
# 若车辆到入场点距离大于指定阈值
if
excavator_prise_location
[
0
]
!=
-
1
and
\
truck_prise_location
[
0
]
!=
-
1
and
\
haversine
(
excavator_prise_location
,
truck_prise_location
)
>
0.001
and
\
truck_locate
in
self
.
gothroghdispatcher
.
closer_area_backtrack_lanes
[
0
:
2
]:
truck_locate
in
self
.
gothroghdispatcher
.
closer_area_backtrack_lanes
[
1
:
3
]:
try
:
self
.
logger
.
info
(
"触发穿越装载区调度"
)
planned
=
self
.
gothroghdispatcher
.
redispatch_request
(
request_truck_id
=
truck_id
,
...
...
@@ -602,6 +607,8 @@ class GroupDispatcher:
except
Exception
as
es
:
self
.
logger
.
error
(
"穿越调度失败"
)
self
.
logger
.
error
(
es
)
else
:
self
.
logger
.
info
(
f
'距离过近无法触发穿越装载区调度'
)
# 未触发穿越装载区调度, 判断是否开启二次调度
if
not
planned
and
self
.
group
.
topo
is
not
None
and
truck_locate
is
not
None
:
...
...
@@ -627,7 +634,9 @@ class GroupDispatcher:
if
not
planned
or
truck_task
!=
0
:
self
.
logger
.
info
(
"穿越调度和二次调度均不触发,调度前往卸载区执行固定派车"
)
try
:
truck_dispatch
[
truck_id
]
=
DispatchInfo
.
get_truck_match
(
truck_id
)
current_excavator
=
truck_info
.
get_combined_excavator
()
truck_dispatch
[
truck_id
]
=
[
current_excavator
,
DispatchInfo
.
get_excavator_match
(
current_excavator
)]
# DispatchInfo.get_truck_match(truck_id)
except
Exception
as
es
:
self
.
logger
.
error
(
"空载车辆空车智能模式-计算异常"
)
self
.
logger
.
error
(
es
)
...
...
@@ -993,6 +1002,14 @@ class ReDispatcher:
next_lane_load_area_dict
=
get_lane_reach_load_areas
(
load_area_lane_dict
,
next_lane_list
)
self
.
logger
.
info
(
"交叉口下一路段可达的装载区"
)
self
.
logger
.
info
(
next_lane_load_area_dict
)
# 排除异常掉线挖机
delete_disabled_load_area
(
load_area_dict
)
self
.
logger
.
info
(
"排除异常掉线挖机"
)
self
.
logger
.
info
(
load_area_dict
)
# 排除不连通的装载区
delete_unconnected_load_area
(
truck_info
.
get_combined_unload_area
(),
load_area_dict
)
self
.
logger
.
info
(
"排除不连通的装载区"
)
self
.
logger
.
info
(
load_area_dict
)
# 排除下一个路段阻塞的装载区
delete_congestion_load_area
(
congestion_lane_dict
,
load_area_dict
,
next_lane_load_area_dict
)
...
...
@@ -1003,7 +1020,7 @@ class ReDispatcher:
self
.
logger
.
info
(
"获取车辆经纬度信息"
)
self
.
logger
.
info
(
truck_prise_location
)
if
is_close_to_cross
(
truck_locate
,
truck_prise_location
):
if
not
is_close_to_cross
(
truck_locate
,
truck_prise_location
):
self
.
logger
.
info
(
f
'距离过近无法触发二次调度'
)
return
False
...
...
@@ -1025,6 +1042,7 @@ class ReDispatcher:
return
True
else
:
truck_dispatch
[
truck_id
]
=
[
current_excavator_id
,
current_unload_area_id
]
self
.
logger
.
info
(
f
'二次调度未变更'
)
return
False
...
...
@@ -1249,6 +1267,9 @@ class GoThroughDispatcher:
# 读取挖机状态
self
.
closer_excavator_state
,
self
.
further_excavator_state
=
get_excavator_state
(
self
.
closer_excavator_id
),
\
get_excavator_state
(
self
.
further_excavator_id
)
# 读取挖机禁止
self
.
closer_excavator_disabled
,
self
.
further_excavator_disabled
=
get_excavator_disabled
(
self
.
closer_excavator_id
),
\
get_excavator_disabled
(
self
.
further_excavator_id
)
# 读取两个装载区入场点ids
closer_entrance_node_id
=
session_postgre
.
query
(
DiggingWorkArea
)
.
filter_by
(
...
...
@@ -1415,7 +1436,7 @@ class GoThroughDispatcher:
logger
.
info
(
f
"近端lanes{self.closer_area_backtrack_lanes}"
)
if
request_truck_lane_id
in
self
.
closer_area_backtrack_lanes
[
0
:
2
]:
if
request_truck_lane_id
in
self
.
closer_area_backtrack_lanes
[
1
:
3
]:
# 选择合适装载区
target_excavator
=
None
closer_distance
=
self
.
group
.
to_excavator_distance
[
self
.
group
.
unload_area_uuid_index_dict
[
...
...
@@ -1436,7 +1457,8 @@ class GoThroughDispatcher:
self
.
logger
,
truck
,
truck_locates_dict
,
self
.
closer_excavator_state
,
self
.
further_excavator_state
,
self
.
group
.
truck
.
start_time
,
self
.
group
.
excavator_info
.
get_loading_task_time
()[
0
])
self
.
group
.
excavator_info
.
get_loading_task_time
()[
0
],
self
.
closer_excavator_disabled
,
self
.
further_excavator_disabled
)
except
Exception
as
es
:
logger
.
error
(
"寻找最优装载区异常"
)
logger
.
error
(
es
)
...
...
core/util.py
View file @
94b4364e
...
...
@@ -103,6 +103,32 @@ def delete_congestion_load_area(congestion_lane_dict, load_area_dict, next_lane_
del
load_area_dict
[
load_area
]
def
delete_unconnected_load_area
(
unload_area_id
,
load_area_dict
):
"""
:param congestion_lane_dict: 拥堵路段
:param load_area_dict: 拓扑图规划得到的可达装载区
:param next_lane_load_area_dict: 路段可达的装载区
:return:
"""
for
load_area
in
list
(
load_area_dict
.
keys
()):
item
=
session_postgre
.
query
(
WalkTime
)
.
filter_by
(
load_area_id
=
load_area
,
unload_area_id
=
unload_area_id
)
.
first
()
if
item
is
None
:
del
load_area_dict
[
load_area
]
def
delete_disabled_load_area
(
load_area_dict
):
"""
:param load_area_dict: 拓扑图规划得到的可达装载区
:return:
"""
for
load_area
in
list
(
load_area_dict
.
keys
()):
excavator_id
=
session_mysql
.
query
(
DispatchSetting
)
.
filter_by
(
load_area_id
=
load_area
)
.
first
()
.
exactor_id
excavator_info
=
session_mysql
.
query
(
Equipment
)
.
filter_by
(
id
=
excavator_id
)
.
first
()
if
excavator_info
is
None
or
excavator_info
.
disabled
==
1
:
del
load_area_dict
[
load_area
]
def
get_lane_reach_load_areas
(
load_area_lane_dict
,
next_lane_list
):
next_lane_load_area_dict
=
{}
for
lane_id
in
next_lane_list
:
...
...
data/dispatchInfo.py
View file @
94b4364e
...
...
@@ -54,6 +54,9 @@ class DispatchInfo:
# truck -> match(excavator_id, unload_area_id)
truck_match_dict
=
{}
# excavator_id -> dump_id
excavator_dump_match_dict
=
{}
# group_unload_areas <-> group_dumps id
dump_unload_area_dict
=
{}
unload_area_dump_dict
=
{}
...
...
@@ -194,7 +197,7 @@ class DispatchInfo:
for
item
in
session_mysql
.
query
(
DispatchSetting
)
.
filter_by
(
isdeleted
=
0
)
.
all
():
# add group_excavators
excavator_state
=
session_mysql
.
query
(
Equipment
)
.
filter_by
(
id
=
item
.
exactor_id
)
.
first
()
# if excavator_state is not None and excavator_state.disabled ==
1
:
# if excavator_state is not None and excavator_state.disabled ==
0
:
if
item
.
group_id
not
in
cls
.
group_excavator_dict
.
keys
():
cls
.
group_excavator_dict
[
item
.
group_id
]
=
[
item
.
exactor_id
]
else
:
...
...
@@ -263,6 +266,16 @@ class DispatchInfo:
session_postgre
.
rollback
()
session_mysql
.
rollback
()
# update excavator_id -> dump_id
try
:
for
item
in
session_mysql
.
query
(
DispatchMatch
)
.
all
():
match_unload_area
=
session_mysql
.
query
(
DispatchMatch
)
.
filter_by
(
exactor_id
=
item
.
exactor_id
)
.
first
()
.
unload_area_id
cls
.
excavator_dump_match_dict
[
str
(
item
.
exactor_id
)]
=
match_unload_area
except
Exception
as
es
:
logger
.
error
(
es
)
session_postgre
.
rollback
()
session_mysql
.
rollback
()
@classmethod
def
update_group_mode
(
cls
):
"""
...
...
@@ -486,6 +499,10 @@ class DispatchInfo:
return
cls
.
truck_match_dict
[
truck_id
]
@classmethod
def
get_excavator_match
(
cls
,
excavator_id
):
return
cls
.
excavator_dump_match_dict
[
excavator_id
]
@classmethod
def
get_park_to_excavator_distance
(
cls
,
group_id
):
excavators
=
cls
.
group_excavator_dict
[
group_id
]
park_area_set
=
get_value
(
"park_uuid_to_index_dict"
)
.
keys
()
...
...
util/area_analysis.py
View file @
94b4364e
...
...
@@ -15,7 +15,7 @@ import random
def
area_choose
(
request_truck_id
,
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
,
sys_start_time
,
loading_time
):
loading_time
,
closer_excavator_disabled
,
further_excavator_disabled
):
"""
装载区选择
:param sys_start_time:
...
...
@@ -130,6 +130,12 @@ def area_choose(request_truck_id, excavators_id, closer_area_id, further_area_id
logger
.
info
(
f
"穿越调度:近端挖机满载, 调度车辆前往远端装载区,远端派车数量{goto_further_area_num},空载车总数{arrival_truck_num}"
)
target_excavator
=
DispatchInfo
.
load_excavator_dict
[
further_area_id
]
# truck_dispatch_to_redis(request_truck_id, group_id, DispatchInfo.load_excavator_dict[further_area_id])
if
further_excavator_disabled
==
1
:
target_excavator
=
DispatchInfo
.
load_excavator_dict
[
closer_area_id
]
elif
closer_excavator_disabled
==
1
:
target_excavator
=
DispatchInfo
.
load_excavator_dict
[
further_area_id
]
except
Exception
as
es
:
logger
.
error
(
"找寻最空闲挖机异常"
)
logger
.
error
(
es
)
...
...
@@ -369,6 +375,25 @@ def get_excavator_state(excavator_id):
return
0
def
get_excavator_disabled
(
excavator_id
):
"""
get group_excavators disabled.
:param excavator_id:
:return: disabled
"""
try
:
logger
.
info
(
excavator_id
)
disabled
=
session_mysql
.
query
(
Equipment
)
.
filter_by
(
id
=
excavator_id
,
device_type
=
2
)
.
first
()
.
disabled
return
int
(
disabled
)
except
Exception
as
es
:
logger
.
error
(
"挖机状态读取异常"
)
logger
.
error
(
es
)
return
0
def
get_excavator_prise_location
(
excavator_id
):
"""
get group_excavators prise 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