feat(collision_detection): add diverging release distance parameter

- Introduced a new configuration parameter `diverging_release_distance` to the collision detection system, allowing for dynamic adjustment of the distance threshold at which conflicts are resolved when vehicles are diverging.
- Updated the system configuration files and documentation to reflect this new parameter.
- Implemented logic in the collision detection algorithm to utilize the diverging release distance for immediate conflict resolution when conditions are met.
- Added unit tests to verify the functionality of the diverging release distance in various scenarios, ensuring that conflicts are resolved correctly based on the new parameter.
This commit is contained in:
sladro 2026-03-04 11:51:06 +08:00
parent 4cc18fae34
commit 0ff88b0ba2
18 changed files with 217 additions and 193 deletions

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -1,98 +1,21 @@
^D:\APP\C++\COLLISIONAVOIDANCE\CMAKELISTS.TXT
C:\PROGRAM FILES\CMAKE\SHARE\CMAKE-3.31\MODULES\CMAKECCOMPILER.CMAKE.IN
C:\PROGRAM FILES\CMAKE\SHARE\CMAKE-3.31\MODULES\CMAKECCOMPILERABI.C
C:\PROGRAM FILES\CMAKE\SHARE\CMAKE-3.31\MODULES\CMAKECINFORMATION.CMAKE
C:\PROGRAM FILES\CMAKE\SHARE\CMAKE-3.31\MODULES\CMAKECXXCOMPILER.CMAKE.IN
C:\PROGRAM FILES\CMAKE\SHARE\CMAKE-3.31\MODULES\CMAKECXXCOMPILERABI.CPP
C:\PROGRAM FILES\CMAKE\SHARE\CMAKE-3.31\MODULES\CMAKECXXINFORMATION.CMAKE
C:\PROGRAM FILES\CMAKE\SHARE\CMAKE-3.31\MODULES\CMAKECOMMONLANGUAGEINCLUDE.CMAKE
C:\PROGRAM FILES\CMAKE\SHARE\CMAKE-3.31\MODULES\CMAKECOMPILERIDDETECTION.CMAKE
C:\PROGRAM FILES\CMAKE\SHARE\CMAKE-3.31\MODULES\CMAKEDETERMINECCOMPILER.CMAKE
C:\PROGRAM FILES\CMAKE\SHARE\CMAKE-3.31\MODULES\CMAKEDETERMINECXXCOMPILER.CMAKE
C:\PROGRAM FILES\CMAKE\SHARE\CMAKE-3.31\MODULES\CMAKEDETERMINECOMPILER.CMAKE
C:\PROGRAM FILES\CMAKE\SHARE\CMAKE-3.31\MODULES\CMAKEDETERMINECOMPILERABI.CMAKE
C:\PROGRAM FILES\CMAKE\SHARE\CMAKE-3.31\MODULES\CMAKEDETERMINECOMPILERID.CMAKE
C:\PROGRAM FILES\CMAKE\SHARE\CMAKE-3.31\MODULES\CMAKEDETERMINECOMPILERSUPPORT.CMAKE
C:\PROGRAM FILES\CMAKE\SHARE\CMAKE-3.31\MODULES\CMAKEDETERMINERCCOMPILER.CMAKE
C:\PROGRAM FILES\CMAKE\SHARE\CMAKE-3.31\MODULES\CMAKEDETERMINESYSTEM.CMAKE
C:\PROGRAM FILES\CMAKE\SHARE\CMAKE-3.31\MODULES\CMAKEFINDBINUTILS.CMAKE
C:\PROGRAM FILES\CMAKE\SHARE\CMAKE-3.31\MODULES\CMAKEFINDDEPENDENCYMACRO.CMAKE
C:\PROGRAM FILES\CMAKE\SHARE\CMAKE-3.31\MODULES\CMAKEGENERICSYSTEM.CMAKE
C:\PROGRAM FILES\CMAKE\SHARE\CMAKE-3.31\MODULES\CMAKEINITIALIZECONFIGS.CMAKE
C:\PROGRAM FILES\CMAKE\SHARE\CMAKE-3.31\MODULES\CMAKELANGUAGEINFORMATION.CMAKE
C:\PROGRAM FILES\CMAKE\SHARE\CMAKE-3.31\MODULES\CMAKEPARSEIMPLICITINCLUDEINFO.CMAKE
C:\PROGRAM FILES\CMAKE\SHARE\CMAKE-3.31\MODULES\CMAKEPARSEIMPLICITLINKINFO.CMAKE
C:\PROGRAM FILES\CMAKE\SHARE\CMAKE-3.31\MODULES\CMAKEPARSELIBRARYARCHITECTURE.CMAKE
C:\PROGRAM FILES\CMAKE\SHARE\CMAKE-3.31\MODULES\CMAKERCCOMPILER.CMAKE.IN
C:\PROGRAM FILES\CMAKE\SHARE\CMAKE-3.31\MODULES\CMAKERCINFORMATION.CMAKE
C:\PROGRAM FILES\CMAKE\SHARE\CMAKE-3.31\MODULES\CMAKESYSTEM.CMAKE.IN
C:\PROGRAM FILES\CMAKE\SHARE\CMAKE-3.31\MODULES\CMAKESYSTEMSPECIFICINFORMATION.CMAKE
C:\PROGRAM FILES\CMAKE\SHARE\CMAKE-3.31\MODULES\CMAKESYSTEMSPECIFICINITIALIZE.CMAKE
C:\PROGRAM FILES\CMAKE\SHARE\CMAKE-3.31\MODULES\CMAKETESTCCOMPILER.CMAKE
C:\PROGRAM FILES\CMAKE\SHARE\CMAKE-3.31\MODULES\CMAKETESTCXXCOMPILER.CMAKE
C:\PROGRAM FILES\CMAKE\SHARE\CMAKE-3.31\MODULES\CMAKETESTCOMPILERCOMMON.CMAKE
C:\PROGRAM FILES\CMAKE\SHARE\CMAKE-3.31\MODULES\CMAKETESTRCCOMPILER.CMAKE
C:\PROGRAM FILES\CMAKE\SHARE\CMAKE-3.31\MODULES\CHECKCSOURCECOMPILES.CMAKE
C:\PROGRAM FILES\CMAKE\SHARE\CMAKE-3.31\MODULES\CHECKINCLUDEFILE.CMAKE
C:\PROGRAM FILES\CMAKE\SHARE\CMAKE-3.31\MODULES\CHECKLIBRARYEXISTS.CMAKE
C:\PROGRAM FILES\CMAKE\SHARE\CMAKE-3.31\MODULES\COMPILER\ADSP-DETERMINECOMPILER.CMAKE
C:\PROGRAM FILES\CMAKE\SHARE\CMAKE-3.31\MODULES\COMPILER\ARMCC-DETERMINECOMPILER.CMAKE
C:\PROGRAM FILES\CMAKE\SHARE\CMAKE-3.31\MODULES\COMPILER\ARMCLANG-DETERMINECOMPILER.CMAKE
C:\PROGRAM FILES\CMAKE\SHARE\CMAKE-3.31\MODULES\COMPILER\APPLECLANG-DETERMINECOMPILER.CMAKE
C:\PROGRAM FILES\CMAKE\SHARE\CMAKE-3.31\MODULES\COMPILER\BORLAND-DETERMINECOMPILER.CMAKE
C:\PROGRAM FILES\CMAKE\SHARE\CMAKE-3.31\MODULES\COMPILER\BRUCE-C-DETERMINECOMPILER.CMAKE
C:\PROGRAM FILES\CMAKE\SHARE\CMAKE-3.31\MODULES\COMPILER\CMAKECOMMONCOMPILERMACROS.CMAKE
C:\PROGRAM FILES\CMAKE\SHARE\CMAKE-3.31\MODULES\COMPILER\CLANG-DETERMINECOMPILER.CMAKE
C:\PROGRAM FILES\CMAKE\SHARE\CMAKE-3.31\MODULES\COMPILER\CLANG-DETERMINECOMPILERINTERNAL.CMAKE
C:\PROGRAM FILES\CMAKE\SHARE\CMAKE-3.31\MODULES\COMPILER\COMPAQ-C-DETERMINECOMPILER.CMAKE
C:\PROGRAM FILES\CMAKE\SHARE\CMAKE-3.31\MODULES\COMPILER\COMPAQ-CXX-DETERMINECOMPILER.CMAKE
C:\PROGRAM FILES\CMAKE\SHARE\CMAKE-3.31\MODULES\COMPILER\CRAY-DETERMINECOMPILER.CMAKE
C:\PROGRAM FILES\CMAKE\SHARE\CMAKE-3.31\MODULES\COMPILER\CRAYCLANG-DETERMINECOMPILER.CMAKE
C:\PROGRAM FILES\CMAKE\SHARE\CMAKE-3.31\MODULES\COMPILER\EMBARCADERO-DETERMINECOMPILER.CMAKE
C:\PROGRAM FILES\CMAKE\SHARE\CMAKE-3.31\MODULES\COMPILER\FUJITSU-DETERMINECOMPILER.CMAKE
C:\PROGRAM FILES\CMAKE\SHARE\CMAKE-3.31\MODULES\COMPILER\FUJITSUCLANG-DETERMINECOMPILER.CMAKE
C:\PROGRAM FILES\CMAKE\SHARE\CMAKE-3.31\MODULES\COMPILER\GHS-DETERMINECOMPILER.CMAKE
C:\PROGRAM FILES\CMAKE\SHARE\CMAKE-3.31\MODULES\COMPILER\GNU-C-DETERMINECOMPILER.CMAKE
C:\PROGRAM FILES\CMAKE\SHARE\CMAKE-3.31\MODULES\COMPILER\GNU-CXX-DETERMINECOMPILER.CMAKE
C:\PROGRAM FILES\CMAKE\SHARE\CMAKE-3.31\MODULES\COMPILER\HP-C-DETERMINECOMPILER.CMAKE
C:\PROGRAM FILES\CMAKE\SHARE\CMAKE-3.31\MODULES\COMPILER\HP-CXX-DETERMINECOMPILER.CMAKE
C:\PROGRAM FILES\CMAKE\SHARE\CMAKE-3.31\MODULES\COMPILER\IAR-DETERMINECOMPILER.CMAKE
C:\PROGRAM FILES\CMAKE\SHARE\CMAKE-3.31\MODULES\COMPILER\IBMCPP-C-DETERMINEVERSIONINTERNAL.CMAKE
C:\PROGRAM FILES\CMAKE\SHARE\CMAKE-3.31\MODULES\COMPILER\IBMCPP-CXX-DETERMINEVERSIONINTERNAL.CMAKE
C:\PROGRAM FILES\CMAKE\SHARE\CMAKE-3.31\MODULES\COMPILER\IBMCLANG-C-DETERMINECOMPILER.CMAKE
C:\PROGRAM FILES\CMAKE\SHARE\CMAKE-3.31\MODULES\COMPILER\IBMCLANG-CXX-DETERMINECOMPILER.CMAKE
C:\PROGRAM FILES\CMAKE\SHARE\CMAKE-3.31\MODULES\COMPILER\INTEL-DETERMINECOMPILER.CMAKE
C:\PROGRAM FILES\CMAKE\SHARE\CMAKE-3.31\MODULES\COMPILER\INTELLLVM-DETERMINECOMPILER.CMAKE
C:\PROGRAM FILES\CMAKE\SHARE\CMAKE-3.31\MODULES\COMPILER\LCC-C-DETERMINECOMPILER.CMAKE
C:\PROGRAM FILES\CMAKE\SHARE\CMAKE-3.31\MODULES\COMPILER\LCC-CXX-DETERMINECOMPILER.CMAKE
C:\PROGRAM FILES\CMAKE\SHARE\CMAKE-3.31\MODULES\COMPILER\MSVC-C.CMAKE
C:\PROGRAM FILES\CMAKE\SHARE\CMAKE-3.31\MODULES\COMPILER\MSVC-CXX.CMAKE
C:\PROGRAM FILES\CMAKE\SHARE\CMAKE-3.31\MODULES\COMPILER\MSVC-DETERMINECOMPILER.CMAKE
C:\PROGRAM FILES\CMAKE\SHARE\CMAKE-3.31\MODULES\COMPILER\MSVC.CMAKE
C:\PROGRAM FILES\CMAKE\SHARE\CMAKE-3.31\MODULES\COMPILER\NVHPC-DETERMINECOMPILER.CMAKE
C:\PROGRAM FILES\CMAKE\SHARE\CMAKE-3.31\MODULES\COMPILER\NVIDIA-DETERMINECOMPILER.CMAKE
C:\PROGRAM FILES\CMAKE\SHARE\CMAKE-3.31\MODULES\COMPILER\OPENWATCOM-DETERMINECOMPILER.CMAKE
C:\PROGRAM FILES\CMAKE\SHARE\CMAKE-3.31\MODULES\COMPILER\ORANGEC-DETERMINECOMPILER.CMAKE
C:\PROGRAM FILES\CMAKE\SHARE\CMAKE-3.31\MODULES\COMPILER\PGI-DETERMINECOMPILER.CMAKE
C:\PROGRAM FILES\CMAKE\SHARE\CMAKE-3.31\MODULES\COMPILER\PATHSCALE-DETERMINECOMPILER.CMAKE
C:\PROGRAM FILES\CMAKE\SHARE\CMAKE-3.31\MODULES\COMPILER\SCO-DETERMINECOMPILER.CMAKE
C:\PROGRAM FILES\CMAKE\SHARE\CMAKE-3.31\MODULES\COMPILER\SDCC-C-DETERMINECOMPILER.CMAKE
C:\PROGRAM FILES\CMAKE\SHARE\CMAKE-3.31\MODULES\COMPILER\SUNPRO-C-DETERMINECOMPILER.CMAKE
C:\PROGRAM FILES\CMAKE\SHARE\CMAKE-3.31\MODULES\COMPILER\SUNPRO-CXX-DETERMINECOMPILER.CMAKE
C:\PROGRAM FILES\CMAKE\SHARE\CMAKE-3.31\MODULES\COMPILER\TI-DETERMINECOMPILER.CMAKE
C:\PROGRAM FILES\CMAKE\SHARE\CMAKE-3.31\MODULES\COMPILER\TICLANG-DETERMINECOMPILER.CMAKE
C:\PROGRAM FILES\CMAKE\SHARE\CMAKE-3.31\MODULES\COMPILER\TASKING-DETERMINECOMPILER.CMAKE
C:\PROGRAM FILES\CMAKE\SHARE\CMAKE-3.31\MODULES\COMPILER\TINYCC-C-DETERMINECOMPILER.CMAKE
C:\PROGRAM FILES\CMAKE\SHARE\CMAKE-3.31\MODULES\COMPILER\VISUALAGE-C-DETERMINECOMPILER.CMAKE
C:\PROGRAM FILES\CMAKE\SHARE\CMAKE-3.31\MODULES\COMPILER\VISUALAGE-CXX-DETERMINECOMPILER.CMAKE
C:\PROGRAM FILES\CMAKE\SHARE\CMAKE-3.31\MODULES\COMPILER\WATCOM-DETERMINECOMPILER.CMAKE
C:\PROGRAM FILES\CMAKE\SHARE\CMAKE-3.31\MODULES\COMPILER\XL-C-DETERMINECOMPILER.CMAKE
C:\PROGRAM FILES\CMAKE\SHARE\CMAKE-3.31\MODULES\COMPILER\XL-CXX-DETERMINECOMPILER.CMAKE
C:\PROGRAM FILES\CMAKE\SHARE\CMAKE-3.31\MODULES\COMPILER\XLCLANG-C-DETERMINECOMPILER.CMAKE
C:\PROGRAM FILES\CMAKE\SHARE\CMAKE-3.31\MODULES\COMPILER\XLCLANG-CXX-DETERMINECOMPILER.CMAKE
C:\PROGRAM FILES\CMAKE\SHARE\CMAKE-3.31\MODULES\COMPILER\ZOS-C-DETERMINECOMPILER.CMAKE
C:\PROGRAM FILES\CMAKE\SHARE\CMAKE-3.31\MODULES\COMPILER\ZOS-CXX-DETERMINECOMPILER.CMAKE
C:\PROGRAM FILES\CMAKE\SHARE\CMAKE-3.31\MODULES\COMPILERID\VS-10.VCXPROJ.IN
C:\PROGRAM FILES\CMAKE\SHARE\CMAKE-3.31\MODULES\EXTERNALPROJECT\SHARED_INTERNAL_COMMANDS.CMAKE
C:\PROGRAM FILES\CMAKE\SHARE\CMAKE-3.31\MODULES\FETCHCONTENT.CMAKE
C:\PROGRAM FILES\CMAKE\SHARE\CMAKE-3.31\MODULES\FINDBOOST.CMAKE
@ -104,13 +27,10 @@ C:\PROGRAM FILES\CMAKE\SHARE\CMAKE-3.31\MODULES\FINDTHREADS.CMAKE
C:\PROGRAM FILES\CMAKE\SHARE\CMAKE-3.31\MODULES\INTERNAL\CMAKECLINKERINFORMATION.CMAKE
C:\PROGRAM FILES\CMAKE\SHARE\CMAKE-3.31\MODULES\INTERNAL\CMAKECXXLINKERINFORMATION.CMAKE
C:\PROGRAM FILES\CMAKE\SHARE\CMAKE-3.31\MODULES\INTERNAL\CMAKECOMMONLINKERINFORMATION.CMAKE
C:\PROGRAM FILES\CMAKE\SHARE\CMAKE-3.31\MODULES\INTERNAL\CMAKEDETERMINELINKERID.CMAKE
C:\PROGRAM FILES\CMAKE\SHARE\CMAKE-3.31\MODULES\INTERNAL\CHECKSOURCECOMPILES.CMAKE
C:\PROGRAM FILES\CMAKE\SHARE\CMAKE-3.31\MODULES\INTERNAL\FEATURETESTING.CMAKE
C:\PROGRAM FILES\CMAKE\SHARE\CMAKE-3.31\MODULES\PLATFORM\LINKER\WINDOWS-MSVC-C.CMAKE
C:\PROGRAM FILES\CMAKE\SHARE\CMAKE-3.31\MODULES\PLATFORM\LINKER\WINDOWS-MSVC-CXX.CMAKE
C:\PROGRAM FILES\CMAKE\SHARE\CMAKE-3.31\MODULES\PLATFORM\LINKER\WINDOWS-MSVC.CMAKE
C:\PROGRAM FILES\CMAKE\SHARE\CMAKE-3.31\MODULES\PLATFORM\WINDOWS-DETERMINE-CXX.CMAKE
C:\PROGRAM FILES\CMAKE\SHARE\CMAKE-3.31\MODULES\PLATFORM\WINDOWS-INITIALIZE.CMAKE
C:\PROGRAM FILES\CMAKE\SHARE\CMAKE-3.31\MODULES\PLATFORM\WINDOWS-MSVC-C.CMAKE
C:\PROGRAM FILES\CMAKE\SHARE\CMAKE-3.31\MODULES\PLATFORM\WINDOWS-MSVC-CXX.CMAKE

File diff suppressed because one or more lines are too long

View File

@ -142,6 +142,7 @@
},
"collision_detection": {
"update_interval_ms": 200,
"diverging_release_distance": 50.0,
"prediction": {
"time_window": 20.0,
"vehicle_size": 20.0,
@ -166,4 +167,4 @@
"max_connections": 100
},
"simulated_mobile_light_target_intersection_id": "T2路口"
}
}

View File

@ -1,99 +1,22 @@
^D:\APP\C++\COLLISIONAVOIDANCE\BUILD_VERIFY_VS2\CMAKEFILES\1B12B23DFAEA2A9D07EBD311CEF630D3\GENERATE.STAMP.RULE
C:\PROGRAM FILES\CMAKE\SHARE\CMAKE-3.31\MODULES\CMAKECCOMPILER.CMAKE.IN
C:\PROGRAM FILES\CMAKE\SHARE\CMAKE-3.31\MODULES\CMAKECCOMPILERABI.C
C:\PROGRAM FILES\CMAKE\SHARE\CMAKE-3.31\MODULES\CMAKECINFORMATION.CMAKE
C:\PROGRAM FILES\CMAKE\SHARE\CMAKE-3.31\MODULES\CMAKECXXCOMPILER.CMAKE.IN
C:\PROGRAM FILES\CMAKE\SHARE\CMAKE-3.31\MODULES\CMAKECXXCOMPILERABI.CPP
C:\PROGRAM FILES\CMAKE\SHARE\CMAKE-3.31\MODULES\CMAKECXXINFORMATION.CMAKE
C:\PROGRAM FILES\CMAKE\SHARE\CMAKE-3.31\MODULES\CMAKECOMMONLANGUAGEINCLUDE.CMAKE
C:\PROGRAM FILES\CMAKE\SHARE\CMAKE-3.31\MODULES\CMAKECOMPILERIDDETECTION.CMAKE
C:\PROGRAM FILES\CMAKE\SHARE\CMAKE-3.31\MODULES\CMAKEDETERMINECCOMPILER.CMAKE
C:\PROGRAM FILES\CMAKE\SHARE\CMAKE-3.31\MODULES\CMAKEDETERMINECXXCOMPILER.CMAKE
C:\PROGRAM FILES\CMAKE\SHARE\CMAKE-3.31\MODULES\CMAKEDETERMINECOMPILER.CMAKE
C:\PROGRAM FILES\CMAKE\SHARE\CMAKE-3.31\MODULES\CMAKEDETERMINECOMPILERABI.CMAKE
C:\PROGRAM FILES\CMAKE\SHARE\CMAKE-3.31\MODULES\CMAKEDETERMINECOMPILERID.CMAKE
C:\PROGRAM FILES\CMAKE\SHARE\CMAKE-3.31\MODULES\CMAKEDETERMINECOMPILERSUPPORT.CMAKE
C:\PROGRAM FILES\CMAKE\SHARE\CMAKE-3.31\MODULES\CMAKEDETERMINERCCOMPILER.CMAKE
C:\PROGRAM FILES\CMAKE\SHARE\CMAKE-3.31\MODULES\CMAKEDETERMINESYSTEM.CMAKE
C:\PROGRAM FILES\CMAKE\SHARE\CMAKE-3.31\MODULES\CMAKEFINDBINUTILS.CMAKE
C:\PROGRAM FILES\CMAKE\SHARE\CMAKE-3.31\MODULES\CMAKEFINDDEPENDENCYMACRO.CMAKE
C:\PROGRAM FILES\CMAKE\SHARE\CMAKE-3.31\MODULES\CMAKEGENERICSYSTEM.CMAKE
C:\PROGRAM FILES\CMAKE\SHARE\CMAKE-3.31\MODULES\CMAKEINITIALIZECONFIGS.CMAKE
C:\PROGRAM FILES\CMAKE\SHARE\CMAKE-3.31\MODULES\CMAKELANGUAGEINFORMATION.CMAKE
C:\PROGRAM FILES\CMAKE\SHARE\CMAKE-3.31\MODULES\CMAKEPACKAGECONFIGHELPERS.CMAKE
C:\PROGRAM FILES\CMAKE\SHARE\CMAKE-3.31\MODULES\CMAKEPARSEIMPLICITINCLUDEINFO.CMAKE
C:\PROGRAM FILES\CMAKE\SHARE\CMAKE-3.31\MODULES\CMAKEPARSEIMPLICITLINKINFO.CMAKE
C:\PROGRAM FILES\CMAKE\SHARE\CMAKE-3.31\MODULES\CMAKEPARSELIBRARYARCHITECTURE.CMAKE
C:\PROGRAM FILES\CMAKE\SHARE\CMAKE-3.31\MODULES\CMAKERCCOMPILER.CMAKE.IN
C:\PROGRAM FILES\CMAKE\SHARE\CMAKE-3.31\MODULES\CMAKERCINFORMATION.CMAKE
C:\PROGRAM FILES\CMAKE\SHARE\CMAKE-3.31\MODULES\CMAKESYSTEM.CMAKE.IN
C:\PROGRAM FILES\CMAKE\SHARE\CMAKE-3.31\MODULES\CMAKESYSTEMSPECIFICINFORMATION.CMAKE
C:\PROGRAM FILES\CMAKE\SHARE\CMAKE-3.31\MODULES\CMAKESYSTEMSPECIFICINITIALIZE.CMAKE
C:\PROGRAM FILES\CMAKE\SHARE\CMAKE-3.31\MODULES\CMAKETESTCCOMPILER.CMAKE
C:\PROGRAM FILES\CMAKE\SHARE\CMAKE-3.31\MODULES\CMAKETESTCXXCOMPILER.CMAKE
C:\PROGRAM FILES\CMAKE\SHARE\CMAKE-3.31\MODULES\CMAKETESTCOMPILERCOMMON.CMAKE
C:\PROGRAM FILES\CMAKE\SHARE\CMAKE-3.31\MODULES\CMAKETESTRCCOMPILER.CMAKE
C:\PROGRAM FILES\CMAKE\SHARE\CMAKE-3.31\MODULES\CHECKCSOURCECOMPILES.CMAKE
C:\PROGRAM FILES\CMAKE\SHARE\CMAKE-3.31\MODULES\CHECKINCLUDEFILE.CMAKE
C:\PROGRAM FILES\CMAKE\SHARE\CMAKE-3.31\MODULES\CHECKLIBRARYEXISTS.CMAKE
C:\PROGRAM FILES\CMAKE\SHARE\CMAKE-3.31\MODULES\COMPILER\ADSP-DETERMINECOMPILER.CMAKE
C:\PROGRAM FILES\CMAKE\SHARE\CMAKE-3.31\MODULES\COMPILER\ARMCC-DETERMINECOMPILER.CMAKE
C:\PROGRAM FILES\CMAKE\SHARE\CMAKE-3.31\MODULES\COMPILER\ARMCLANG-DETERMINECOMPILER.CMAKE
C:\PROGRAM FILES\CMAKE\SHARE\CMAKE-3.31\MODULES\COMPILER\APPLECLANG-DETERMINECOMPILER.CMAKE
C:\PROGRAM FILES\CMAKE\SHARE\CMAKE-3.31\MODULES\COMPILER\BORLAND-DETERMINECOMPILER.CMAKE
C:\PROGRAM FILES\CMAKE\SHARE\CMAKE-3.31\MODULES\COMPILER\BRUCE-C-DETERMINECOMPILER.CMAKE
C:\PROGRAM FILES\CMAKE\SHARE\CMAKE-3.31\MODULES\COMPILER\CMAKECOMMONCOMPILERMACROS.CMAKE
C:\PROGRAM FILES\CMAKE\SHARE\CMAKE-3.31\MODULES\COMPILER\CLANG-DETERMINECOMPILER.CMAKE
C:\PROGRAM FILES\CMAKE\SHARE\CMAKE-3.31\MODULES\COMPILER\CLANG-DETERMINECOMPILERINTERNAL.CMAKE
C:\PROGRAM FILES\CMAKE\SHARE\CMAKE-3.31\MODULES\COMPILER\COMPAQ-C-DETERMINECOMPILER.CMAKE
C:\PROGRAM FILES\CMAKE\SHARE\CMAKE-3.31\MODULES\COMPILER\COMPAQ-CXX-DETERMINECOMPILER.CMAKE
C:\PROGRAM FILES\CMAKE\SHARE\CMAKE-3.31\MODULES\COMPILER\CRAY-DETERMINECOMPILER.CMAKE
C:\PROGRAM FILES\CMAKE\SHARE\CMAKE-3.31\MODULES\COMPILER\CRAYCLANG-DETERMINECOMPILER.CMAKE
C:\PROGRAM FILES\CMAKE\SHARE\CMAKE-3.31\MODULES\COMPILER\EMBARCADERO-DETERMINECOMPILER.CMAKE
C:\PROGRAM FILES\CMAKE\SHARE\CMAKE-3.31\MODULES\COMPILER\FUJITSU-DETERMINECOMPILER.CMAKE
C:\PROGRAM FILES\CMAKE\SHARE\CMAKE-3.31\MODULES\COMPILER\FUJITSUCLANG-DETERMINECOMPILER.CMAKE
C:\PROGRAM FILES\CMAKE\SHARE\CMAKE-3.31\MODULES\COMPILER\GHS-DETERMINECOMPILER.CMAKE
C:\PROGRAM FILES\CMAKE\SHARE\CMAKE-3.31\MODULES\COMPILER\GNU-C-DETERMINECOMPILER.CMAKE
C:\PROGRAM FILES\CMAKE\SHARE\CMAKE-3.31\MODULES\COMPILER\GNU-CXX-DETERMINECOMPILER.CMAKE
C:\PROGRAM FILES\CMAKE\SHARE\CMAKE-3.31\MODULES\COMPILER\HP-C-DETERMINECOMPILER.CMAKE
C:\PROGRAM FILES\CMAKE\SHARE\CMAKE-3.31\MODULES\COMPILER\HP-CXX-DETERMINECOMPILER.CMAKE
C:\PROGRAM FILES\CMAKE\SHARE\CMAKE-3.31\MODULES\COMPILER\IAR-DETERMINECOMPILER.CMAKE
C:\PROGRAM FILES\CMAKE\SHARE\CMAKE-3.31\MODULES\COMPILER\IBMCPP-C-DETERMINEVERSIONINTERNAL.CMAKE
C:\PROGRAM FILES\CMAKE\SHARE\CMAKE-3.31\MODULES\COMPILER\IBMCPP-CXX-DETERMINEVERSIONINTERNAL.CMAKE
C:\PROGRAM FILES\CMAKE\SHARE\CMAKE-3.31\MODULES\COMPILER\IBMCLANG-C-DETERMINECOMPILER.CMAKE
C:\PROGRAM FILES\CMAKE\SHARE\CMAKE-3.31\MODULES\COMPILER\IBMCLANG-CXX-DETERMINECOMPILER.CMAKE
C:\PROGRAM FILES\CMAKE\SHARE\CMAKE-3.31\MODULES\COMPILER\INTEL-DETERMINECOMPILER.CMAKE
C:\PROGRAM FILES\CMAKE\SHARE\CMAKE-3.31\MODULES\COMPILER\INTELLLVM-DETERMINECOMPILER.CMAKE
C:\PROGRAM FILES\CMAKE\SHARE\CMAKE-3.31\MODULES\COMPILER\LCC-C-DETERMINECOMPILER.CMAKE
C:\PROGRAM FILES\CMAKE\SHARE\CMAKE-3.31\MODULES\COMPILER\LCC-CXX-DETERMINECOMPILER.CMAKE
C:\PROGRAM FILES\CMAKE\SHARE\CMAKE-3.31\MODULES\COMPILER\MSVC-C.CMAKE
C:\PROGRAM FILES\CMAKE\SHARE\CMAKE-3.31\MODULES\COMPILER\MSVC-CXX.CMAKE
C:\PROGRAM FILES\CMAKE\SHARE\CMAKE-3.31\MODULES\COMPILER\MSVC-DETERMINECOMPILER.CMAKE
C:\PROGRAM FILES\CMAKE\SHARE\CMAKE-3.31\MODULES\COMPILER\MSVC.CMAKE
C:\PROGRAM FILES\CMAKE\SHARE\CMAKE-3.31\MODULES\COMPILER\NVHPC-DETERMINECOMPILER.CMAKE
C:\PROGRAM FILES\CMAKE\SHARE\CMAKE-3.31\MODULES\COMPILER\NVIDIA-DETERMINECOMPILER.CMAKE
C:\PROGRAM FILES\CMAKE\SHARE\CMAKE-3.31\MODULES\COMPILER\OPENWATCOM-DETERMINECOMPILER.CMAKE
C:\PROGRAM FILES\CMAKE\SHARE\CMAKE-3.31\MODULES\COMPILER\ORANGEC-DETERMINECOMPILER.CMAKE
C:\PROGRAM FILES\CMAKE\SHARE\CMAKE-3.31\MODULES\COMPILER\PGI-DETERMINECOMPILER.CMAKE
C:\PROGRAM FILES\CMAKE\SHARE\CMAKE-3.31\MODULES\COMPILER\PATHSCALE-DETERMINECOMPILER.CMAKE
C:\PROGRAM FILES\CMAKE\SHARE\CMAKE-3.31\MODULES\COMPILER\SCO-DETERMINECOMPILER.CMAKE
C:\PROGRAM FILES\CMAKE\SHARE\CMAKE-3.31\MODULES\COMPILER\SDCC-C-DETERMINECOMPILER.CMAKE
C:\PROGRAM FILES\CMAKE\SHARE\CMAKE-3.31\MODULES\COMPILER\SUNPRO-C-DETERMINECOMPILER.CMAKE
C:\PROGRAM FILES\CMAKE\SHARE\CMAKE-3.31\MODULES\COMPILER\SUNPRO-CXX-DETERMINECOMPILER.CMAKE
C:\PROGRAM FILES\CMAKE\SHARE\CMAKE-3.31\MODULES\COMPILER\TI-DETERMINECOMPILER.CMAKE
C:\PROGRAM FILES\CMAKE\SHARE\CMAKE-3.31\MODULES\COMPILER\TICLANG-DETERMINECOMPILER.CMAKE
C:\PROGRAM FILES\CMAKE\SHARE\CMAKE-3.31\MODULES\COMPILER\TASKING-DETERMINECOMPILER.CMAKE
C:\PROGRAM FILES\CMAKE\SHARE\CMAKE-3.31\MODULES\COMPILER\TINYCC-C-DETERMINECOMPILER.CMAKE
C:\PROGRAM FILES\CMAKE\SHARE\CMAKE-3.31\MODULES\COMPILER\VISUALAGE-C-DETERMINECOMPILER.CMAKE
C:\PROGRAM FILES\CMAKE\SHARE\CMAKE-3.31\MODULES\COMPILER\VISUALAGE-CXX-DETERMINECOMPILER.CMAKE
C:\PROGRAM FILES\CMAKE\SHARE\CMAKE-3.31\MODULES\COMPILER\WATCOM-DETERMINECOMPILER.CMAKE
C:\PROGRAM FILES\CMAKE\SHARE\CMAKE-3.31\MODULES\COMPILER\XL-C-DETERMINECOMPILER.CMAKE
C:\PROGRAM FILES\CMAKE\SHARE\CMAKE-3.31\MODULES\COMPILER\XL-CXX-DETERMINECOMPILER.CMAKE
C:\PROGRAM FILES\CMAKE\SHARE\CMAKE-3.31\MODULES\COMPILER\XLCLANG-C-DETERMINECOMPILER.CMAKE
C:\PROGRAM FILES\CMAKE\SHARE\CMAKE-3.31\MODULES\COMPILER\XLCLANG-CXX-DETERMINECOMPILER.CMAKE
C:\PROGRAM FILES\CMAKE\SHARE\CMAKE-3.31\MODULES\COMPILER\ZOS-C-DETERMINECOMPILER.CMAKE
C:\PROGRAM FILES\CMAKE\SHARE\CMAKE-3.31\MODULES\COMPILER\ZOS-CXX-DETERMINECOMPILER.CMAKE
C:\PROGRAM FILES\CMAKE\SHARE\CMAKE-3.31\MODULES\COMPILERID\VS-10.VCXPROJ.IN
C:\PROGRAM FILES\CMAKE\SHARE\CMAKE-3.31\MODULES\EXTERNALPROJECT.CMAKE
C:\PROGRAM FILES\CMAKE\SHARE\CMAKE-3.31\MODULES\EXTERNALPROJECT\SHARED_INTERNAL_COMMANDS.CMAKE
C:\PROGRAM FILES\CMAKE\SHARE\CMAKE-3.31\MODULES\FETCHCONTENT.CMAKE
@ -107,13 +30,10 @@ C:\PROGRAM FILES\CMAKE\SHARE\CMAKE-3.31\MODULES\GNUINSTALLDIRS.CMAKE
C:\PROGRAM FILES\CMAKE\SHARE\CMAKE-3.31\MODULES\INTERNAL\CMAKECLINKERINFORMATION.CMAKE
C:\PROGRAM FILES\CMAKE\SHARE\CMAKE-3.31\MODULES\INTERNAL\CMAKECXXLINKERINFORMATION.CMAKE
C:\PROGRAM FILES\CMAKE\SHARE\CMAKE-3.31\MODULES\INTERNAL\CMAKECOMMONLINKERINFORMATION.CMAKE
C:\PROGRAM FILES\CMAKE\SHARE\CMAKE-3.31\MODULES\INTERNAL\CMAKEDETERMINELINKERID.CMAKE
C:\PROGRAM FILES\CMAKE\SHARE\CMAKE-3.31\MODULES\INTERNAL\CHECKSOURCECOMPILES.CMAKE
C:\PROGRAM FILES\CMAKE\SHARE\CMAKE-3.31\MODULES\INTERNAL\FEATURETESTING.CMAKE
C:\PROGRAM FILES\CMAKE\SHARE\CMAKE-3.31\MODULES\PLATFORM\LINKER\WINDOWS-MSVC-C.CMAKE
C:\PROGRAM FILES\CMAKE\SHARE\CMAKE-3.31\MODULES\PLATFORM\LINKER\WINDOWS-MSVC-CXX.CMAKE
C:\PROGRAM FILES\CMAKE\SHARE\CMAKE-3.31\MODULES\PLATFORM\LINKER\WINDOWS-MSVC.CMAKE
C:\PROGRAM FILES\CMAKE\SHARE\CMAKE-3.31\MODULES\PLATFORM\WINDOWS-DETERMINE-CXX.CMAKE
C:\PROGRAM FILES\CMAKE\SHARE\CMAKE-3.31\MODULES\PLATFORM\WINDOWS-INITIALIZE.CMAKE
C:\PROGRAM FILES\CMAKE\SHARE\CMAKE-3.31\MODULES\PLATFORM\WINDOWS-MSVC-C.CMAKE
C:\PROGRAM FILES\CMAKE\SHARE\CMAKE-3.31\MODULES\PLATFORM\WINDOWS-MSVC-CXX.CMAKE

View File

@ -142,6 +142,7 @@
},
"collision_detection": {
"update_interval_ms": 200,
"diverging_release_distance": 50.0,
"prediction": {
"time_window": 20.0,
"vehicle_size": 20.0,
@ -166,4 +167,4 @@
"max_connections": 100
},
"simulated_mobile_light_target_intersection_id": "T2路口"
}
}

View File

@ -273,6 +273,7 @@
```json
"collision_detection": {
"update_interval_ms": 200,
"diverging_release_distance": 50.0,
"prediction": {
"time_window": 20.0,
"vehicle_size": 20.0,
@ -283,12 +284,17 @@
```
### 参数说明
- **update_interval_ms**:冲突检测更新间隔时间(ms)
- **diverging_release_distance**:冲突解除距离阈值(m)。当航空器与车辆不再预测碰撞、且双方距离正在增大并且当前距离大于等于该值时,立即解除冲突。
- **prediction**:冲突预测模型参数
- **time_window**:预测时间窗口(s)
- **vehicle_size**:车辆尺寸(m)
- **aircraft_size**:航空器尺寸(m)
- **min_unmanned_speed**:无人车最小速度(m/s)
运行中动态修改HTTP
- `POST /config/collision/diverging_release_distance`
- Body`{"value": 50}`
### 冲突预警和告警参数
文件路径:`config/airport_bounds.json`

View File

@ -69,6 +69,7 @@ public:
} prediction;
int update_interval_ms;
double diverging_release_distance = 50.0;
} collision_detection;
struct Logging {
@ -202,12 +203,14 @@ inline void from_json(const json& j, SystemConfig::CollisionDetection::Predictio
inline void to_json(json& j, const SystemConfig::CollisionDetection& p) {
j = json{
{"update_interval_ms", p.update_interval_ms},
{"diverging_release_distance", p.diverging_release_distance},
{"prediction", p.prediction}
};
}
inline void from_json(const json& j, SystemConfig::CollisionDetection& p) {
j.at("update_interval_ms").get_to(p.update_interval_ms);
p.diverging_release_distance = j.value("diverging_release_distance", 50.0);
j.at("prediction").get_to(p.prediction);
}

View File

@ -57,6 +57,7 @@ bool System::initialize() {
// 前端交互接口HTTP
// - POST http://<host>:<port>/config/runway/warning_zone_radius/aircraft {"value": 300}
// - POST http://<host>:<port>/config/runway/alert_zone_radius/aircraft {"value": 200}
// - POST http://<host>:<port>/config/collision/diverging_release_distance {"value": 50}
// - POST http://<host>:<port>/api/VehicleRegistry [...]
config_http_server_ = std::make_unique<network::ConfigHttpServer>(
system_config.frontend_http_server.port,
@ -231,6 +232,17 @@ bool System::setRunwayAlertZoneAircraftRadius(double radius, double* oldValue) {
return airportBounds_->setAlertZoneAircraftRadius(AreaType::RUNWAY, radius);
}
bool System::setDivergingReleaseDistance(double value, double* oldValue) {
if (!collisionDetector_) {
return false;
}
const bool updated = collisionDetector_->setDivergingReleaseDistance(value, oldValue);
if (updated) {
SystemConfig::instance().collision_detection.diverging_release_distance = value;
}
return updated;
}
void System::processLoop() {
while (running_) {
try {
@ -558,9 +570,8 @@ void System::processCollisions(
std::chrono::system_clock::now().time_since_epoch())
.count();
broadcastVehicleCommand(parkingCmd);
controllableVehicles_.sendCommand(vehicleId, parkingCmd);
Logger::info("ALERT 后补发停车指令到车辆: ", vehicleId);
Logger::info("ALERT 后补发停车指令到车辆(仅车辆链路,不广播前端): ", vehicleId);
}
// 更新风险记录
@ -712,7 +723,10 @@ void System::broadcastCollisionWarning(const CollisionRisk& risk) {
.count()} };
// 广播冲突预警消息
ws_server_->broadcast(j.dump());
const std::string payload = j.dump();
ws_server_->broadcast(payload);
// 前端链路可靠性兜底:关键告警消息重复广播一次(仅前端,不影响车辆控制链路)
ws_server_->broadcast(payload);
Logger::debug("广播冲突预警: id1=", risk.id1, " id2=", risk.id2,
" distance=", risk.distance, "m",
" relativeSpeed=", risk.relativeSpeed, "m/s",
@ -790,7 +804,12 @@ void System::broadcastVehicleCommand(const VehicleCommand& cmd) {
j["targetLongitude"] = cmd.longitude;
}
ws_server_->broadcast(j.dump());
const std::string payload = j.dump();
ws_server_->broadcast(payload);
// 前端链路可靠性兜底ALERT/WARNING 重复广播一次(仅前端,不影响车辆控制链路)
if (cmd.type == CommandType::ALERT || cmd.type == CommandType::WARNING) {
ws_server_->broadcast(payload);
}
}
const MovingObject* System::findVehicle(const std::string& vehicleId) const {
@ -918,9 +937,8 @@ bool System::handleSafetyZoneRisk(const Vehicle& vehicle,
std::chrono::system_clock::now().time_since_epoch())
.count();
broadcastVehicleCommand(parkingCmd);
controllableVehicles_.sendCommand(vehicle.id, parkingCmd);
Logger::info("安全区 ALERT 后补发停车指令到车辆: ", vehicle.id);
Logger::info("安全区 ALERT 后补发停车指令到车辆(仅车辆链路,不广播前端): ", vehicle.id);
}
CollisionRisk risk;

View File

@ -46,6 +46,7 @@ public:
// 运行中动态修改配置:对应 airport_bounds.json 里 runway.warning_zone_radius.aircraft默认 200
bool setRunwayWarningZoneAircraftRadius(double radius, double* oldValue = nullptr);
bool setRunwayAlertZoneAircraftRadius(double radius, double* oldValue = nullptr);
bool setDivergingReleaseDistance(double value, double* oldValue = nullptr);
const SystemConfig& getSystemConfig() const { return SystemConfig::instance(); }
const IntersectionConfig& getIntersectionConfig() const { return intersection_config_; }

View File

@ -18,11 +18,23 @@ constexpr int64_t kResolveNoRiskTimeoutMs = 5000;
CollisionDetector::CollisionDetector(const AirportBounds& bounds, const ControllableVehicles& controllableVehicles)
: airportBounds_(bounds),
vehicleTree_(bounds.getAirportBounds(), 8), // 使用机场总边界初始化四叉树
controllableVehicles_(&controllableVehicles) {
controllableVehicles_(&controllableVehicles),
divergingReleaseDistance_(SystemConfig::instance().collision_detection.diverging_release_distance) {
// 记录初始化信息
const auto& airportBounds = bounds.getAirportBounds();
}
bool CollisionDetector::setDivergingReleaseDistance(double value, double* oldValue) {
if (!(value > 0.0) || !std::isfinite(value)) {
return false;
}
if (oldValue) {
*oldValue = divergingReleaseDistance_.load();
}
divergingReleaseDistance_.store(value);
return true;
}
void CollisionDetector::updateTraffic(const std::vector<Aircraft>& aircraft,
const std::vector<Vehicle>& vehicles) {
Logger::debug("更新交通数据: 航空器数量=", aircraft.size(),
@ -189,9 +201,20 @@ std::vector<CollisionRisk> CollisionDetector::detectCollisions() {
", level=", static_cast<int>(level));
} else if (hasUnresolvedConflict) {
// 专业化释放策略:
// 0. 新增:远离且达到解除距离 -> 立即释放
// A. 距离已明显拉开且当前不再预测碰撞 -> 立即释放
// B. 连续无风险超过阈值 -> 强制释放,防止历史 maxLevel 粘连
// C. 其余场景沿用原有几何释放条件
const double divergingReleaseDistance = divergingReleaseDistance_.load();
const double rx = vehicle.position.x - aircraft.position.x;
const double ry = vehicle.position.y - aircraft.position.y;
const double relVx = vv.vx - av.vx;
const double relVy = vv.vy - av.vy;
const bool isDiverging = (rx * relVx + ry * relVy) > 0.0;
const bool divergingRelease =
!collisionResult.willCollide &&
isDiverging &&
collisionResult.distance >= divergingReleaseDistance;
const bool farEnoughAndNoRisk =
!collisionResult.willCollide &&
collisionResult.distance >= safeDistance * kResolveDistanceMultiplier;
@ -201,13 +224,14 @@ std::vector<CollisionRisk> CollisionDetector::detectCollisions() {
const bool geometricResolved =
checkCollisionResolved(aircraft, vehicle, it->second, safeDistance);
if (farEnoughAndNoRisk || noRiskTimeout || geometricResolved) {
if (divergingRelease || farEnoughAndNoRisk || noRiskTimeout || geometricResolved) {
it->second.resolved = true;
Logger::debug("冲突已解除: obj1=", aircraft.id,
", obj2=", vehicle.id,
", reason=",
farEnoughAndNoRisk ? "far_enough_no_risk" :
(noRiskTimeout ? "no_risk_timeout" : "geometric_condition"));
divergingRelease ? "diverging_release_distance" :
(farEnoughAndNoRisk ? "far_enough_no_risk" :
(noRiskTimeout ? "no_risk_timeout" : "geometric_condition")));
} else {
// 虽然当前没有检测到风险,但由于未满足解除条件,继续保持原有风险等级
currentCollisions.insert(collisionKey);

View File

@ -9,6 +9,7 @@
#include "CollisionTypes.h"
#include "utils/Logger.h"
#include <vector>
#include <atomic>
#include <unordered_map>
// 碰撞风险等级
@ -69,12 +70,15 @@ public:
const MovingObject& obj1,
const MovingObject& obj2,
double timeWindow = 30.0) const;
bool setDivergingReleaseDistance(double value, double* oldValue = nullptr);
private:
const AirportBounds& airportBounds_;
QuadTree<Vehicle> vehicleTree_;
std::vector<Aircraft> aircraftData_;
const ControllableVehicles* controllableVehicles_;
std::atomic<double> divergingReleaseDistance_{50.0};
// 冲突记录映射表:<(id1,id2), CollisionRecord>
std::unordered_map<std::pair<std::string, std::string>, CollisionRecord, CollisionPairHash> collisionRecords_;
@ -150,4 +154,4 @@ private:
double timeWindow) const;
};
#endif // AIRPORT_DETECTOR_COLLISION_DETECTOR_H
#endif // AIRPORT_DETECTOR_COLLISION_DETECTOR_H

View File

@ -177,7 +177,8 @@ private:
// Body: {"value": 300}
const bool isWarningZoneApi = req_.target() == "/config/runway/warning_zone_radius/aircraft";
const bool isAlertZoneApi = req_.target() == "/config/runway/alert_zone_radius/aircraft";
if (!isWarningZoneApi && !isAlertZoneApi) {
const bool isDivergingReleaseApi = req_.target() == "/config/collision/diverging_release_distance";
if (!isWarningZoneApi && !isAlertZoneApi && !isDivergingReleaseApi) {
return send_response(json_response(req_, http::status::not_found,
json{{"status", "error"}, {"message", "Not Found"}}));
}
@ -193,12 +194,17 @@ private:
double oldValue = 0.0;
bool updated = false;
const char* field = nullptr;
const char* area = "runway";
if (isWarningZoneApi) {
updated = system_.setRunwayWarningZoneAircraftRadius(value, &oldValue);
field = "warning_zone_radius.aircraft";
} else {
} else if (isAlertZoneApi) {
updated = system_.setRunwayAlertZoneAircraftRadius(value, &oldValue);
field = "alert_zone_radius.aircraft";
} else {
updated = system_.setDivergingReleaseDistance(value, &oldValue);
field = "collision.diverging_release_distance";
area = "collision";
}
if (!updated) {
@ -210,7 +216,7 @@ private:
return send_response(json_response(req_, http::status::ok,
json{{"status", "success"},
{"area", "runway"},
{"area", area},
{"field", field},
{"old", oldValue},
{"new", value}}));

View File

@ -86,6 +86,7 @@
},
"collision_detection": {
"update_interval_ms": 200,
"diverging_release_distance": 50.0,
"prediction": {
"time_window": 20.0,
"vehicle_size": 20.0,

View File

@ -8,6 +8,14 @@
#include "config/SystemConfig.h"
#include "config/AirportBounds.h"
namespace {
void RegisterManagedVehicle(const std::string& vehicleId) {
ControllableVehicles::getInstance().updateRegistry({
VehicleRegistryEntry{vehicleId, "WUREN"}
});
}
}
// Mock ControllableVehicles 类
class MockControllableVehicles {
public:
@ -536,4 +544,115 @@ TEST_F(BasicCollisionTest, CrossingBeforeAndAfter) {
Logger::debug("无人车位置: (", vehicle.position.x, ",", vehicle.position.y, ")");
EXPECT_TRUE(risks.empty()) << "航空器已远离,无人车继续运动不应产生新的冲突";
}
}
TEST_F(BasicCollisionTest, DivergingReleaseDistanceResolvesConflictImmediately) {
RegisterManagedVehicle("UT_VEH_DIVERGE_1");
ASSERT_TRUE(detector_->setDivergingReleaseDistance(50.0));
Aircraft aircraft;
aircraft.id = "UT_AC_DIVERGE_1";
aircraft.flightNo = "UT_AC_DIVERGE_1";
aircraft.type = MovingObjectType::AIRCRAFT;
aircraft.altitude = 0.0;
aircraft.position = {100.0, 100.0};
aircraft.speed = 10.0;
aircraft.heading = 90.0;
Vehicle vehicle;
vehicle.id = "UT_VEH_DIVERGE_1";
vehicle.vehicleNo = "UT_VEH_DIVERGE_1";
vehicle.position = {180.0, 100.0};
vehicle.speed = 10.0;
vehicle.heading = 270.0;
detector_->updateTraffic({aircraft}, {vehicle});
auto risks = detector_->detectCollisions();
ASSERT_FALSE(risks.empty()) << "首帧应先建立冲突记录";
// 第二帧:距离在 50m 以上且正在远离,且不满足旧距离兜底(1.5 * warning = 225m)
aircraft.position = {200.0, 100.0};
aircraft.speed = 5.0;
aircraft.heading = 270.0;
vehicle.position = {120.0, 100.0};
vehicle.speed = 15.0;
vehicle.heading = 270.0;
detector_->updateTraffic({aircraft}, {vehicle});
risks = detector_->detectCollisions();
EXPECT_TRUE(risks.empty()) << "远离且达到解除距离时应立即解除冲突";
}
TEST_F(BasicCollisionTest, ApproachingAboveReleaseDistanceDoesNotRelease) {
RegisterManagedVehicle("UT_VEH_APPROACH_1");
ASSERT_TRUE(detector_->setDivergingReleaseDistance(50.0));
Aircraft aircraft;
aircraft.id = "UT_AC_APPROACH_1";
aircraft.flightNo = "UT_AC_APPROACH_1";
aircraft.type = MovingObjectType::AIRCRAFT;
aircraft.altitude = 0.0;
aircraft.position = {100.0, 100.0};
aircraft.speed = 10.0;
aircraft.heading = 90.0;
Vehicle vehicle;
vehicle.id = "UT_VEH_APPROACH_1";
vehicle.vehicleNo = "UT_VEH_APPROACH_1";
vehicle.position = {180.0, 100.0};
vehicle.speed = 10.0;
vehicle.heading = 270.0;
detector_->updateTraffic({aircraft}, {vehicle});
auto risks = detector_->detectCollisions();
ASSERT_FALSE(risks.empty()) << "首帧应先建立冲突记录";
// 第二帧:当前距离 149m(>50m) 但处于接近态,且 30s 内不会碰撞
aircraft.position = {200.0, 100.0};
aircraft.speed = 1.0;
aircraft.heading = 270.0;
vehicle.position = {51.0, 100.0};
vehicle.speed = 1.0;
vehicle.heading = 90.0;
detector_->updateTraffic({aircraft}, {vehicle});
risks = detector_->detectCollisions();
EXPECT_FALSE(risks.empty()) << "接近态不应被远离解除距离规则误解除";
}
TEST_F(BasicCollisionTest, LegacyReleaseFallbackStillWorksWhenNotDiverging) {
RegisterManagedVehicle("UT_VEH_FALLBACK_1");
ASSERT_TRUE(detector_->setDivergingReleaseDistance(50.0));
Aircraft aircraft;
aircraft.id = "UT_AC_FALLBACK_1";
aircraft.flightNo = "UT_AC_FALLBACK_1";
aircraft.type = MovingObjectType::AIRCRAFT;
aircraft.altitude = 0.0;
aircraft.position = {100.0, 100.0};
aircraft.speed = 10.0;
aircraft.heading = 90.0;
Vehicle vehicle;
vehicle.id = "UT_VEH_FALLBACK_1";
vehicle.vehicleNo = "UT_VEH_FALLBACK_1";
vehicle.position = {180.0, 100.0};
vehicle.speed = 10.0;
vehicle.heading = 270.0;
detector_->updateTraffic({aircraft}, {vehicle});
auto risks = detector_->detectCollisions();
ASSERT_FALSE(risks.empty()) << "首帧应先建立冲突记录";
// 第二帧:不处于远离态,但满足旧逻辑的 farEnoughAndNoRisk(>=225m)
aircraft.position = {300.0, 100.0};
aircraft.speed = 1.0;
aircraft.heading = 270.0;
vehicle.position = {70.0, 100.0};
vehicle.speed = 1.0;
vehicle.heading = 90.0;
detector_->updateTraffic({aircraft}, {vehicle});
risks = detector_->detectCollisions();
EXPECT_TRUE(risks.empty()) << "旧逻辑兜底应继续生效并解除冲突";
}