From dd066057b09374bbd439947aaed0e0be5fdbbfcc Mon Sep 17 00:00:00 2001 From: huangfu <3045324663@qq.com> Date: Tue, 27 Jan 2026 16:38:06 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E5=9C=BA=E6=99=AF4=E7=A4=BA?= =?UTF-8?q?=E4=BE=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/__pycache__/__init__.cpython-313.pyc | Bin 158 -> 150 bytes .../src/__pycache__/main.cpython-313.pyc | Bin 4165 -> 4157 bytes .../src/__pycache__/models.cpython-313.pyc | Bin 1055 -> 1047 bytes .../py_tree_generator.cpython-313.pyc | Bin 49061 -> 49080 bytes .../websocket_manager.cpython-313.pyc | Bin 3227 -> 3219 bytes .../src/prompts/classifier_prompt.txt | 2 +- .../src/prompts/simple_mode_prompt.txt | 2 +- backend_service/src/prompts/system_prompt.txt | 492 +++++++++++++++++- backend_service/src/py_tree_generator.py | 4 +- .../__pycache__/__init__.cpython-313.pyc | Bin 200 -> 192 bytes .../coordinate_tools.cpython-313.pyc | Bin 1823 -> 1815 bytes 11 files changed, 495 insertions(+), 5 deletions(-) diff --git a/backend_service/src/__pycache__/__init__.cpython-313.pyc b/backend_service/src/__pycache__/__init__.cpython-313.pyc index 3a3bc7d5995e87a9d29cf8be961105db851d456f..4e403fce0f67cf45cc6bb21689ceab8414ec1c1c 100644 GIT binary patch delta 31 lcmbQoIE|6}GcPX}0}v!j#ZTlm<}lUI$j?pHPn_r%0043a2iO1r delta 39 tcmbQnIFFJ0GcPX}0}vc_2%pGpEMTjjk)NBYpHZ5am!4LdojuVl007R{3&Q{a diff --git a/backend_service/src/__pycache__/main.cpython-313.pyc b/backend_service/src/__pycache__/main.cpython-313.pyc index 176b615d906026440bdef0c7c8a9f6de1cf0eba4..497637e30d7f8b9a672ad4a8396a200e9536de7b 100644 GIT binary patch delta 34 ocmX@AuvdZmGcPX}0}#kb$8Y3LVC68>&&bbB)lb}9&3cLp0GT!kMgRZ+ delta 42 wcmdn1a8!Z&GcPX}0}vc_2;az^z$##=pOK%Ns-IDsn3tYbnw`D5nDrDF01D6zbpQYW diff --git a/backend_service/src/__pycache__/models.cpython-313.pyc b/backend_service/src/__pycache__/models.cpython-313.pyc index 92238477ade8b379318b4d44860c987b473b3843..13fe7a6ff3fc2c33e09104206574ede1b7957786 100644 GIT binary patch delta 34 ocmbQwF`a|^GcPX}0}v!j#c$*;XXG%}&&bbB)lb|!iLsXn0FWC9@c;k- delta 42 wcmbQvF`t9`GcPX}0}vc_2;azE&M085pOK%Ns-IDsn3tYbnw`D5i?Npp0QlJq+yDRo diff --git a/backend_service/src/__pycache__/py_tree_generator.cpython-313.pyc b/backend_service/src/__pycache__/py_tree_generator.cpython-313.pyc index f74f7092247a893e4594590b2b9b74a5c274997d..34987b701476d9d668092f498dba75d6f5304c2f 100644 GIT binary patch delta 1476 zcmZ9Le@t6d6vsL3dyf_KqDp~-g7Z7p-Dge-tRs4 zymQWdom@4|teR|#Hd|VX_<;olb8*QoQcHBViMVw$DIy+0 zg={8Ugj1lKNGjRr0kT!Nb);T+WyG#49uQux*v%waBwOeWq=DVCS3R>$S4b&oTp#DQ zkS1N}QOI`k1o8UCd15Bb#7fd+re-&g7G3L6{pzL^=ac-|a-UY{G#hZ(fFp()3irk% z^tR}L{vg1{Dude3xVp=B zpO(_lG_&!Oy?oI%V21nbke(0o?6|&Ddw>}h*bTkF_J@#86AhxX#QxNESZ15tCt-zR zcM&q!?dBbzGDnLqe-3k`i5QxJ$U_vfp_Wc)Z zHI%gonWY?+i*5Ghl{kfTmaf@b&~8HPLp;aYeFN!hS#a%RcYW=e3#E(i+gq9m4%XGS z3l1^f_82_MziA^NYIOyC>D3sdB6KzwaDc`VfgE{@^V^$r$_kAfl0`5njhY} z0Y~W_7787OB)=89Z?Yw^oL0Au<+M&u;hiB z?F`p%Bkm#o5inF5?CA*82{g_l-b1{P_yRGC7-Np9Jn*ynsXar0h6!;A;lf(>qcRH^ zN`HSeWT?ox^*20>QH_Wi#7V@ofT6xdqwz5P3yo8VT&&rOO1?c7@eCv5h5nv+w3{za zW#tVW!##NgQ>Z>bj3Z>r4<~RDy|W0}+ZZa@o1DU1xO^9J0wD{M&zDdA5Is2;IRiNt zIl)U{6+7?X_Aq0~3K(IZB?DR~8l9~0^P9O+ZV**FU9=JhRLv|`>WU^YB7wk;sGMXC cs%*CZ$|<}2yDZ~6^nd?yTrQcJt5*~7FA@@mNdN!< delta 1547 zcmZ9LZA@EL7{@uc?QLl(OdJjwP{3`hrQ8bxHr_LZO}a$4dV~=)x?)SYLSJ&)GPhaD z!Uv7p;>JOzi$f-ZO^u1>m}N>w<_BZU)GTUZawCe<56(>GC5xgmJkP;svL^lYf6nti z&v~Bb-dS|fp8_?-GZxBiSBmXjjHL_j?x`9iV+v!t=w0L9g496 zabLC~sTRCVF@}w}7T4kWcD|1dxB;hQt8g@^2sbKn*wk*?kmhV+Ekz#L_J%=6PwD7@ zjthbw`D$g$yxF+TwO~!F zX+`XBSJJTVSMJfRSPMn_0}n*}0g{3o^YpmVQnmnc5ikw-2=FD~E5J<-r$l_9m*_1; zLCdsUJ&Kmt2kK=5|2b534av7w!%x)Qi>z#-rX8U<_Se>^3H?U<8@*_bPB%I;^ARt? z81M%JPDJwQ&BjG!r`MadBbmCIJvnob!^SD3P5Bj235wP8~Oub-4aW52Z=A*OI&=Kx)(zGw@SIMMWeRP7kvWyC;yD%);VFy5D~g zrPzZ17s;ODcH)Js2I8eRg3hcCNMPp0_~LOwQfx!-V@BkqL;WkLgAIlDnR4EQGuHqr z<_Y>z9uXV_iC|tgdBL7lu%Prkr`Ouqjkyn#@kAM9wK5G=~^t(6CojAoLrz^ zBz@?8R{cz-17)+8(<(wuEH-M9&=7rktQeW-=-BphD4Mjw-J*vpe97NXu^}|?2OQ#U zPBGh=E68F3kBRsB?d$z=8bs&Wp7D+7-wN5GvxO2Gr>7MZhSaOyV%n&nMmT z2(0PwxtyxApe6vX08Rlu2D}Cs1AGRU1zZJm(6)1JgAzys;4Od)de{rf$e|k(3C*vY zfYrA@;-lcI1C#@f0WNUpru{^V2gvWRaRQJH1zSOh*T=%|&@&!NgyUL>Wu4EuGvhGC z#Qe`AIykj%P&6wZ?P&;!zC;hAFA94v08Rpq0L1m;HgU(RuqS3B`WG`1!xCM-1W~B} zL1zxBg_i38^?(KrdU?u*hUuqMU2-2-`=~oLlP%<09(KCOCa}8c`b*V$li)Z5fX0Xz fs2kKBRJ(NCA^tYYu=f8q1~IiVk(uRAkD-46m(`uN diff --git a/backend_service/src/__pycache__/websocket_manager.cpython-313.pyc b/backend_service/src/__pycache__/websocket_manager.cpython-313.pyc index 939083a57a727a9878fd9e577655ebc18feaa732..0878380b7b291b67f9f7ff4194175231d8c5b542 100644 GIT binary patch delta 34 ocmbO&Ia!kXGcPX}0}#kb$8Y3b!N_5!pOK%Ns-L*|Fyjp_0Fu86hX4Qo delta 42 wcmbO%Ia`wZGcPX}0}vc_2;a!Pf>FRtKO;XkRX?LNF)ux>G&_6qZpIs200Yqtwg3PC diff --git a/backend_service/src/prompts/classifier_prompt.txt b/backend_service/src/prompts/classifier_prompt.txt index 1754b0b0..cc1cf448 100644 --- a/backend_service/src/prompts/classifier_prompt.txt +++ b/backend_service/src/prompts/classifier_prompt.txt @@ -18,7 +18,7 @@ {"name":"takeoff","params":{"altitude":"float[1,100],默认2"}}, {"name":"land","params":{"mode":"'current'/'home'"}}, {"name":"fly_to_waypoint","params":{"x":"±10000","y":"±10000","z":"[1,5000]","acceptance_radius":"默认2.0"}}, - {"name":"fly_sequence","params":{"waypoints":"list[dict] (e.g. [{'x':10,'y':20,'z':5}, ...])","coordinate_frame":"'global'/'local_enu'(global:经纬度, local_enu:以起飞点为原点的东北天坐标系)","speed":"float,可选"}}, + {"name":"fly_sequence","params":{"waypoints":"list[dict] (e.g. [{'x':10,'y':20,'depth':5}, ...];depth可选,不填则保持当前高度)","coordinate_frame":"'global'/'local_enu'(global:经纬度, local_enu:以起飞点为原点的东南天坐标系)","speed":"float,可选"}}, {"name":"move_direction","params":{"direction":"north/south/east/west/forward/backward/left/right","distance":"[1,10000],缺省持续移动","speed":"float,可选"}}, {"name":"approach_target","params":{"target_class":"string,要趋近的目标类别","description":"string,可选,目标属性描述","stop_distance":"float,期望的最终停止距离","speed":"float,可选,期望的逼近速度"}}, {"name":"rotate","params":{"angle":"float,无人机自身旋转角度(正数逆时针,负数顺时针)","angular_velocity":"rad/s,旋转角速度"}}, diff --git a/backend_service/src/prompts/simple_mode_prompt.txt b/backend_service/src/prompts/simple_mode_prompt.txt index 4ffef9a2..27b7243d 100644 --- a/backend_service/src/prompts/simple_mode_prompt.txt +++ b/backend_service/src/prompts/simple_mode_prompt.txt @@ -18,7 +18,7 @@ {"name":"takeoff","params":{"altitude":"float[1,100],默认2"}}, {"name":"land","params":{"mode":"'current'/'home'"}}, {"name":"fly_to_waypoint","params":{"x":"±10000","y":"±10000","z":"[1,5000]","acceptance_radius":"默认2.0"}}, - {"name":"fly_sequence","params":{"waypoints":"list[dict] (e.g. [{'x':10,'y':20,'z':5}, ...])","coordinate_frame":"'global'/'local_enu'(global:经纬度, local_enu:以起飞点为原点的东北天坐标系)","speed":"float,可选"}}, + {"name":"fly_sequence","params":{"waypoints":"list[dict] (e.g. [{'x':10,'y':20,'depth':5}, ...];depth可选,不填则保持当前高度)","coordinate_frame":"'global'/'local_enu'(global:经纬度, local_enu:以起飞点为原点的东南天坐标系)","speed":"float,可选"}}, {"name":"move_direction","params":{"direction":"north/south/east/west/forward/backward/left/right/up/down","distance":"[1,10000],缺省持续移动","speed":"float,可选"}}, {"name":"approach_target","params":{"target_class":"string,要趋近的目标类别","description":"string,可选,目标属性描述","stop_distance":"float,期望的最终停止距离","speed":"float,可选,期望的逼近速度"}}, {"name":"rotate","params":{"angle":"float,无人机自身旋转角度(正数逆时针,负数顺时针)","angular_velocity":"rad/s,旋转角速度"}}, diff --git a/backend_service/src/prompts/system_prompt.txt b/backend_service/src/prompts/system_prompt.txt index 01b71831..fe9aebbd 100644 --- a/backend_service/src/prompts/system_prompt.txt +++ b/backend_service/src/prompts/system_prompt.txt @@ -9,7 +9,7 @@ {"name":"takeoff","params":{"altitude":"float[1,100],默认2"}}, {"name":"land","params":{"mode":"'current'/'home'"}}, {"name":"fly_to_waypoint","params":{"x":"±10000","y":"±10000","z":"[1,5000]","acceptance_radius":"默认2.0","desc":"仅当指令提及具体地点(如'去广场'、'去大门')或需计算明确坐标时使用"}}, - {"name":"fly_sequence","params":{"waypoints":"list[dict] (e.g. [{'x':10,'y':20,'z':5}, ...])","coordinate_frame":"'global'/'local_enu'(global:经纬度, local_enu:以起飞点为原点的东南天坐标系)","speed":"float,可选"}}, + {"name":"fly_sequence","params":{"waypoints":"list[dict] (e.g. [{'x':10,'y':20,'depth':5}, ...];depth可选,不填则保持当前高度)","coordinate_frame":"'global'/'local_enu'(global:经纬度, local_enu:以起飞点为原点的东南天坐标系)","speed":"float,可选"}}, {"name":"move_direction","params":{"direction":"north/south/east/west/forward/backward/left/right","distance":"[1,10000],缺省则持续移动","speed":"float,可选","desc":"当指令仅包含'往东/西...飞xx米'且无具体地点名词时,必须使用此节点"}}, {"name":"approach_target","params":{"target_class":"string,要趋近的目标类别","description":"string,可选,目标属性描述","stop_distance":"float,期望的最终停止距离","speed":"float,可选,期望的逼近速度"}}, {"name":"rotate","params":{"angle":"float,无人机自身旋转角度(正数逆时针,负数顺时针)","angular_velocity":"rad/s,旋转角速度"}}, @@ -278,6 +278,496 @@ } ``` +#### 场景 7:空中上升后沿建筑外围侦察(Sequence + Selector) +**指令**:“无人机当前在空中,再往上飞3米,接着绕这栋楼外围侦察有没有人,看到了就拍照传回来。” +**参考信息**:面前的大楼外围四个点东南天坐标系坐标:A(-24.00, 241.80),B(-108.50, 241.80),C(-108.50, 289.80),D(-24.00, 292.80)。 +**思路**:无人机在空中,无需自检与起飞。先向上移动3米(仅方向+距离,使用`move_direction`)。随后“边飞边判断”:用`Parallel`并行执行`fly_sequence`与持续检测分支。检测分支使用`object_detect` + `object_detected` + `take_photos`,再用`SuccessIsFailure`保证不会提前结束并行;并行策略为`success_on_one`,当巡查飞行完成即结束任务。 +**结构**:Sequence +```json +{ + "root": { + "type": "Sequence", + "name": "RiseAndPatrolPerimeter", + "children": [ + { + "type": "action", + "name": "move_direction", + "params": { + "direction": "up", + "distance": 3.0 + } + }, + { + "type": "Parallel", + "name": "PatrolAndDetect", + "params": { + "policy": "success_on_one" + }, + "children": [ + { + "type": "action", + "name": "fly_sequence", + "params": { + "waypoints": [ + {"x": -24.0, "y": 241.8}, + {"x": -108.5, "y": 241.8}, + {"x": -108.5, "y": 289.8}, + {"x": -24.0, "y": 292.8}, + {"x": -24.0, "y": 241.8} + ], + "coordinate_frame": "local_enu" + } + }, + { + "type": "decorator", + "name": "SuccessIsFailure", + "child": { + "type": "Sequence", + "name": "DetectAndPhotoWhileFlying", + "children": [ + {"type":"action","name":"object_detect","params":{"target_class":"person","description":"建筑外围人员"}}, + {"type":"condition","name":"object_detected","params":{"target_class":"person","description":"建筑外围人员"}}, + {"type":"action","name":"take_photos","params":{"target_class":"person","description":"建筑外围人员","track_time":10.0}} + ] + } + } + ] + } + ] + } +} +``` + +#### 场景 8:地面起飞到楼前12米高度并沿外围查找杂物(Sequence) +**指令**:“无人机当前在地面,去面前大楼的12米高处,沿着外围查找所有的杂物堆积并拍照。” +**参考信息**:面前的大楼外围四个点东南天坐标系坐标:A(-24.00, 241.80),B(-108.50, 241.80),C(-108.50, 289.80),D(-24.00, 292.80)。 +**思路**:无人机在地面,需自检后起飞。指令是到具体地点且明确高度,使用`fly_sequence`沿外围巡查,所有航点设置为12米高度(`depth`=12)。为满足“边飞边判断”,使用`Parallel`并行飞行与检测,检测分支持续执行`object_detect` + `object_detected` + `take_photos`,用`SuccessIsFailure`避免提前结束。 +**结构**:Sequence +```json +{ + "root": { + "type": "Sequence", + "name": "FlyPerimeterAndPhotoGarbage", + "children": [ + {"type":"action","name":"system_checks","params":{"check_level":"comprehensive"}}, + {"type":"action","name":"takeoff","params":{"altitude":10.0}}, + { + "type": "Parallel", + "name": "PatrolAndDetectGarbage", + "params": { + "policy": "success_on_one" + }, + "children": [ + { + "type": "action", + "name": "fly_sequence", + "params": { + "waypoints": [ + {"x": -24.0, "y": 241.8, "depth": 12.0}, + {"x": -108.5, "y": 241.8, "depth": 12.0}, + {"x": -108.5, "y": 289.8, "depth": 12.0}, + {"x": -24.0, "y": 292.8, "depth": 12.0}, + {"x": -24.0, "y": 241.8, "depth": 12.0} + ], + "coordinate_frame": "local_enu" + } + }, + { + "type": "decorator", + "name": "SuccessIsFailure", + "child": { + "type": "Sequence", + "name": "DetectGarbageWhileFlying", + "children": [ + {"type":"action","name":"object_detect","params":{"target_class":"garbage","description":"杂物堆积"}}, + {"type":"condition","name":"object_detected","params":{"target_class":"garbage","description":"杂物堆积"}}, + {"type":"action","name":"take_photos","params":{"target_class":"garbage","description":"杂物堆积","track_time":10.0}} + ] + } + } + ] + } + ] + } +} +``` + +#### 场景 9:地面到12米绕外围查看打开的窗户(Sequence) +**指令**:“无人机当前在地面,去面前大楼的12米高处,绕着外围看有没有打开的窗户,发现则进行拍照。” +**参考信息**:面前的大楼外围四个点东南天坐标系坐标:A(-24.00, 241.80),B(-108.50, 241.80),C(-108.50, 289.80),D(-24.00, 292.80)。 +**思路**:无人机在地面,先自检起飞。随后使用`fly_sequence`沿外围绕飞,航点高度为12米(`depth`=12)。同时并行执行检测分支,发现打开窗户就拍照。 +**结构**:Sequence +```json +{ + "root": { + "type": "Sequence", + "name": "FlyPerimeterAndPhotoWindows", + "children": [ + {"type":"action","name":"system_checks","params":{"check_level":"comprehensive"}}, + {"type":"action","name":"takeoff","params":{"altitude":10.0}}, + { + "type": "Parallel", + "name": "PatrolAndDetectWindows", + "params": { + "policy": "success_on_one" + }, + "children": [ + { + "type": "action", + "name": "fly_sequence", + "params": { + "waypoints": [ + {"x": -24.0, "y": 241.8, "depth": 12.0}, + {"x": -108.5, "y": 241.8, "depth": 12.0}, + {"x": -108.5, "y": 289.8, "depth": 12.0}, + {"x": -24.0, "y": 292.8, "depth": 12.0}, + {"x": -24.0, "y": 241.8, "depth": 12.0} + ], + "coordinate_frame": "local_enu" + } + }, + { + "type": "decorator", + "name": "SuccessIsFailure", + "child": { + "type": "Sequence", + "name": "DetectOpenWindowsWhileFlying", + "children": [ + {"type":"action","name":"object_detect","params":{"target_class":"window","description":"打开的窗户"}}, + {"type":"condition","name":"object_detected","params":{"target_class":"window","description":"打开的窗户"}}, + {"type":"action","name":"take_photos","params":{"target_class":"window","description":"打开的窗户","track_time":10.0}} + ] + } + } + ] + } + ] + } +} +``` + +#### 场景 10:地面到12米沿外围查找打开的窗户(Sequence) +**指令**:“无人机当前在地面,去面前大楼的12米高处,沿着外围查找所有打开的窗户并拍照。” +**参考信息**:面前的大楼外围四个点东南天坐标系坐标:A(-24.00, 241.80),B(-108.50, 241.80),C(-108.50, 289.80),D(-24.00, 292.80)。 +**思路**:无人机在地面,起飞后使用`fly_sequence`沿外围巡查(`depth`=12),并行持续检测打开的窗户并拍照。 +**结构**:Sequence +```json +{ + "root": { + "type": "Sequence", + "name": "FlyPerimeterAndPhotoOpenWindows", + "children": [ + {"type":"action","name":"system_checks","params":{"check_level":"comprehensive"}}, + {"type":"action","name":"takeoff","params":{"altitude":10.0}}, + { + "type": "Parallel", + "name": "PatrolAndDetectOpenWindows", + "params": { + "policy": "success_on_one" + }, + "children": [ + { + "type": "action", + "name": "fly_sequence", + "params": { + "waypoints": [ + {"x": -24.0, "y": 241.8, "depth": 12.0}, + {"x": -108.5, "y": 241.8, "depth": 12.0}, + {"x": -108.5, "y": 289.8, "depth": 12.0}, + {"x": -24.0, "y": 292.8, "depth": 12.0}, + {"x": -24.0, "y": 241.8, "depth": 12.0} + ], + "coordinate_frame": "local_enu" + } + }, + { + "type": "decorator", + "name": "SuccessIsFailure", + "child": { + "type": "Sequence", + "name": "DetectAllOpenWindowsWhileFlying", + "children": [ + {"type":"action","name":"object_detect","params":{"target_class":"window","description":"打开的窗户"}}, + {"type":"condition","name":"object_detected","params":{"target_class":"window","description":"打开的窗户"}}, + {"type":"action","name":"take_photos","params":{"target_class":"window","description":"打开的窗户","track_time":10.0}} + ] + } + } + ] + } + ] + } +} +``` + +#### 场景 11:空中上升后绕外围侦察打开窗户(Sequence) +**指令**:“无人机当前在空中,再往上飞3米,接着绕这栋楼外围侦察有没有打开的窗户,看到了就拍照传回来。” +**参考信息**:面前的大楼外围四个点东南天坐标系坐标:A(-24.00, 241.80),B(-108.50, 241.80),C(-108.50, 289.80),D(-24.00, 292.80)。 +**思路**:无人机在空中,先上升3米。随后并行执行绕飞巡查与检测,发现打开窗户立即拍照。 +**结构**:Sequence +```json +{ + "root": { + "type": "Sequence", + "name": "RiseAndDetectOpenWindows", + "children": [ + {"type":"action","name":"move_direction","params":{"direction":"up","distance":3.0}}, + { + "type": "Parallel", + "name": "PatrolAndDetectOpenWindows", + "params": { + "policy": "success_on_one" + }, + "children": [ + { + "type": "action", + "name": "fly_sequence", + "params": { + "waypoints": [ + {"x": -24.0, "y": 241.8}, + {"x": -108.5, "y": 241.8}, + {"x": -108.5, "y": 289.8}, + {"x": -24.0, "y": 292.8}, + {"x": -24.0, "y": 241.8} + ], + "coordinate_frame": "local_enu" + } + }, + { + "type": "decorator", + "name": "SuccessIsFailure", + "child": { + "type": "Sequence", + "name": "DetectOpenWindowsWhileFlying", + "children": [ + {"type":"action","name":"object_detect","params":{"target_class":"window","description":"打开的窗户"}}, + {"type":"condition","name":"object_detected","params":{"target_class":"window","description":"打开的窗户"}}, + {"type":"action","name":"take_photos","params":{"target_class":"window","description":"打开的窗户","track_time":10.0}} + ] + } + } + ] + } + ] + } +} +``` + +#### 场景 12:地面到12米绕外围巡视杂物堆积(Sequence) +**指令**:“无人机当前在地面,去面前大楼的12米高处,绕着外围巡视杂物堆积现象,发现则进行拍照。” +**参考信息**:面前的大楼外围四个点东南天坐标系坐标:A(-24.00, 241.80),B(-108.50, 241.80),C(-108.50, 289.80),D(-24.00, 292.80)。 +**思路**:无人机在地面,起飞后沿外围绕飞(`depth`=12),并行检测杂物堆积并拍照。 +**结构**:Sequence +```json +{ + "root": { + "type": "Sequence", + "name": "FlyPerimeterAndPhotoGarbageObserve", + "children": [ + {"type":"action","name":"system_checks","params":{"check_level":"comprehensive"}}, + {"type":"action","name":"takeoff","params":{"altitude":10.0}}, + { + "type": "Parallel", + "name": "PatrolAndDetectGarbageObserve", + "params": { + "policy": "success_on_one" + }, + "children": [ + { + "type": "action", + "name": "fly_sequence", + "params": { + "waypoints": [ + {"x": -24.0, "y": 241.8, "depth": 12.0}, + {"x": -108.5, "y": 241.8, "depth": 12.0}, + {"x": -108.5, "y": 289.8, "depth": 12.0}, + {"x": -24.0, "y": 292.8, "depth": 12.0}, + {"x": -24.0, "y": 241.8, "depth": 12.0} + ], + "coordinate_frame": "local_enu" + } + }, + { + "type": "decorator", + "name": "SuccessIsFailure", + "child": { + "type": "Sequence", + "name": "DetectGarbageWhileFlying", + "children": [ + {"type":"action","name":"object_detect","params":{"target_class":"garbage","description":"杂物堆积"}}, + {"type":"condition","name":"object_detected","params":{"target_class":"garbage","description":"杂物堆积"}}, + {"type":"action","name":"take_photos","params":{"target_class":"garbage","description":"杂物堆积","track_time":10.0}} + ] + } + } + ] + } + ] + } +} +``` + +#### 场景 13:空中下降后绕外围侦察杂物堆积(Sequence) +**指令**:“无人机当前在空中,往下飞3米,接着绕这栋楼外围侦察有没有杂物堆积,看到了就拍照传回来。” +**参考信息**:面前的大楼外围四个点东南天坐标系坐标:A(-24.00, 241.80),B(-108.50, 241.80),C(-108.50, 289.80),D(-24.00, 292.80)。 +**思路**:无人机在空中,先下降3米。随后并行执行绕飞巡查与检测,发现杂物堆积立即拍照。 +**结构**:Sequence +```json +{ + "root": { + "type": "Sequence", + "name": "DescendAndDetectGarbage", + "children": [ + {"type":"action","name":"move_direction","params":{"direction":"down","distance":3.0}}, + { + "type": "Parallel", + "name": "PatrolAndDetectGarbage", + "params": { + "policy": "success_on_one" + }, + "children": [ + { + "type": "action", + "name": "fly_sequence", + "params": { + "waypoints": [ + {"x": -24.0, "y": 241.8}, + {"x": -108.5, "y": 241.8}, + {"x": -108.5, "y": 289.8}, + {"x": -24.0, "y": 292.8}, + {"x": -24.0, "y": 241.8} + ], + "coordinate_frame": "local_enu" + } + }, + { + "type": "decorator", + "name": "SuccessIsFailure", + "child": { + "type": "Sequence", + "name": "DetectGarbageWhileFlying", + "children": [ + {"type":"action","name":"object_detect","params":{"target_class":"garbage","description":"杂物堆积"}}, + {"type":"condition","name":"object_detected","params":{"target_class":"garbage","description":"杂物堆积"}}, + {"type":"action","name":"take_photos","params":{"target_class":"garbage","description":"杂物堆积","track_time":10.0}} + ] + } + } + ] + } + ] + } +} +``` + +#### 场景 14:地面到12米绕外围查看是否有人(Sequence) +**指令**:“无人机当前在地面,去面前大楼的12米高处,绕着外围看有没有人,发现则进行拍照。” +**参考信息**:面前的大楼外围四个点东南天坐标系坐标:A(-24.00, 241.80),B(-108.50, 241.80),C(-108.50, 289.80),D(-24.00, 292.80)。 +**思路**:无人机在地面,起飞后沿外围绕飞(`depth`=12),并行检测人员并拍照。 +**结构**:Sequence +```json +{ + "root": { + "type": "Sequence", + "name": "FlyPerimeterAndPhotoPerson", + "children": [ + {"type":"action","name":"system_checks","params":{"check_level":"comprehensive"}}, + {"type":"action","name":"takeoff","params":{"altitude":10.0}}, + { + "type": "Parallel", + "name": "PatrolAndDetectPerson", + "params": { + "policy": "success_on_one" + }, + "children": [ + { + "type": "action", + "name": "fly_sequence", + "params": { + "waypoints": [ + {"x": -24.0, "y": 241.8, "depth": 12.0}, + {"x": -108.5, "y": 241.8, "depth": 12.0}, + {"x": -108.5, "y": 289.8, "depth": 12.0}, + {"x": -24.0, "y": 292.8, "depth": 12.0}, + {"x": -24.0, "y": 241.8, "depth": 12.0} + ], + "coordinate_frame": "local_enu" + } + }, + { + "type": "decorator", + "name": "SuccessIsFailure", + "child": { + "type": "Sequence", + "name": "DetectPersonWhileFlying", + "children": [ + {"type":"action","name":"object_detect","params":{"target_class":"person","description":"人员"}}, + {"type":"condition","name":"object_detected","params":{"target_class":"person","description":"人员"}}, + {"type":"action","name":"take_photos","params":{"target_class":"person","description":"人员","track_time":10.0}} + ] + } + } + ] + } + ] + } +} +``` + +#### 场景 15:地面到12米沿外围逆时针查找人员(Sequence) +**指令**:“无人机当前在地面,去面前大楼的12米高处,沿着外围逆时针查找所有的人并拍照。” +**参考信息**:面前的大楼外围四个点东南天坐标系坐标:A(-24.00, 241.80),B(-108.50, 241.80),C(-108.50, 289.80),D(-24.00, 292.80)。 +**思路**:无人机在地面,起飞后按逆时针顺序巡查外围(示例航点顺序:A→D→C→B→A),并行检测人员与拍照。 +**结构**:Sequence +```json +{ + "root": { + "type": "Sequence", + "name": "FlyPerimeterCounterClockwiseAndPhotoPerson", + "children": [ + {"type":"action","name":"system_checks","params":{"check_level":"comprehensive"}}, + {"type":"action","name":"takeoff","params":{"altitude":10.0}}, + { + "type": "Parallel", + "name": "PatrolCCWAndDetectPerson", + "params": { + "policy": "success_on_one" + }, + "children": [ + { + "type": "action", + "name": "fly_sequence", + "params": { + "waypoints": [ + {"x": -24.0, "y": 241.8, "depth": 12.0}, + {"x": -24.0, "y": 292.8, "depth": 12.0}, + {"x": -108.5, "y": 289.8, "depth": 12.0}, + {"x": -108.5, "y": 241.8, "depth": 12.0}, + {"x": -24.0, "y": 241.8, "depth": 12.0} + ], + "coordinate_frame": "local_enu" + } + }, + { + "type": "decorator", + "name": "SuccessIsFailure", + "child": { + "type": "Sequence", + "name": "DetectPersonWhileFlying", + "children": [ + {"type":"action","name":"object_detect","params":{"target_class":"person","description":"人员"}}, + {"type":"condition","name":"object_detected","params":{"target_class":"person","description":"人员"}}, + {"type":"action","name":"take_photos","params":{"target_class":"person","description":"人员","track_time":10.0}} + ] + } + } + ] + } + ] + } +} +``` + ## 六、高频错误规避 1. 控制流节点的 `type` 必须是 `"Sequence"`, `"Selector"` 或 `"Parallel"` 2. **人工确认节点 (`manual_confirmation`) 使用原则**: diff --git a/backend_service/src/py_tree_generator.py b/backend_service/src/py_tree_generator.py index 6d11a937..5b2c147c 100644 --- a/backend_service/src/py_tree_generator.py +++ b/backend_service/src/py_tree_generator.py @@ -304,9 +304,9 @@ def _generate_pytree_schema(allowed_actions: set, allowed_conditions: set) -> di "properties": { "x": {"type": "number"}, "y": {"type": "number"}, - "z": {"type": "number"} + "depth": {"type": "number"} }, - "required": ["x", "y", "z"] + "required": ["x", "y"] }, "minItems": 1 }, diff --git a/backend_service/src/tools/__pycache__/__init__.cpython-313.pyc b/backend_service/src/tools/__pycache__/__init__.cpython-313.pyc index f75f01da9ae193c54d9b038dac317d01a4c07c3d..cf655a6948c45874520562541fbce791b7650655 100644 GIT binary patch delta 30 kcmX@Xcz}`XGcPX}0}xF9I*}`s!&*NhKQ~oBabkWX0ENT}C;$Ke delta 38 scmX@Wc!H7ZGcPX}0}$x4Oymj`aMsVr&rQ|OC{4^uPb