automatic move towards
This commit is contained in:
294
paper.md
294
paper.md
@@ -1,260 +1,552 @@
|
||||
补全auto_navigate_move_towards函数,函数的输入包含drone_id,方向和在该方向上的预期移动距离。在遇到障碍物时,需要越过障碍物,并继续移动。最终到达的位置和初始位置相比,在指定的方向上移动的距离应当不小于预期移动距离。
|
||||
|
||||
@tool
|
||||
def auto_navigate_move_towards(input_json: str) -> str:
|
||||
try:
|
||||
params = json.loads(input_json) if isinstance(input_json, str) else input_json
|
||||
pass
|
||||
|
||||
现在先补全函数,可以调用`get_obstacles`函数获取障碍物信息。该函数返回一个列表。obstacles的种类有4类,是point、circle、polygon、ellipse。这个列表形如:
|
||||
|
||||
[
|
||||
|
||||
{
|
||||
|
||||
"id": "bb07b327",
|
||||
|
||||
"name": "Point Obstacle 1",
|
||||
|
||||
"type": "point",
|
||||
|
||||
"position": {
|
||||
|
||||
"x": 609.0,
|
||||
|
||||
"y": 459.0,
|
||||
|
||||
"z": 0.0
|
||||
|
||||
},
|
||||
|
||||
"description": "",
|
||||
|
||||
"radius": 30.0,
|
||||
|
||||
"vertices": [],
|
||||
|
||||
"width": null,
|
||||
|
||||
"length": null,
|
||||
|
||||
"height": 0.0,
|
||||
|
||||
"area": 2827.4333882308138,
|
||||
|
||||
"created_at": 1766327750.018749,
|
||||
|
||||
"last_updated": 1766327750.018749
|
||||
|
||||
},
|
||||
|
||||
{
|
||||
|
||||
"id": "fd0760b8",
|
||||
|
||||
"name": "Point Obstacle 2",
|
||||
|
||||
"type": "point",
|
||||
|
||||
"position": {
|
||||
|
||||
"x": 896.0,
|
||||
|
||||
"y": 241.0,
|
||||
|
||||
"z": 0.0
|
||||
|
||||
},
|
||||
|
||||
"description": "",
|
||||
|
||||
"radius": 6.0,
|
||||
|
||||
"vertices": [],
|
||||
|
||||
"width": null,
|
||||
|
||||
"length": null,
|
||||
|
||||
"height": 0.0,
|
||||
|
||||
"area": 113.09733552923255,
|
||||
|
||||
"created_at": 1766327750.0221481,
|
||||
|
||||
"last_updated": 1766327750.0221481
|
||||
|
||||
},
|
||||
|
||||
{
|
||||
|
||||
"id": "1d817ce2",
|
||||
|
||||
"name": "Point Obstacle 3",
|
||||
|
||||
"type": "point",
|
||||
|
||||
"position": {
|
||||
|
||||
"x": 809.0,
|
||||
|
||||
"y": 14.0,
|
||||
|
||||
"z": 0.0
|
||||
|
||||
},
|
||||
|
||||
"description": "",
|
||||
|
||||
"radius": 8.0,
|
||||
|
||||
"vertices": [],
|
||||
|
||||
"width": null,
|
||||
|
||||
"length": null,
|
||||
|
||||
"height": 0.0,
|
||||
|
||||
"area": 201.06192982974676,
|
||||
|
||||
"created_at": 1766327750.025595,
|
||||
|
||||
"last_updated": 1766327750.025595
|
||||
|
||||
},
|
||||
|
||||
{
|
||||
|
||||
"id": "2b38acd5",
|
||||
|
||||
"name": "Circle Obstacle 1",
|
||||
|
||||
"type": "circle",
|
||||
|
||||
"position": {
|
||||
|
||||
"x": 438.0,
|
||||
|
||||
"y": 465.0,
|
||||
|
||||
"z": 0.0
|
||||
|
||||
},
|
||||
|
||||
"description": "",
|
||||
|
||||
"radius": 40.0,
|
||||
|
||||
"vertices": [],
|
||||
|
||||
"width": null,
|
||||
|
||||
"length": null,
|
||||
|
||||
"height": 0.0,
|
||||
|
||||
"area": 5026.548245743669,
|
||||
|
||||
"created_at": 1766327750.019903,
|
||||
|
||||
"last_updated": 1766327750.019903
|
||||
|
||||
},
|
||||
|
||||
{
|
||||
|
||||
"id": "fa67aa30",
|
||||
|
||||
"name": "Circle Obstacle 2",
|
||||
|
||||
"type": "circle",
|
||||
|
||||
"position": {
|
||||
|
||||
"x": 431.0,
|
||||
|
||||
"y": 605.0,
|
||||
|
||||
"z": 0.0
|
||||
|
||||
},
|
||||
|
||||
"description": "",
|
||||
|
||||
"radius": 55.0,
|
||||
|
||||
"vertices": [],
|
||||
|
||||
"width": null,
|
||||
|
||||
"length": null,
|
||||
|
||||
"height": 0.0,
|
||||
|
||||
"area": 9503.317777109125,
|
||||
|
||||
"created_at": 1766327750.0267,
|
||||
|
||||
"last_updated": 1766327750.0267
|
||||
|
||||
},
|
||||
|
||||
{
|
||||
|
||||
"id": "845b6b36",
|
||||
|
||||
"name": "Polygon Obstacle 1",
|
||||
|
||||
"type": "polygon",
|
||||
|
||||
"position": {
|
||||
|
||||
"x": 686.0,
|
||||
|
||||
"y": 669.0,
|
||||
|
||||
"z": 0.0
|
||||
|
||||
},
|
||||
|
||||
"description": "",
|
||||
|
||||
"radius": null,
|
||||
|
||||
"vertices": [
|
||||
|
||||
{
|
||||
|
||||
"x": 611.0,
|
||||
|
||||
"y": 594.0
|
||||
|
||||
},
|
||||
|
||||
{
|
||||
|
||||
"x": 761.0,
|
||||
|
||||
"y": 594.0
|
||||
|
||||
},
|
||||
|
||||
{
|
||||
|
||||
"x": 761.0,
|
||||
|
||||
"y": 744.0
|
||||
|
||||
},
|
||||
|
||||
{
|
||||
|
||||
"x": 611.0,
|
||||
|
||||
"y": 744.0
|
||||
|
||||
}
|
||||
|
||||
],
|
||||
|
||||
"width": null,
|
||||
|
||||
"length": null,
|
||||
|
||||
"height": 0.0,
|
||||
|
||||
"area": 22500.0,
|
||||
|
||||
"created_at": 1766327750.021056,
|
||||
|
||||
"last_updated": 1766327750.021056
|
||||
|
||||
},
|
||||
|
||||
{
|
||||
|
||||
"id": "8603630e",
|
||||
|
||||
"name": "Polygon Obstacle 2",
|
||||
|
||||
"type": "polygon",
|
||||
|
||||
"position": {
|
||||
|
||||
"x": 312.0,
|
||||
|
||||
"y": 232.0,
|
||||
|
||||
"z": 0.0
|
||||
|
||||
},
|
||||
|
||||
"description": "",
|
||||
|
||||
"radius": null,
|
||||
|
||||
"vertices": [
|
||||
|
||||
{
|
||||
|
||||
"x": 247.0,
|
||||
|
||||
"y": 167.0
|
||||
|
||||
},
|
||||
|
||||
{
|
||||
|
||||
"x": 377.0,
|
||||
|
||||
"y": 167.0
|
||||
|
||||
},
|
||||
|
||||
{
|
||||
|
||||
"x": 377.0,
|
||||
|
||||
"y": 297.0
|
||||
|
||||
},
|
||||
|
||||
{
|
||||
|
||||
"x": 247.0,
|
||||
|
||||
"y": 297.0
|
||||
|
||||
}
|
||||
|
||||
],
|
||||
|
||||
"width": null,
|
||||
|
||||
"length": null,
|
||||
|
||||
"height": 0.0,
|
||||
|
||||
"area": 16900.0,
|
||||
|
||||
"created_at": 1766327750.023377,
|
||||
|
||||
"last_updated": 1766327750.023377
|
||||
|
||||
},
|
||||
|
||||
{
|
||||
|
||||
"id": "b32c509b",
|
||||
|
||||
"name": "Polygon Obstacle 3",
|
||||
|
||||
"type": "polygon",
|
||||
|
||||
"position": {
|
||||
|
||||
"x": 691.0,
|
||||
|
||||
"y": 344.0,
|
||||
|
||||
"z": 0.0
|
||||
|
||||
},
|
||||
|
||||
"description": "",
|
||||
|
||||
"radius": null,
|
||||
|
||||
"vertices": [
|
||||
|
||||
{
|
||||
|
||||
"x": 625.0,
|
||||
|
||||
"y": 278.0
|
||||
|
||||
},
|
||||
|
||||
{
|
||||
|
||||
"x": 757.0,
|
||||
|
||||
"y": 278.0
|
||||
|
||||
},
|
||||
|
||||
{
|
||||
|
||||
"x": 757.0,
|
||||
|
||||
"y": 410.0
|
||||
|
||||
},
|
||||
|
||||
{
|
||||
|
||||
"x": 625.0,
|
||||
|
||||
"y": 410.0
|
||||
|
||||
}
|
||||
|
||||
],
|
||||
|
||||
"width": null,
|
||||
|
||||
"length": null,
|
||||
|
||||
"height": 0.0,
|
||||
|
||||
"area": 17424.0,
|
||||
|
||||
"created_at": 1766327750.027871,
|
||||
|
||||
"last_updated": 1766327750.027871
|
||||
|
||||
},
|
||||
|
||||
{
|
||||
|
||||
"id": "b6a5ec7c",
|
||||
|
||||
"name": "Polygon Obstacle 4",
|
||||
|
||||
"type": "polygon",
|
||||
|
||||
"position": {
|
||||
|
||||
"x": 237.0,
|
||||
|
||||
"y": 555.0,
|
||||
|
||||
"z": 0.0
|
||||
|
||||
},
|
||||
|
||||
"description": "",
|
||||
|
||||
"radius": null,
|
||||
|
||||
"vertices": [
|
||||
|
||||
{
|
||||
|
||||
"x": 181.0,
|
||||
|
||||
"y": 499.0
|
||||
|
||||
},
|
||||
|
||||
{
|
||||
|
||||
"x": 293.0,
|
||||
|
||||
"y": 499.0
|
||||
|
||||
},
|
||||
|
||||
{
|
||||
|
||||
"x": 293.0,
|
||||
|
||||
"y": 611.0
|
||||
|
||||
},
|
||||
|
||||
{
|
||||
|
||||
"x": 181.0,
|
||||
|
||||
"y": 611.0
|
||||
|
||||
}
|
||||
|
||||
],
|
||||
|
||||
"width": null,
|
||||
|
||||
"length": null,
|
||||
|
||||
"height": 0.0,
|
||||
|
||||
"area": 12544.0,
|
||||
|
||||
"created_at": 1766327750.0289862,
|
||||
|
||||
"last_updated": 1766327750.0289862
|
||||
|
||||
},
|
||||
|
||||
{
|
||||
|
||||
"id": "9bf135c3",
|
||||
|
||||
"name": "Ellipse Obstacle 1",
|
||||
|
||||
"type": "ellipse",
|
||||
|
||||
"position": {
|
||||
|
||||
"x": 475.0,
|
||||
|
||||
"y": 156.0,
|
||||
|
||||
"z": 0.0
|
||||
|
||||
},
|
||||
|
||||
"description": "",
|
||||
|
||||
"radius": null,
|
||||
|
||||
"vertices": [],
|
||||
|
||||
"width": 46.0,
|
||||
|
||||
"length": 34.0,
|
||||
|
||||
"height": 0.0,
|
||||
|
||||
"area": 4913.450910214437,
|
||||
|
||||
"created_at": 1766327750.0245,
|
||||
|
||||
"last_updated": 1766327750.0245
|
||||
|
||||
}
|
||||
]
|
||||
|
||||
]
|
||||
|
||||
对于高度不为0的obstacles,如果无人机的最大可达高度大于obstacle的高度,就能够飞跃。对于不能飞跃的和高度为0的obstacles,需要绕路。
|
||||
|
||||
该函数只需为无人机确定一个要到达的目标坐标点。该坐标点需要与障碍物保持一定的距离。确定好目标坐标点后,调用auto_navigate_to函数
|
||||
|
||||
```
|
||||
def auto_navigate_to(input_json: str) -> str:
|
||||
"""
|
||||
Plan an obstacle-avoiding path using analytic geometry for precise collision detection.
|
||||
|
||||
Input should be a JSON string with:
|
||||
- drone_id: The ID of the drone (required)
|
||||
- x: Target X coordinate in meters (required)
|
||||
- y: Target Y coordinate in meters (required)
|
||||
- z: Target Z coordinate (altitude) in meters (required)
|
||||
|
||||
Example: {{"drone_id": "drone-001", "x": 100.0, "y": 50.0, "z": 20.0}}
|
||||
"""
|
||||
```
|
||||
|
||||
即可将无人机从当前位置导航到目标位置,并避开所有障碍物。
|
||||
|
||||
现在请补全auto_navigate_move_towards函数。
|
||||
@@ -87,7 +87,7 @@ Tips for you to finish task in the most efficient way:
|
||||
6. Reaching to a higher latitude can help you see targets, but do not exceed the drone's limit.
|
||||
7. Cannot move from current status: DroneStatus.IDLE means you need to take off first then move.
|
||||
8. If the start point is different with the current position of the drone, first go to the start point, then continue the left paths.
|
||||
|
||||
9. Moving X meters in a given direction means reaching a location that is at a distance of X meters from the current point along that direction. The distance must not be reduced due to detouring, nor should the detour proceed in the opposite direction. Obstacle avoidance do not mean you can reduce the distance. Only increase the distance is allowed.
|
||||
Begin!
|
||||
|
||||
Question: {input}
|
||||
|
||||
@@ -284,7 +284,7 @@ class UAVControlAgent:
|
||||
# Create LLM instance
|
||||
if llm_provider == "anthropic-compatible":
|
||||
kwargs = {
|
||||
"model_name": llm_model,
|
||||
"model": llm_model,
|
||||
"temperature": temperature,
|
||||
"api_key": llm_api_key,
|
||||
"base_url": final_base_url
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user