马卡尼是一个开发商业规模机载风力涡轮机的项目,最终将在挪威海岸外进行马卡尼M600的飞行测试。所有的Makani软件现在都是开源的。该存储库包含正在运行的马卡尼飞行模拟器、控制器(自动驾驶)、可视化工具和指挥中心飞行监控工具。此外,由于删除了一些第三方专有代码,几乎所有的航空电子固件也包括在内,尽管可能不处于可构建状态。我们希望这段代码能对风筝风能和更广泛的社区有所启发和帮助。
分析-其他分析脚本。这里最重要的文件是Analysis/Control/Crosswind.py和analysis/control/generate_hover_controllers.m,,前者为横风内环控制器生成增益,后者为悬停控制器生成增益。
航空电子设备-绞车、地面站、马达、网络、伺服、电池、网络开关、GPS、频闪灯等的固件。
CONFIG-基于Python的配置系统生成指定所有系统、控制器和模拟参数的JSON指令。这在编译时被转换成只读的C结构。
VIS-基于OpenGL的可视化工具,用于描述系统在模拟和真实飞行期间的状态。
此代码库最初设计为在运行Debian StretchDistribution的Linux系统上运行。为了方便未来的用户,我们在发布此开源版本时附带了一个脚本,可以在Docker中创建必要的环境。
我们已经在一些Linux系统上测试了Docker解决方案。我们也在macOS上对其进行了测试,但是由于libGL的一个问题,我们无法运行可视化工具(其余的模拟软件都可以运行)。
此命令将打开可视化工具。如果在本地运行或在虚拟机上运行,并且安装了Chrome,Web监视器应该会自动打开。如果没有,请在浏览器上打开http:///localhost:8000。
控制遥测用户指南,作为PDF包含在此分发中,给出了日志文件数据结构的完整描述。下面是如何使用Python或MATLAB加载和绘制日志数据的示例。
下面是一个小示例,展示了如何用Python加载h5日志文件并绘制变量(在本例中是风筝的高度)。通过启用遥测字段的制表符完成,访问日志文件变得轻松得多;说明位于lib/python/IPython_Completer.py中。
此外,通过使用bazel-bin/lib/bazel/pyembed IPython启动Python,您将能够直接从Python访问一些Makani库函数(如DcmToAngel)。
您还可以根据需要使用.Items()或.key()和.dtype浏览字段名称:
原木。Key()#显示[u';Bad_Packets';,u';Messages';,u';Parameters';]日志[‘Messages’]。Key()#显示[u‘kAioNodeBattA';,…。]#h5文件中的该类型消息数:LOG[';messages/kAioNodeBattA/kMessageTypeSlowStatus';].。Len()#第一条消息:LOG[';messages/kAioNodeBattA/kMessageTypeSlowStatus';][0]#嵌套字段名:LOG[';messages/kAioNodeBattA/kMessageTypeSlowStatus';][0]。Dtype`。
下面是一个小示例,展示了在MATLAB中加载h5日志文件并绘制变量(在本例中是风筝的高度)的三种方法。
使用MATLAB内置函数将特定遥测数据集加载到工作区的快速方法。
将整个遥测加载到工作区的较慢方式。注:此方法仅适用于MATLAB 2016a及更早版本。通过在控制台上运行“ver”找到您的MATLAB版本。您需要将Makani存储库加载到您的计算机上。
两全其美!一种懒惰的快速加载所有数据集的方式。您需要将Makani存储库加载到您的计算机上。
现在,通过在MATLAB控制台中运行以下命令,打开H5绘图仪(用于打开和绘制H5日志数据的GUI界面):
使用右上角的“选择”按钮加载H5日志文件。加载文件后,数据集将出现在“AIO节点”面板框中。单击这些节点中的一个或多个以访问“AIO Messages”面板框中的相应数据集。仅显示所有选定AIO节点共有的数据集。
一旦您在‘AIO Messages’面板框中选择了要绘制的数据,就可以使用右下角的‘Plot’按钮来可视化数据。按住Ctrl或Shift可以选择多个字段,选择树中的一个节点将绘制该节点下包含的所有数据。也可以通过单击鼠标右键导出数据。
备注:您可以在同一时间轴上同时绘制多个数据集。您可以同时绘制的数据集的数量仅受计算机RAM的限制;请慎重考虑这一点。
%读取日志文件。filename=';20161121-142912-flight01_Crosswind.h5';;c=h5read(filename,...';/messages/kAioNodeControllerA/kMessageTypeControlTelemetry';);%获取dcm_g2b矩阵dcm_g2b=c.message.state_est.dcm_g2b.d;%转置dcm_g2b矩阵.dcm_g2B=permute(dcm_g2B,[2 1 3]);%计算欧拉角度。[偏航,俯仰,滚转]=dcm2angle(DCM_G2B,';ZYX&39;);%绘制结果。绘图(c.message.time,滚转*180/pi,';。';,...。C.message.time,音调*180/pi,';。';,...。C.message.time,偏航*180/pi,';。';)图例(';滚动';,';俯仰';,';偏航';)ylim([-180]);设置(gca,';yTick&39;,-180:30:180);网格打开;xlabel(';控制器时间]';);ylabel(';角度[度]';);标题([';飞行姿态(';文件名';)';],';翻译员';,';无';);