diff --git a/backend_service/src/prompts/classifier_prompt.txt b/backend_service/src/prompts/classifier_prompt.txt index 505edbe9..1754b0b0 100644 --- a/backend_service/src/prompts/classifier_prompt.txt +++ b/backend_service/src/prompts/classifier_prompt.txt @@ -4,6 +4,10 @@ - 简单:单一动作节点即可完成(例如"起飞""飞机自检""移动到某地(已给定坐标)"等),且无需行为树。 - 复杂:需要两个动作及以上、多步流程、搜索/检测/跟踪/评估、战损确认、或需要模板化任务结构。 +判断简单/复杂任务一定要结合无人机状态,在地面还是在空中: +1. 如果提及无人机在地面,则执行任何任务前都需要起飞,因此凡是起飞后还有其他动作的应当判定为复杂; +2. 如果提及无人机在空中,则执行任务时如果是"无人机当前在空中,飞到某地"这一类任务应当判定为简单。 + 输出格式(严格遵守): {"mode":"simple"} 或 {"mode":"complex"} @@ -51,4 +55,6 @@ # 需要辨析的情况 1. "无人机当前在空中,往东边飞50米,停个20s就好返航了。"这样的指令应该被判定为复杂,因为需要多步执行。 -2. 到某地执行某动作,这样的任务应该是复杂。 \ No newline at end of file +2. 到某地执行某动作,这样的任务应该是复杂。 +3. "无人机当前在空中,飞到广场"这样的任务,无人机只需要执行fly_to_waypoint即可,无需起飞,这样的任务是简单。 +4. "无人机当前在地面,飞到广场"这样的任务,无人机需要先起飞再飞到广场,这样的任务是复杂。 \ No newline at end of file diff --git a/backend_service/src/prompts/simple_mode_prompt.txt b/backend_service/src/prompts/simple_mode_prompt.txt index 22b636e1..4ffef9a2 100644 --- a/backend_service/src/prompts/simple_mode_prompt.txt +++ b/backend_service/src/prompts/simple_mode_prompt.txt @@ -19,7 +19,7 @@ {"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":"move_direction","params":{"direction":"north/south/east/west/forward/backward/left/right","distance":"[1,10000],缺省持续移动","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,旋转角速度"}}, {"name":"rotate_search","params":{"target_class":"string,要搜寻的目标类别","description":"string,可选,目标属性描述","step_angle":"float,可选,每一步旋转的角度","total_rotation":"float,可选,总共旋转搜索的角度"}}, @@ -32,7 +32,7 @@ {"name":"track_object","params":{"target_class":"同object_detect","description":"可选,目标属性","track_time":"[1,600]秒(必传,不可用'duration')","min_confidence":"[0.5,1.0]默认0.7","safe_distance":"[2,50]默认10"}}, {"name":"deliver_payload","params":{"payload_type":"string","release_altitude":"[2,100]默认5"}}, {"name":"system_checks","params":{"check_level":"basic/comprehensive"}}, - {"name":"return","params":{"reason":"string"}}, + {"name":"return_emergency","params":{"reason":"string,此节点仅用于【无明确目的地】的立即返航。若指令包含“回到xx地”、“去xx地”(即使包含“紧急”二字),**严禁**使用此节点,必须使用fly_to_waypoint"}}, {"name":"take_photos","params":{"target_class":"同object_detect","description":"可选,目标属性","track_time":"[1,600]秒(必传,不可用'duration')","min_confidence":"[0.5,1.0]默认0.7","safe_distance":"[2,50]默认10"}} ], "conditions": [ diff --git a/backend_service/src/prompts/system_prompt.txt b/backend_service/src/prompts/system_prompt.txt index 17460b12..986b9794 100644 --- a/backend_service/src/prompts/system_prompt.txt +++ b/backend_service/src/prompts/system_prompt.txt @@ -62,18 +62,12 @@ {"type":"action","name":"takeoff","params":{"altitude":10.0}}, {"type":"action","name":"fly_to_waypoint","params":{"x":100.0,"y":50.0,"z":10.0}}, // 接近目标区域 // --- 核心任务区 (根据指令替换) --- - // --- 任务1执行--- - {"type":"action","name":"rotate_search","params":{"target_class":"person","description":"目标描述"}}, - {"type":"action","name":"object_detect","params":{"target_class":"person","description":"目标描述"}}, - // ----条件判断(根据指令替换) ----- - {"type":"condition","name":"object_detected","params":{"target_class":"person","description":"扎辫子女子"}}, - // --- 任务2执行--- - {"type":"action","name":"take_photos","params":{"target_class":"person","description":"扎辫子女子"}}, // 默认不需要降落节点,除非用户明确要求 ] } } ``` +而当无人机在空中时,则无需system_checks与takeoff环节,直接执行用户任务即可 ## 四、场景示例(请灵活参考) @@ -214,14 +208,58 @@ } ``` +#### 场景 5:后置确认任务(Sequence + Manual Confirmation) +**指令**:“无人机当前在地面,搜索小汽车,搜索到了拍张照,我确认后再决定要不要返航” +**思路**:无人机在地面,需起飞。搜索小汽车(`rotate_search` + `object_detected`)。搜索到后,先执行拍照(`take_photos`)。之后执行人工确认(`manual_confirmation`),确认通过后才执行返航(`return_emergency`)。 +**结构**:Sequence +```json +{ + "root": { + "type": "Sequence", + "name": "SearchPhotoConfirmReturn", + "children": [ + {"type":"action","name":"system_checks","params":{"check_level":"comprehensive"}}, + {"type":"action","name":"takeoff","params":{"altitude":10.0}}, + {"type":"action","name":"rotate_search","params":{"target_class":"car","description":"小汽车"}}, + {"type":"condition","name":"object_detected","params":{"target_class":"car","description":"小汽车"}}, + {"type":"action","name":"take_photos","params":{"target_class":"car","description":"小汽车"}}, + {"type":"action","name":"manual_confirmation","params":{}}, + {"type":"action","name":"return_emergency","params":{"reason":"确认后返航"}} + ] + } +} +``` + +#### 场景 6:移动后条件降落(Sequence) +**指令**:“无人机当前在空中,紧急回到广场,看见了红绿灯之后直接降落。” +**参考知识**:广场坐标(x:0.0, y:0.0, z:10.0) +**思路**:无人机在空中,无需起飞。首先飞往广场(`fly_to_waypoint`),严禁使用`return_emergency`。到达后,为了满足“看见红绿灯”的条件,必须先执行主动搜索(`rotate_search`)。一旦检测到红绿灯(`object_detected`),即执行降落(`land`)。 +**结构**:Sequence +```json +{ + "root": { + "type": "Sequence", + "name": "FlySearchLand", + "children": [ + {"type":"action","name":"fly_to_waypoint","params":{"x":0.0,"y":0.0,"z":10.0}}, + {"type":"action","name":"rotate_search","params":{"target_class":"traffic_light","description":"红绿灯"}}, + {"type":"condition","name":"object_detected","params":{"target_class":"traffic_light","description":"红绿灯"}}, + {"type":"action","name":"land","params":{"mode":"current"}} + ] + } +} +``` + ## 六、高频错误规避 1. 控制流节点的 `type` 必须是 `"Sequence"`, `"Selector"` 或 `"Parallel"` -2. 当用户指令中要求执行动作前增加人工确认时,比如“我确认后拍照”,则必须在拍照动作前增加manual_confirmation节点 -3. 在条件节点执行前,必须有相应动作节点!如object_detected节点前必须是rotate_search等搜索类节点 +2. **人工确认节点 (`manual_confirmation`) 使用原则**: + - **必须添加**:仅当指令中明确包含“我确认”、“等待确认”、“经允许”、“我通过后”等人工介入关键词时,**必须**在相应动作前添加此节点。 + - **严禁添加**:若指令未提及上述关键词,**严禁**主动添加此节点(即使是拍照、返航或降落等动作,只要用户没说要确认,就直接执行)。 +3. 在条件节点 `object_detected` 执行前,必须先安排搜索类动作节点(优先使用 `rotate_search`,仅当需大范围移动时用 `search_pattern`),确保无人机主动寻找目标。 4. 当使用rotate_search或者object_detect节点时,必须有object_detected节点 5. 用户指令中要求在当前位置执行任务时,无需fly_to_waypoint节点 6. **严格区分无人机状态**:当用户指令明确无人机在**空中**时,严禁使用system_checks与takeoff节点;仅当指令明确在**地面**时,才可使用这两个节点 -7. **重点关注**:fly_to_waypoint与return_emergency节点辨析:当指令包含具体目的地(如“紧急回到广场”、“飞回大门”)时,**必须**使用fly_to_waypoint节点,**绝对禁止**使用return_emergency节点(该节点仅用于无目的地的“紧急返航”指令)。 +7. **重点关注**:fly_to_waypoint与return_emergency节点辨析:当指令包含具体目的地(如“紧急回到广场”、“飞回大门”)时,**必须**使用fly_to_waypoint节点,**绝对禁止**使用return_emergency节点(该节点仅用于无目的地的“返航”指令)。 8. 当用户指令中提及“靠近”、“飞近”、“贴近”目标时,**必须**在`take_photos`之前使用`approach_target`节点;若未提及此类关键词,则**严禁**使用`approach_target`节点。 9. **方向移动优先原则**:当指令为“快速去往东边100米”,直接使用 `move_direction` 节点+距离参数,严禁使用fly_to_waypoint diff --git a/start_all.sh b/start_all.sh index f2c2d79e..730e598c 100755 --- a/start_all.sh +++ b/start_all.sh @@ -236,6 +236,10 @@ start_services() { --host 0.0.0.0 \ -c 8192 \ --jinja \ + --temp 0 \ + --top-k 1 \ + --top-p 1.0 \ + --min-p 0 \ > "${LOG_DIR}/inference_model.log" 2>&1 & local inference_pid=$! echo $inference_pid >> "${PID_FILE}"