网易云课堂:大模型驱动的智能无人机应用开发 - 网易云课堂
(可直接在网易云课堂搜索:大模型驱动的智能无人机应用开发)
1. 无人机sdk封装
-
像人一样操作无人机
使用大模型控制无人机,类似和飞手操作无人机一样,如何让操作更简单,是应用大模型的关键。
-
原始API过于复杂
目前airsim如起飞就要调用多个api函数,主要是从系统稳定性,易用性等方面考虑设计的,但对一个大模型或者飞手而言,可能更需要的是“起飞”这一个操作就行
根据一些研究和实践,一般需要对无人机或者类似的无人装备的sdk进行二次封装,更方便大模型调用,常见的规则如下:
-
接口语义化封装 将底层坐标系转换(如AirSim的z轴负方向)封装在接口内部,对外暴露自然语义(如
fly_to([x,y,正数高度]
)),类似代码中fly_to()
对z值的处理逻辑。 -
功能原子化 每个方法对应独立操作单元(如takeoff/land单独封装),避免复合操作,方便大模型按需调用(类似
set_yaw()
与fly_to
的分离) -
参数标准化 统一使用基础数据类型(list/dict)作为输入输出,如位置统一返回[x,y,z]列表,降低大模型处理复杂度(参见
get_drone_position()
返回值设计) -
异常静默处理 内置重试机制和默认值返回,如
get_position()
中的while循环规避空值,避免调用链路中断 -
物理单位统一 内部统一转换量纲(如弧度转角度),对外始终使用直观单位(如
get_yaw()
返回角度值) -
上下文保持 维持client连接状态(__init__中初始化连接),通过类属性保存会话上下文,确保多指令调用的连续性
-
语义别名映射 建立对象字典(objects_dict)实现自然语言到引擎对象的转换,提升提示词相容性
-
异步转同步 通过.join()将异步操作转为同步(如takeoffAsync().join()),避免大模型处理异步回调的复杂性
-
传感器抽象 对原始传感器数据(如Lidar点云)进行预处理,返回可直接使用的指标数据(
get_distance()
返回最小距离值) -
安全边界设置 在关键操作(如reset)中保持API控制权,通过
enableApiControl
等机制防止失控
建议补充规则:增加方法调用前的前置条件校验(如起飞前检查解锁状态)、返回结构标准化(统一包含success标志位)、增加调试模式开关等,可进一步提升大模型调用可靠性。
一些典型的封装方式如下:
def takeoff(self):
"""
takeoff the drone
"""
self.client.takeoffAsync().join()
def land(self):
"""
land the drone
"""
self.client.landAsync().join()
def get_yaw(self):
"""
get the yaw angle of the drone
:return: yaw_degree, the yaw angle of the drone in degree
"""
orientation_quat = self.client.simGetVehiclePose().orientation
yaw = airsim.to_eularian_angles(orientation_quat)[2] # get the yaw angle
yaw_degree = math.degrees(yaw)
return yaw_degree # return the yaw angle in degree
具体可以参考airsim_wrapper.py代码
后面如果使用专门的框架,则对函数封装形式会有更明确的要求,如:
@tool
def suggest_menu(occasion: str) -> str:
"""
Suggests a menu based on the occasion.
Args:
occasion: The type of occasion for the party.
"""
if occasion == "casual":
return "Pizza, snacks, and drinks."
elif occasion == "formal":
return "3-course dinner with wine and dessert."
elif occasion == "superhero":
return "Buffet with high-energy and healthy food."
else:
return "Custom menu for the butler."
@tool
def get_position(object_name:str)->[float, float, float]:
"""
get the position of a specific object
:param object_name: the name of the object
:return: position, the position of the object
"""
query_string = objects_dict[object_name] + ".*"
object_names_ue = []
while len(object_names_ue) == 0:
object_names_ue = self.client.simListSceneObjects(query_string)
pose = self.client.simGetObjectPose(object_names_ue[0])
return [pose.position.x_val, pose.position.y_val, pose.position.z_val]
2. OpenAI等SDK调用
一、OpenAI Chat SDK 核心特性
OpenAI 提供了多种语言的官方及社区维护的 SDK,支持快速集成 ChatGPT 功能到应用程序中,核心特性包括:
- 多语言支持:覆盖 Python、Java、.NET 等主流开发语言
- 功能完备性:支持聊天补全、函数调用、流式响应等核心 API 功能
- 开发友好性:提供同步/异步接口、预构建请求对象、自动错误重试等机制
OpenAI 标准 Python SDK 的核心功能与参数设置,兼容主流大模型调用场景(如 ChatGPT、GPT-4 等),且参数逻辑可扩展至其他兼容 OpenAI API 的国产大模型:
一、SDK 核心功能与兼容性设计
-
统一接口规范
OpenAI SDK 通过标准化的ChatCompletion.create()
方法提供模型调用,兼容所有遵循 OpenAI 接口规范的服务(如百度文心、智谱清言等国产大模型)。from openai import OpenAI client = OpenAI(api_key="YOUR_KEY", base_url="https://国产模型API地址") # 兼容性关键参数
-
跨模型参数映射
核心参数(如temperature
、max_tokens
)在不同模型中语义一致,仅需调整数值范围即可适配不同模型特性。
二、关键参数设置指南
参数 | 作用 | 推荐值域 | 应用场景 |
---|---|---|---|
model | 指定模型版本(如 gpt-3.5-turbo ) | 模型支持列表 | 控制模型能力与成本 |
temperature | 输出随机性:低值更确定,高值更创意 | 0.2-1.0 | 事实问答(0.2)、创作(0.8) |
max_tokens | 生成文本最大长度(含输入+输出) | 50-4096 | 控制响应篇幅与 API 成本 |
top_p | 核采样阈值:仅从累计概率达标的候选词中采样 | 0.7-0.95 | 平衡多样性与相关性 |
stream | 启用流式响应(逐字输出) | True/False | 提升交互体验 |
presence_penalty | 抑制重复内容(正值抑制,负值允许) | -2.0-2.0 | 避免冗余回答 |
示例:多模型兼容调用
# 调用 GPT-3.5(官方模型)
response = client.chat.completions.create(
model="gpt-3.5-turbo",
messages=[{"role": "user", "content": "解释量子纠缠"}],
temperature=0.5,
max_tokens=500
)
# 调用通义千问(国产模型)
response = client.chat.completions.create(
model="qwen-max",
messages=[{"role": "user", "content": "写一首七言绝句"}],
temperature=0.7,
top_p=0.9
)
三、最佳实践与注意事项
-
参数调优策略
• 组合使用temperature
+top_p
实现精确控制(如temperature=0.8
+top_p=0.9
平衡创意与逻辑) • 通过max_tokens
限制输出长度,避免超出模型上下文限制(如 GPT-3.5 的 4096 tokens) -
异常处理机制
try: response = client.chat.completions.create(...) except openai.APIError as e: print(f"API 错误: {e}") except openai.RateLimitError: print("请求频率超限,请稍后重试")
这里我们以火山方舟的sdk申请为例,其他的都类似: 账号登录-火山引擎
安装openai
!pip install --upgrade "openai>=1.0"
ARK_API_KEY=""
import os
from openai import OpenAI
# 请确保您已将 API Key 存储在环境变量 ARK_API_KEY 中
# 初始化Openai客户端
client = OpenAI(
# 此为默认路径,您可根据业务所在地域进行配置
base_url="https://ark.cn-beijing.volces.com/api/v3",
api_key=ARK_API_KEY,
)
# Non-streaming:
completion = client.chat.completions.create(
model="doubao-1-5-pro-32k-250115",
messages=[
{"role": "user", "content": "常见的无人机模拟仿真系统都有哪些?"},
],
temperature=0.1,
)
print(completion.choices[0].message.content)
大模型给出的回答:
常见的无人机模拟仿真系统可以分为开源和商业两类,以下是一些典型代表:
### 开源模拟仿真系统
- **Gazebo**
- **简介**:一款功能强大的机器人和无人机仿真软件,它能够提供高保真的物理模拟和丰富的传感器模型。可以模拟不同的环境,如室内、室外、山地等,支持多种机器人平台,包括各种类型的无人机。
- **应用场景**:常用于学术研究和开发,例如无人机的路径规划算法测试、传感器融合算法验证等。研究人员可以在Gazebo中创建虚拟环境,对无人机的各种行为进行模拟和分析。
- **FlightGear**
- **简介**:是一个开源的飞行模拟器,它具有高度可定制性和广泛的飞行器模型库。可以模拟各种飞行条件和环境,包括不同的气象条件、地形地貌等。
- **应用场景**:既可以用于无人机飞行控制算法的开发和测试,也可以用于飞行培训。开发者可以利用FlightGear的API接口,将自己的控制算法集成到仿真系统中,对无人机的飞行性能进行评估。
- **JSBSim**
- **简介**:是一个开源的飞行器动力学建模和仿真工具,它提供了详细的飞行器动力学模型,能够准确模拟无人机的飞行力学特性。
- **应用场景**:主要用于无人机飞行控制系统的设计和验证。通过JSBSim,可以对无人机的飞行性能进行精确分析,评估不同控制策略的效果。
### 商业模拟仿真系统
- **MATLAB/Simulink**
- **简介**:MATLAB是一种广泛应用于科学计算和工程领域的软件,Simulink是其可视化建模和仿真工具。它提供了丰富的模块库,包括无人机动力学模型、控制器设计模块等。
- **应用场景**:在无人机控制系统设计、算法开发和性能分析方面具有广泛的应用。工程师可以使用Simulink搭建无人机的仿真模型,对控制算法进行快速验证和优化。
- **X-Plane**
- **简介**:是一款专业的飞行模拟软件,具有高度真实的飞行物理模型和丰富的地形数据。它支持多种类型的飞行器,包括无人机。
- **应用场景**:常用于飞行培训、航空研究和无人机系统的评估。其真实的飞行模拟环境可以让用户体验到接近真实飞行的感觉,对于无人机的飞行性能测试和飞行员培训具有重要价值。
- **AirSim**
- **简介**:是微软开发的一款开源跨平台无人机和汽车仿真器,基于虚幻引擎和Unity引擎构建,提供了逼真的视觉效果和物理模拟。它支持多种传感器模拟,如摄像头、激光雷达等。
- **应用场景**:主要用于无人机的计算机视觉和机器学习算法的开发和测试。开发者可以利用AirSim的丰富传感器数据,训练和验证无人机的自主飞行算法。
role的使用
是OpenAI SDK中消息角色(Role)的对比表格如下,展示了不同角色的核心功能、典型用途及示例:
角色 (Role) | 核心功能 | 典型用途 | 示例 | 引用 |
---|---|---|---|---|
system | 设定AI的行为模式、响应规则及操作限制 | - 定义AI身份(如命令行专家) - 控制输出格式(JSON/自然语言) - 设置安全权限 | {"role": "system", "content": "你需以用户视角判断应执行的命令,当前系统是linux"} | |
user | 传递用户的实际请求或对话输入 | - 单轮直接提问(如“查看文件”) - 多轮追问(如“具体步骤是什么?”) | {"role": "user", "content": "帮我看下当前目录下有没有main.go文件?"} | |
assistant | 存储AI的历史回复内容,用于上下文连贯性维护 | - 多轮对话中提供连贯回答 - 开发者可修改历史回复以修正错误 | {"role": "assistant", "content": "执行命令: ls main.go"} |
补充说明:
-
角色交互规则
• 消息顺序:最后一条必须为user
角色以触发响应,且每次请求需包含完整上下文。 • 动态调整:通过插入新的system
消息可切换AI身份(如从翻译助手变为数据分析师)。 -
性能优化
•system
内容建议简洁(200 tokens内),避免冗余影响模型处理效率。 -
扩展应用
• 结合function calling
功能,可通过system
设定函数调用规则,user
触发请求,assistant
返回结构化参数以执行外部操作(如调用API)。
3. 大模型提示词工程入门
大模型时代的编程==提示词撰写
提示词工程(Prompt Engineering)是一种系统性优化人工智能交互的关键技术,通过设计、调试和优化提示词(Prompt)来精准引导大语言模型(LLM)输出符合预期的结果。目前大部分应用都是通过提示词完成的。以下是其核心要点:
一、定义与核心目标
-
定义
让大模型听懂人话。提示词工程将模糊的用户需求转化为结构化指令,通过控制输入内容来调节模型行为,减少输出的随机性并激发模型潜在能力。其本质是构建“人机协同”的标准化交互流程,而非简单的提问技巧。 -
核心目标
• 对齐意图:将人类需求转化为模型可理解的表达(例如通过角色扮演框架“你是一名资深律师”)。
• 控制输出:通过明确指令(如格式、长度)减少不确定性(例如要求生成Markdown表格);
• 激发能力:解锁模型的推理、创作等高级能力(如用思维链CoT技术引导复杂问题解决);
二、关键技术要素
-
结构化设计
• 模块化构建:将提示拆解为角色、任务、约束等模块(例如“角色+背景+输出要求”框架);
• 参数调节:显式控制模型参数(如temperature
调整输出随机性);
• 多模型协同:复杂任务中调用多模型接力处理(如先用GPT生成文案,再用Stable Diffusion生成配图)。 -
优化方法
• 迭代测试:通过多轮调试优化提示词,类似代码测试流程;
• 领域知识嵌入:在专业场景中注入术语和规范(如法律文件需引用《民法典》条款);
• 上下文管理:动态截断或保留历史对话以平衡Token消耗。
三、应用场景
- 内容创作:生成营销文案、学术报告等结构化内容(如电商直播话术设计需包含价格锚点和互动机制);
- 专业提效:辅助法律合规审查、金融数据分析等需高准确度的任务;
- 跨模态生成:在图像生成中描述风格参数(如“赛博朋克风格,霓虹灯光”)。
适用于函数调用的提示词
大模型控制无人机飞行,其实就是用大模型生成代码,控制无人机飞行,完成各类任务,最简单的方法就是通过提示词完成无人机相关的sdk函数调用。
角色使用
- system角色定义:如数据科学家(仅能调用分析类API)
- user角色权限:提交原始数据请求,调用函数等
函数描述模板
模板1:简单描述
aw.takeoff() - 起飞无人机。
aw.land() - 无人机着陆。
aw.get_drone_position() - 以与 X,Y,Z 坐标相对应的 3 个浮点数的列表形式返回无人机的当前位置。
特点:
• 简单易懂
• 适用于简单的函数调用
模板2:带参数描述
函数名: validate_user_registration 功能: 验证用户注册信息合法性 输入参数: - username: 字符串(长度4-20字符,仅允许字母数字) - password: 字符串(至少包含大写字母、数字和特殊符号) - email: 符合RFC 5322标准的邮箱地址 返回值: - {"status": "success/error", "message": "详细描述"}
特点:
• 参数添加表达式约束
• 返回值结构预定义
大模型函数调用的发展
提示词方式(Prompt)、函数调用方式(Function Call) 和 模型控制协议(MCP) 对比
特性 | 提示词方式(Prompt) | 函数调用方式(Function Call) | 模型控制协议(MCP) |
---|---|---|---|
核心原理 | 通过自然语言描述任务,引导模型生成输出。 | 模型生成 JSON 格式的调用请求,外部工具执行具体操作并返回结果。 | 标准化协议,支持多模型协同、动态任务分配和实时监控。 |
适用场景 | 简单任务(如文本生成、问答、翻译)。 | 复杂任务(如数据库查询、API 调用、计算任务)。 | 多模型协同任务(如文本生成 + 图像生成 + 数据分析)。 |
灵活性 | 高:可通过自然语言自由描述任务。 | 中:任务范围受限于预定义函数。 | 高:支持动态任务分配和多模型协同。 |
可控性 | 低:输出结果可能偏离预期,需多次调试提示词。 | 高:通过结构化参数约束输出,减少模型幻觉。 | 高:通过配置文件定义模型行为和交互规则。 |
开发成本 | 低:无需额外工具,直接通过自然语言交互。 | 高:需预先定义函数并实现逻辑。 | 高:需掌握协议规范并配置工具链。 |
效率 | 低:复杂任务需多次交互,Token 消耗大。 | 高:复杂任务可通过外部工具快速完成。 | 中:多模型协同需更多计算资源。 |
标准化程度 | 低:提示词设计依赖开发者经验。 | 中:需遵循函数调用规范。 | 高:统一接口和配置文件,降低集成难度。 |
示例 | 你是一名翻译,请将以下英文翻译为中文:"Hello, world!" | {"function": "get_weather", "parameters": {"location": "Beijing"}} | models: [{name: gpt-4, role: text_generator}, {name: sd, role: image_generator}] |
优点 | 灵活性强,开发成本低。 | 可控性强,效率高。 | 扩展性强,标准化程度高。 |
缺点 | 可控性差,效率低。 | 开发成本高,灵活性低。 | 复杂度高,资源消耗大。 |
未来优化方向 | 结合强化学习自动生成高效提示词。 | 支持动态函数注册和实时更新。 | 更多厂商和开发者加入协议生态。 |
无人机控制system角色
提示词描述如下:
你是一个帮助我使用AirSim无人机模拟器的助手。
当我要求你做某事时,你需要提供实现该任务所需的Python代码(仅使用AirSim和相关函数),并解释代码的功能。
你只能使用我已经定义的函数,不能假设或使用任何你认为可能存在的其他函数。
你可以使用简单的Python库函数,例如`math`和`numpy`。
回复均按照如下格式:
```python
aw.land()
此代码功能为无人起飞
函数描述
以下是您可以用来命令无人机的一些功能。
aw.takeoff() - 起飞无人机。
aw.land() - 无人机着陆。
ARK_API_KEY=""
import os
from openai import OpenAI
# 请确保您已将 API Key 存储在环境变量 ARK_API_KEY 中
# 初始化Openai客户端
client = OpenAI(
# 此为默认路径,您可根据业务所在地域进行配置
base_url="https://ark.cn-beijing.volces.com/api/v3",
api_key=ARK_API_KEY,
)
chat_history = []
def chat(prompt, chat_history):
chat_history.append(
{
"role": "user",
"content": prompt,
}
)
completion = client.chat.completions.create(
model="doubao-1-5-pro-32k-250115",
messages=chat_history, #chat_history[-10:0]
temperature=0.1,
)
content = completion.choices[0].message.content
# 加入机器人回复,相当于保存全部的历史记录,多轮对话
chat_history.append(
{
"role": "assistant",
"content": content,
}
)
return content
SYS_MSG="""
你是一个帮助我使用AirSim无人机模拟器的助手。
当我要求你做某事时,你需要提供实现该任务所需的Python代码(仅使用AirSim和相关函数),并解释代码的功能。
你只能使用我已经定义的函数,不能假设或使用任何你认为可能存在的其他函数。
你可以使用简单的Python库函数,例如`math`和`numpy`。
"""
chat_history.append(
{
"role": "system",
"content": SYS_MSG,
}
)
knowledge_prompt="""
以下是您可以用来命令无人机的一些功能。
aw.takeoff() - 起飞无人机。
aw.land() - 无人机着陆。
回复均按照如下格式:
```python
i=1#这里输出python代码
```
此代码功能为赋值
你无需考虑aw的import问题,在环境中已经声明
"""
ret = chat(knowledge_prompt, chat_history)
ret
结果返回:
'### 起飞无人机\n```python\naw.takeoff()\n```\n此代码功能为调用`aw`对象的`takeoff`方法,使无人机起飞。\n\n### 无人机着陆\n```python\naw.land()\n```\n此代码功能为调用`aw`对象的`land`方法,使无人机着陆。'
chat_history
[{'role': 'system',
'content': '\n你是一个帮助我使用AirSim无人机模拟器的助手。 \n当我要求你做某事时,你需要提供实现该任务所需的Python代码(仅使用AirSim和相关函数),并解释代码的功能。 \n你只能使用我已经定义的函数,不能假设或使用任何你认为可能存在的其他函数。 \n你可以使用简单的Python库函数,例如`math`和`numpy`。\n'},
{'role': 'user',
'content': '\n以下是您可以用来命令无人机的一些功能。\n\naw.takeoff() - 起飞无人机。\naw.land() - 无人机着陆。\n\n回复均按照如下格式:\n```python\ni=1#这里输出python代码\n```\n此代码功能为赋值\n\n你无需考虑aw的import问题,在环境中已经声明\n\n'},
{'role': 'assistant',
'content': '### 起飞无人机\n```python\naw.takeoff()\n```\n此代码功能为调用`aw`对象的`takeoff`方法,使无人机起飞。\n\n### 无人机着陆\n```python\naw.land()\n```\n此代码功能为调用`aw`对象的`land`方法,使无人机着陆。'}]
4. 课程资源
项目github:GitHub - maris205/airsim_agent
项目huggingface:dnagpt/airsim_agent · Hugging Face
网易云课堂:大模型驱动的智能无人机应用开发 - 网易云课堂
(直接在网易云课堂搜索:大模型驱动的智能无人机应用开发,即可获取所有项目资源和专属答疑,实时更新)