当前位置: 首页 > article >正文

AirSim/Cosys-AirSim 游戏开发(四)外部固定位置监控相机

这个博客介绍了如何通过 settings.json 文件添加一个无人机外的 固定位置监控相机,因为在使用过程中发现 Airsim 对外部监控相机的描述模糊,而 Cosys-Airsim 在官方文档中没有提供外部监控相机设置,最后在源码示例中找到了,所以感觉有必要记录下。

  • AirSim 官方文档:https://microsoft.github.io/AirSim/
  • Cosys-AirSim 官方文档:https://cosys-lab.github.io/Cosys-AirSim/

【Note】:AirSim 和 Cosys-AirSim 在外部相机配置和使用方面有较大差异,如果你用的是较新的 AirSim 版本发现原生的配置方案没有生效建议试下 Cosys-AirSim 的配置方案,这两个在大多数情况下是兼容 settings.json 文件的。


1. Cosys-AirSim 配置方案

文档溯源

对于 Cosys-AirSim 而言配置外部固定位置监控相机主要参考下面的官方文档:

  • Cosys-AirSim Settings Doc:https://cosys-lab.github.io/Cosys-AirSim/settings/

和原生 AirSim 不同,Cosys-AirSim 将外部相机定义为载具的一个对象,只不过可以通过设置标签来固定相机,我感觉这么做的一个原因是 API 中获取相机图片的接口需要传入一个载具名。

但当你打开链接后找到原生 AirSim 中对应位置的示例 settings 后实际上看不到有关外部相机配置的描述,同时搜索 ExternalCamera 也返回的是无结果。

在这里插入图片描述

实际上你需要返回链接的最上方找到 Cosys-AirSim Settings 标签中 settings_example.json 链接并打开:

  • settings_example.json 文件:https://cosys-lab.github.io/Cosys-AirSim/settings_example.json
    在这里插入图片描述

打开链接后找到 Vehicles 字段中的 Cameras 属性就可以发现控制相机是内部相机还是外部相机的标签为 ExternalExternalLocal

在这里插入图片描述

那么最精简的配置格式如下:

{"ClockSpeed": 1,"SeeDocsAt": "https://github.com/Microsoft/AirSim/blob/master/docs/settings.md","SettingsVersion": 1.2,"SimMode": "Multirotor","ViewMode": "SpringArmChase","Vehicles": {"drone_1": {"Cameras": {"fpv_cam": {// ...},"FixedCamera": {"External": true,           // 外部标志位"ExternalLocal": true,      // 外部标志位// ...}},"Pitch": 0.0, "Roll": 0.0, "Yaw": 0.0,"VehicleType": "SimpleFlight","X": 0.0, "Y": 0.0, "Z": 0.0}},"SubWindows": [{"WindowID": 0,"ImageType": 0,"CameraName": "fpv_cam","Visible": true},{"WindowID": 2,"ImageType": 0,"CameraName": "FixedCamera","Visible": true}]
}

配置示例

下面给出一个简单的配置 setting.json 示例,包含一个搭载 1080p 分辨率相机的FPV无人机 + 一个和 4K 分辨率的地面监控相机:

{"ClockSpeed": 1,"SeeDocsAt": "https://github.com/Microsoft/AirSim/blob/master/docs/settings.md","SettingsVersion": 1.2,"SimMode": "Multirotor","ViewMode": "SpringArmChase","Vehicles": {"drone_1": {"Cameras": {"fpv_cam": {"CaptureSettings": [{"FOV_Degrees": 90,"Width": 1080,"Height": 720,"ImageType": 0,"Framerate": 30}],"Pitch": 0.0, "Roll": 0.0, "Yaw": 0.0,"X": 0.4, "Y": 0.0, "Z": 0.0},"FixedCamera": {"Pitch": 30.0, "Roll": 0.0, "Yaw": 0.0,"X": 0.4, "Y": 0.0, "Z": 0.0,"External": true,"ExternalLocal": true,"CaptureSettings": [{"FOV_Degrees": 90,"Width": 4096,"Height": 2048,"ImageType": 0,"Framerate": 30}]}},"Pitch": 0.0, "Roll": 0.0, "Yaw": 0.0,"VehicleType": "SimpleFlight","X": 0.0, "Y": 0.0, "Z": 0.0}},"SubWindows": [{"WindowID": 0,"ImageType": 0,"CameraName": "fpv_cam","Visible": true},{"WindowID": 2,"ImageType": 0,"CameraName": "FixedCamera","Visible": true}]
}

启动程序后控制无人机就可以看见两个子图中的画面存在差异:

在这里插入图片描述


2. AirSim 配置方案

文档溯源

对于原生 AirSim 配置外部固定位置监控相机主要参考的是下面的官方文档:

  • AirSim Settings Doc:https://microsoft.github.io/AirSim/settings/

进入链接后下拉找到 Aviable Settings and Their Defaults 这个标签就可以看到示例 settings.json 内容:

在这里插入图片描述

重点关注示例中的 ExternalCameras 字段,这个字段表示外部相机配置,该字段与 Vehicles 字段是同级的,不能将该字段放在无人机字段下面,去除掉冗余内容后最精简版本如下:

{"ClockSpeed": 1,"SeeDocsAt": "https://github.com/Microsoft/AirSim/blob/master/docs/settings.md","SettingsVersion": 1.2,"SimMode": "Multirotor","ViewMode": "SpringArmChase","Vehicles": {"SimpleFlight": {"Cameras": {"FPVCamera":{   // 机载相机名// ...}}}},"ExternalCameras": {"FixedCamera": {       // 外部监控相机名// ...}},"SubWindows": [{"WindowID": 0,"ImageType": 0,"CameraName": "FPVCamera",  // 机载相机名"Visible": true},{"WindowID": 2,"ImageType": 0,"CameraName": "FixedCamera",    // 外部监控相机名"Visible": true}]
}

配置示例

下面给出一个简单的配置 setting.json 示例,包含一个搭载 1080p 分辨率相机的FPV无人机 + 一个和 4K 分辨率的地面监控相机:

{"ClockSpeed": 1,"SeeDocsAt": "https://github.com/Microsoft/AirSim/blob/master/docs/settings.md","SettingsVersion": 1.2,"SimMode": "Multirotor","ViewMode": "SpringArmChase","Vehicles": {"drone_1": {"Cameras": {"fpv_cam": {"CaptureSettings": [{"FOV_Degrees": 90,"Width": 1080,"Height": 720,"ImageType": 0,"Framerate": 30}],"Pitch": 0.0, "Roll": 0.0, "Yaw": 0.0,"X": 0.4, "Y": 0.0, "Z": 0.0}},"Pitch": 0.0, "Roll": 0.0, "Yaw": 0.0,"VehicleType": "SimpleFlight","X": 0.0, "Y": 0.0, "Z": 0.0}},"ExternalCameras": {"FixedCamera": {"CaptureSettings": [{"FOV_Degrees": 90,"Width": 4096,"Height": 2048,"ImageType": 0,"Framerate": 30}],"Pitch": 30.0, "Roll": 0.0, "Yaw": 0.0,"X": 5.0, "Y": 0.0, "Z": 0.0}},"SubWindows": [{"WindowID": 0,"ImageType": 0,"CameraName": "fpv_cam","Visible": true},{"WindowID": 2,"ImageType": 0,"CameraName": "FixedCamera","Visible": true}]
}

然后运行程序操作手柄就可以看见两个监控子窗中的画面内容存在差异:

在这里插入图片描述

【Note】:如果你开启程序后发现两个子窗口的画面是同步的,并且第二个窗口画面还比较模糊,这是因为 AirSim 版本问题,建议使用上面 Cosys-AirSim 的配置方案重试。

相关文章:

AirSim/Cosys-AirSim 游戏开发(四)外部固定位置监控相机

这个博客介绍了如何通过 settings.json 文件添加一个无人机外的 固定位置监控相机,因为在使用过程中发现 Airsim 对外部监控相机的描述模糊,而 Cosys-Airsim 在官方文档中没有提供外部监控相机设置,最后在源码示例中找到了,所以感…...

现有的 Redis 分布式锁库(如 Redisson)提供了哪些便利?

现有的 Redis 分布式锁库(如 Redisson)相比于开发者自己基于 Redis 命令(如 SETNX, EXPIRE, DEL)手动实现分布式锁,提供了巨大的便利性和健壮性。主要体现在以下几个方面: 原子性保证 (Atomicity)&#xff…...

【Redis】笔记|第8节|大厂高并发缓存架构实战与优化

缓存架构 代码结构 代码详情 功能点: 多级缓存,先查本地缓存,再查Redis,最后才查数据库热点数据重建逻辑使用分布式锁,二次查询更新缓存采用读写锁提升性能采用Redis的发布订阅机制通知所有实例更新本地缓存适用读多…...

C/C++ 中附加包含目录、附加库目录与附加依赖项详解

在 C/C 编程的编译和链接过程中,附加包含目录、附加库目录和附加依赖项是三个至关重要的设置,它们相互配合,确保程序能够正确引用外部资源并顺利构建。虽然在学习过程中,这些概念容易让人混淆,但深入理解它们的作用和联…...

【从零学习JVM|第三篇】类的生命周期(高频面试题)

前言: 在Java编程中,类的生命周期是指类从被加载到内存中开始,到被卸载出内存为止的整个过程。了解类的生命周期对于理解Java程序的运行机制以及性能优化非常重要。本文会深入探寻类的生命周期,让读者对此有深刻印象。 目录 ​…...

Mysql8 忘记密码重置,以及问题解决

1.使用免密登录 找到配置MySQL文件,我的文件路径是/etc/mysql/my.cnf,有的人的是/etc/mysql/mysql.cnf 在里最后加入 skip-grant-tables重启MySQL服务 service mysql restartShutting down MySQL… SUCCESS! Starting MySQL… SUCCESS! 重启成功 2.登…...

C++.OpenGL (20/64)混合(Blending)

混合(Blending) 透明效果核心原理 #mermaid-svg-SWG0UzVfJms7Sm3e {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-SWG0UzVfJms7Sm3e .error-icon{fill:#552222;}#mermaid-svg-SWG0UzVfJms7Sm3e .error-text{fill…...

Linux 中如何提取压缩文件 ?

Linux 是一种流行的开源操作系统,它提供了许多工具来管理、压缩和解压缩文件。压缩文件有助于节省存储空间,使数据传输更快。本指南将向您展示如何在 Linux 中提取不同类型的压缩文件。 1. Unpacking ZIP Files ZIP 文件是非常常见的,要在 …...

纯 Java 项目(非 SpringBoot)集成 Mybatis-Plus 和 Mybatis-Plus-Join

纯 Java 项目(非 SpringBoot)集成 Mybatis-Plus 和 Mybatis-Plus-Join 1、依赖1.1、依赖版本1.2、pom.xml 2、代码2.1、SqlSession 构造器2.2、MybatisPlus代码生成器2.3、获取 config.yml 配置2.3.1、config.yml2.3.2、项目配置类 2.4、ftl 模板2.4.1、…...

Java求职者面试指南:计算机基础与源码原理深度解析

Java求职者面试指南:计算机基础与源码原理深度解析 第一轮提问:基础概念问题 1. 请解释什么是进程和线程的区别? 面试官:进程是程序的一次执行过程,是系统进行资源分配和调度的基本单位;而线程是进程中的…...

Java数值运算常见陷阱与规避方法

整数除法中的舍入问题 问题现象 当开发者预期进行浮点除法却误用整数除法时,会出现小数部分被截断的情况。典型错误模式如下: void process(int value) {double half = value / 2; // 整数除法导致截断// 使用half变量 }此时...

GitFlow 工作模式(详解)

今天再学项目的过程中遇到使用gitflow模式管理代码,因此进行学习并且发布关于gitflow的一些思考 Git与GitFlow模式 我们在写代码的时候通常会进行网上保存,无论是github还是gittee,都是一种基于git去保存代码的形式,这样保存代码…...

AI+无人机如何守护濒危物种?YOLOv8实现95%精准识别

【导读】 野生动物监测在理解和保护生态系统中发挥着至关重要的作用。然而,传统的野生动物观察方法往往耗时耗力、成本高昂且范围有限。无人机的出现为野生动物监测提供了有前景的替代方案,能够实现大范围覆盖并远程采集数据。尽管具备这些优势&#xf…...

MFC 抛体运动模拟:常见问题解决与界面美化

在 MFC 中开发抛体运动模拟程序时,我们常遇到 轨迹残留、无效刷新、视觉单调、物理逻辑瑕疵 等问题。本文将针对这些痛点,详细解析原因并提供解决方案,同时兼顾界面美化,让模拟效果更专业、更高效。 问题一:历史轨迹与小球残影残留 现象 小球运动后,历史位置的 “残影”…...

云原生安全实战:API网关Kong的鉴权与限流详解

🔥「炎码工坊」技术弹药已装填! 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 一、基础概念 1. API网关(API Gateway) API网关是微服务架构中的核心组件,负责统一管理所有API的流量入口。它像一座…...

【C++特殊工具与技术】优化内存分配(一):C++中的内存分配

目录 一、C 内存的基本概念​ 1.1 内存的物理与逻辑结构​ 1.2 C 程序的内存区域划分​ 二、栈内存分配​ 2.1 栈内存的特点​ 2.2 栈内存分配示例​ 三、堆内存分配​ 3.1 new和delete操作符​ 4.2 内存泄漏与悬空指针问题​ 4.3 new和delete的重载​ 四、智能指针…...

vulnyx Blogger writeup

信息收集 arp-scan nmap 获取userFlag 上web看看 一个默认的页面,gobuster扫一下目录 可以看到扫出的目录中得到了一个有价值的目录/wordpress,说明目标所使用的cms是wordpress,访问http://192.168.43.213/wordpress/然后查看源码能看到 这…...

基于IDIG-GAN的小样本电机轴承故障诊断

目录 🔍 核心问题 一、IDIG-GAN模型原理 1. 整体架构 2. 核心创新点 (1) ​梯度归一化(Gradient Normalization)​​ (2) ​判别器梯度间隙正则化(Discriminator Gradient Gap Regularization)​​ (3) ​自注意力机制(Self-Attention)​​ 3. 完整损失函数 二…...

【JVM面试篇】高频八股汇总——类加载和类加载器

目录 1. 讲一下类加载过程? 2. Java创建对象的过程? 3. 对象的生命周期? 4. 类加载器有哪些? 5. 双亲委派模型的作用(好处)? 6. 讲一下类的加载和双亲委派原则? 7. 双亲委派模…...

push [特殊字符] present

push 🆚 present 前言present和dismiss特点代码演示 push和pop特点代码演示 前言 在 iOS 开发中,push 和 present 是两种不同的视图控制器切换方式,它们有着显著的区别。 present和dismiss 特点 在当前控制器上方新建视图层级需要手动调用…...

虚拟电厂发展三大趋势:市场化、技术主导、车网互联

市场化:从政策驱动到多元盈利 政策全面赋能 2025年4月,国家发改委、能源局发布《关于加快推进虚拟电厂发展的指导意见》,首次明确虚拟电厂为“独立市场主体”,提出硬性目标:2027年全国调节能力≥2000万千瓦&#xff0…...

LLMs 系列实操科普(1)

写在前面: 本期内容我们继续 Andrej Karpathy 的《How I use LLMs》讲座内容,原视频时长 ~130 分钟,以实操演示主流的一些 LLMs 的使用,由于涉及到实操,实际上并不适合以文字整理,但还是决定尽量整理一份笔…...

RabbitMQ入门4.1.0版本(基于java、SpringBoot操作)

RabbitMQ 一、RabbitMQ概述 RabbitMQ RabbitMQ最初由LShift和CohesiveFT于2007年开发,后来由Pivotal Software Inc.(现为VMware子公司)接管。RabbitMQ 是一个开源的消息代理和队列服务器,用 Erlang 语言编写。广泛应用于各种分布…...

DingDing机器人群消息推送

文章目录 1 新建机器人2 API文档说明3 代码编写 1 新建机器人 点击群设置 下滑到群管理的机器人,点击进入 添加机器人 选择自定义Webhook服务 点击添加 设置安全设置,详见说明文档 成功后,记录Webhook 2 API文档说明 点击设置说明 查看自…...

[免费]微信小程序问卷调查系统(SpringBoot后端+Vue管理端)【论文+源码+SQL脚本】

大家好,我是java1234_小锋老师,看到一个不错的微信小程序问卷调查系统(SpringBoot后端Vue管理端)【论文源码SQL脚本】,分享下哈。 项目视频演示 【免费】微信小程序问卷调查系统(SpringBoot后端Vue管理端) Java毕业设计_哔哩哔哩_bilibili 项…...

Selenium常用函数介绍

目录 一,元素定位 1.1 cssSeector 1.2 xpath 二,操作测试对象 三,窗口 3.1 案例 3.2 窗口切换 3.3 窗口大小 3.4 屏幕截图 3.5 关闭窗口 四,弹窗 五,等待 六,导航 七,文件上传 …...

在Mathematica中实现Newton-Raphson迭代的收敛时间算法(一般三次多项式)

考察一般的三次多项式,以r为参数: p[z_, r_] : z^3 (r - 1) z - r; roots[r_] : z /. Solve[p[z, r] 0, z]; 此多项式的根为: 尽管看起来这个多项式是特殊的,其实一般的三次多项式都是可以通过线性变换化为这个形式…...

华为OD机考-机房布局

import java.util.*;public class DemoTest5 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseSystem.out.println(solve(in.nextLine()));}}priv…...

莫兰迪高级灰总结计划简约商务通用PPT模版

莫兰迪高级灰总结计划简约商务通用PPT模版,莫兰迪调色板清新简约工作汇报PPT模版,莫兰迪时尚风极简设计PPT模版,大学生毕业论文答辩PPT模版,莫兰迪配色总结计划简约商务通用PPT模版,莫兰迪商务汇报PPT模版,…...

力扣热题100 k个一组反转链表题解

题目: 代码: func reverseKGroup(head *ListNode, k int) *ListNode {cur : headfor i : 0; i < k; i {if cur nil {return head}cur cur.Next}newHead : reverse(head, cur)head.Next reverseKGroup(cur, k)return newHead }func reverse(start, end *ListNode) *ListN…...