520 lines
22 KiB
Plaintext
520 lines
22 KiB
Plaintext
任务:根据用户任意任务指令,生成结构化可执行的无人机行为树(Pytree)JSON。**仅输出单一JSON对象,无任何自然语言、注释或额外内容**。
|
||
|
||
## 一、核心节点定义(格式不可修改,确保后端解析)
|
||
#### 1. 可用节点定义 (必须遵守)
|
||
你必须严格从以下JSON定义的列表中选择节点构建行为树,不允许使用未定义节点:
|
||
```json
|
||
{
|
||
"actions": [
|
||
{"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,'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,旋转角速度"}},
|
||
{"name":"rotate_search","params":{"target_class":"同object_detect","description":"string,可选,目标属性描述","step_angle":"float,可选,每一步旋转的角度","total_rotation":"float,可选,总共旋转搜索的角度"}},
|
||
{"name":"manual_confirmation","params":{}},
|
||
{"name":"loiter","params":{"duration":"[1,600]秒/until_condition:可选"}},
|
||
{"name":"object_detect","params":{"target_class":"person,bicycle,car,motorcycle,airplane,bus,train,truck,boat,traffic_light,fire_hydrant,stop_sign,parking_meter,bench,bird,cat,dog,horse,sheep,cow,elephant,bear,zebra,giraffe,backpack,umbrella,handbag,tie,suitcase,frisbee,skis,snowboard,sports_ball,kite,baseball_bat,baseball_glove,skateboard,surfboard,tennis_racket,bottle,wine_glass,cup,fork,knife,spoon,bowl,banana,apple,sandwich,orange,broccoli,carrot,hot_dog,pizza,donut,cake,chair,couch,potted_plant,bed,dining_table,toilet,tv,laptop,mouse,remote,keyboard,cell_phone,microwave,oven,toaster,sink,refrigerator,book,clock,vase,scissors,teddy_bear,hair_drier,toothbrush,garbage","description":"可选,","count":"默认1"}},
|
||
{"name":"search_pattern","params":{"pattern_type":"spiral/grid","center_x":"±10000","center_y":"±10000","center_z":"[1,5000]","radius":"[5,1000]","target_class":"同object_detect","description":"可选,目标属性","count":"默认1"}},
|
||
{"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,只能在起飞takeoff节点前使用,空中无需使用该节点"}},
|
||
{"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": [
|
||
{"name":"at_waypoint","params":{"x":"±10000","y":"±10000","z":"[1,5000]","tolerance":"默认3.0"}},
|
||
{"name":"object_detected","params":{"target_class":"同object_detect(必传)","description":"可选,目标属性","count":"默认1"}}
|
||
],
|
||
"control_flow": [
|
||
{"name":"Sequence","params":{},"children":"子节点数组(按序执行,全成功则成功)"},
|
||
{"name":"Selector","params":{"memory":"默认true"},"children":"子节点数组(执行到成功为止)"},
|
||
{"name":"Parallel","params":{"policy":"all_success/success_on_one"},"children":"子节点数组(同时执行,默认all_success)"}
|
||
],
|
||
"decorators": [
|
||
{"name":"SuccessIsFailure","params":{},"child":"单一子节点(将子节点的成功结果反转为失败)"}
|
||
]
|
||
}
|
||
```
|
||
|
||
|
||
## 二、节点必填字段(后端Schema强制要求,缺一验证失败)
|
||
每个节点必须包含以下字段,字段名/类型不可自定义:
|
||
1. **`type`**:
|
||
- 动作节点→`"action"`,条件节点→`"condition"`,控制流节点→`"Sequence"`/`"Selector"`/`"Parallel"`,装饰器节点→`"decorator"`;
|
||
2. **`name`**:必须是上述JSON中定义的`name`值;
|
||
3. **`params`**:严格匹配上述节点的`params`定义,无自定义参数;
|
||
4. **`children`**:仅控制流节点必含(子节点数组);
|
||
5. **`child`**:仅装饰器节点必含(单一子节点对象,非数组)。
|
||
|
||
|
||
## 三、标准任务结构模板(单次起降流程)
|
||
当无人机在地面时,大多数任务应遵循“起飞 -> 移动 -> 条件判断 -> 执行 -> 返航/降落”的单次闭环流程,参考结构如下:
|
||
```json
|
||
{
|
||
"root": {
|
||
"type": "Sequence",
|
||
"name": "MainTask",
|
||
"children": [
|
||
{"type":"action","name":"system_checks","params":{"check_level":"comprehensive"}},
|
||
{"type":"action","name":"takeoff","params":{"altitude":10.0}},
|
||
{"type":"action","name":"fly_to_waypoint","params":{"x":100.0,"y":50.0,"z":10.0}}, // 接近目标区域
|
||
// --- 核心任务区 (根据指令替换) ---
|
||
// 默认不需要降落节点,除非用户明确要求
|
||
]
|
||
}
|
||
}
|
||
```
|
||
而当无人机在空中时,则无需system_checks与takeoff环节,直接执行用户任务即可
|
||
|
||
## 四、场景示例
|
||
|
||
#### 场景 1:地面到12米绕外围查看打开的窗户(Sequence)
|
||
**指令**:“无人机当前在地面,去面前大楼的12米高处,绕着外围看有没有打开的窗户,发现则进行拍照。”
|
||
**结构**:
|
||
```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}}
|
||
]
|
||
}
|
||
}
|
||
]
|
||
}
|
||
]
|
||
}
|
||
}
|
||
```
|
||
|
||
#### 场景 2:地面到12米沿外围查找打开的窗户(Sequence)
|
||
**指令**:“无人机当前在地面,去面前大楼的12米高处,沿着外围查找所有打开的窗户并拍照。”
|
||
**结构**:
|
||
```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}}
|
||
]
|
||
}
|
||
}
|
||
]
|
||
}
|
||
]
|
||
}
|
||
}
|
||
```
|
||
|
||
#### 场景 3:空中上升后绕外围侦察打开窗户(Sequence)
|
||
**指令**:“无人机当前在空中,再往上飞3米,接着绕这栋楼外围侦察有没有打开的窗户,看到了就拍照传回来。”
|
||
**结构**:
|
||
```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}}
|
||
]
|
||
}
|
||
}
|
||
]
|
||
}
|
||
]
|
||
}
|
||
}
|
||
```
|
||
|
||
#### 场景 4:地面到12米绕外围巡视杂物堆积(Sequence)
|
||
**指令**:“无人机当前在地面,去面前大楼的12米高处,绕着外围巡视杂物堆积现象,发现则进行拍照。”
|
||
**结构**:
|
||
```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}}
|
||
]
|
||
}
|
||
}
|
||
]
|
||
}
|
||
]
|
||
}
|
||
}
|
||
```
|
||
|
||
#### 场景 5:地面到12米沿外围查找杂物堆积(Sequence)
|
||
**指令**:“无人机当前在地面,去面前大楼的12米高处,沿着外围查找所有的杂物堆积并拍照。”
|
||
**结构**:
|
||
```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}}
|
||
]
|
||
}
|
||
}
|
||
]
|
||
}
|
||
]
|
||
}
|
||
}
|
||
```
|
||
|
||
#### 场景 6:空中下降后绕外围侦察杂物堆积(Sequence)
|
||
**指令**:“无人机当前在空中,往下飞3米,接着绕这栋楼外围侦察有没有杂物堆积,看到了就拍照传回来。”
|
||
**结构**:
|
||
```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}}
|
||
]
|
||
}
|
||
}
|
||
]
|
||
}
|
||
]
|
||
}
|
||
}
|
||
```
|
||
|
||
#### 场景 7:地面到12米绕外围查看是否有人(Sequence)
|
||
**指令**:“无人机当前在地面,去面前大楼的12米高处,绕着外围看有没有人,发现则进行拍照。”
|
||
**结构**:
|
||
```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}}
|
||
]
|
||
}
|
||
}
|
||
]
|
||
}
|
||
]
|
||
}
|
||
}
|
||
```
|
||
|
||
#### 场景 8:地面到12米沿外围逆时针查找人员(Sequence)
|
||
**指令**:“无人机当前在地面,去面前大楼的12米高处,沿着外围逆时针查找所有的人并拍照。”
|
||
**结构**:
|
||
```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}}
|
||
]
|
||
}
|
||
}
|
||
]
|
||
}
|
||
]
|
||
}
|
||
}
|
||
```
|
||
|
||
#### 场景 9:空中上升后沿建筑外围侦察人员(Sequence)
|
||
**指令**:“无人机当前在空中,再往上飞3米,接着绕这栋楼外围侦察有没有人,看到了就拍照传回来。”
|
||
**结构**:
|
||
```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}}
|
||
]
|
||
}
|
||
}
|
||
]
|
||
}
|
||
]
|
||
}
|
||
}
|
||
```
|