1. FPV 无人机模拟视频 OSD 显示内容分类与优先级
1.1 核心飞行数据显示
FPV 无人机的 OSD 系统通常会显示以下核心飞行数据,按照重要性和显示优先级排序:
-
电池信息:
- 电池电压(如 "11.8V")
- 剩余电量百分比(如 "75%")
- 电池图标(自定义字符)
- 低电量警告(闪烁显示)
-
姿态信息:
- 横滚角(Roll)
- 俯仰角(Pitch)
- 姿态指示器(地平线或人工地平线)
-
航向信息:
- 罗盘航向(如 "045°")
- 航点信息(如 "WP1")
- 返航方向指示
-
高度信息:
- 相对高度(如 "+15.2m")
- 绝对高度(如 "128m ASL")
- 高度变化率(如 "+2.3m/s")
-
速度信息:
- 地速(GPS 速度)
- 空速(如果有空气速度传感器)
- 最大速度记录
-
飞行模式:
- 如 "手动"、"自稳"、"GPS 定点"
- 飞行模式图标
-
警报信息:
- 低电量警报
- 信号丢失警报
- 失控保护激活
- 温度过高警报
1.2 显示内容布局设计
典型的 FPV OSD 布局设计:
plaintext
┌─────────────────────────────────┐
│ 电池: 11.8V (75%) 高度: +25m │
│ 飞行模式: 自稳 速度: 12m/s │
├─────────────────────────────────┤
│ │
│ ┌───────┐ │
│ │ 045° │ │
│ └───────┘ │
│ ▲ │
│ │ │
│ │ │
│ ┴ │
│ │
│ 横滚: -5° 俯仰: +3° │
└─────────────────────────────────┘
2. 姿态信息显示实现
2.1 姿态数据获取与处理
姿态数据通常从飞控的 IMU (惯性测量单元) 获取,包括加速度计和陀螺仪数据。以下是姿态数据处理的核心代码:
c
运行
// 姿态数据结构体
typedef struct {
float roll; // 横滚角,单位:度
float pitch; // 俯仰角,单位:度
float yaw; // 偏航角,单位:度
uint32_t timestamp; // 时间戳
} AttitudeData;
// 从飞控获取姿态数据
bool get_attitude_data(AttitudeData *attitude) {
// 实际应用中,这里会通过串口或SPI从飞控读取数据
// 简化示例,假设数据已经通过某种方式接收并存储
// 从共享内存或缓冲区读取姿态数据
static float fake_roll = 0.0f;
static float fake_pitch = 0.0f;
static float fake_yaw = 0.0f;
// 模拟姿态数据变化
fake_roll += 0.5f;
if (fake_roll > 30.0f) fake_roll = -30.0f;
fake_pitch += 0.3f;
if (fake_pitch > 20.0f) fake_pitch = -20.0f;
fake_yaw += 1.0f;
if (fake_yaw >= 360.0f) fake_yaw -= 360.0f;
// 填充姿态数据
attitude->roll = fake_roll;
attitude->pitch = fake_pitch;
attitude->yaw = fake_yaw;
attitude->timestamp = get_system_time();
return true;
}
// 格式化姿态数据为字符串
void format_attitude_string(char *buffer, AttitudeData *attitude) {
// 格式化横滚角
char roll_str[10];
if (attitude->roll >= 0) {
sprintf(roll_str, "+%.1f°", attitude->roll);
} else {
sprintf(roll_str, "%.1f°", attitude->roll);
}
// 格式化俯仰角
char pitch_str[10];
if (attitude->pitch >= 0) {
sprintf(pitch_str, "+%.1f°", attitude->pitch);
} else {
sprintf(pitch_str, "%.1f°", attitude->pitch);
}
// 格式化完整字符串
sprintf(buffer, "R:%-6s P:%-6s Y:%3.0f°", roll_str, pitch_str, attitude->yaw);
}
2.2 姿态指示器实现
姿态指示器 (人工地平线) 是 FPV OSD 中最重要的显示元素之一,用于直观显示飞机相对于地平线的姿态。
c
运行
// 创建姿态指示器自定义字符
bool create_attitude_indicator_chars(void) {
// 定义地平线字符点阵
const uint8_t horizon_bitmap[8] = {
0b00000000, // ........
0b00000000, // ........
0b00000000, // ........
0b11111111, // ********
0b11111111, // ********
0b00000000, // ........
0b00000000, // ........
0b00000000 // ........
};
// 定义飞机符号字符点阵
const uint8_t aircraft_bitmap[8] = {
0b00010000, // ...*....
0b00010000, // ...*....
0b00111000, // ..***...
0b01111100, // .*****..
0b11111110, // *******.
0b00111000, // ..***...
0b00010000, // ...*....
0b00000000 // ........
};
// 创建自定义字符
if (!at7456e_create_custom_char(0xF8, horizon_bitmap)) return false;
if (!at7456e_create_custom_char(0xF9, aircraft_bitmap)) return false;
return true;
}
// 显示姿态指示器
bool display_attitude_indicator(AttitudeData *attitude) {
// 清除之前的显示
for (uint8_t row = 2