这块飞控是辰星引力的第一块飞控,也是我开发过的第一块飞控,由于两天前的发射出现了意外(具体报告见辰星梦人随后发的文),未收集到数据,再加上现在看它也有相当大的局限性(后续会讲明),所以我认为没有写成教程的必要(正在开发第二代飞控,如果顺利以后会做成教程)。但是我看了开源在论坛的飞控,我觉得本飞控在导航算法、开伞判断、和整体的工作流程上还是有一些优势的,所以我把它开源了,并讲解我认为有意义的部分。这整个飞控可能用处有限,但我相信这几个关键部分的代码是有意义的,可以给其他探空火箭飞控开发者参考。
在一切之前,我先讲下这个飞控的优缺点。
优点:
1.使用组合导航,即使用惯性导航、卫星导航、气压定高、磁场定向组合,能给出精度和实时性都不错的姿态速度位置等数据
2.组合导航使用了简化的kalman滤波(我还在学……这次就相当于蒙了那个K,下一代肯定上完整的),姿态使用的imu自带kalman滤波算法,比起使用mahony融合算法和dmp解算的传感器更加适用于探空火箭这种高动态场景。
3.惯性导航部分考虑了旋转效应补偿和划桨效应补偿,在高动态场景下有很大优势。
4.用tf卡记录了几乎所有能记录的数据。
5.飞控实时发回姿态、加速度、角速度、速度、位置数据,还配备上位机实时显示。
6.工作流程友好,由上位机向飞控发出开始信号,以防误启动。
7.开伞逻辑判断好,由火箭真实速度z轴分量向下开伞,能保证越过最高点后才开伞。
8.使用pcb板加模块化处理,焊接方便。
9.使用stm32f103c8t6单片机,外设足够,且能应付快速计算的工作。
缺点:
1.体积和重量过大,最终外径带盒子达到了102mm,重量超过了300g,严重限制了它在探空火箭上的应用,这次搭载他的探空火箭直径110mm,高1.4m。(这里说明下,安全是没有问题的,我们为了安全性做了很多处理,具体见辰星梦人随后发的文)
2.直接使用内置闭源算法的imu,这些不在我们的掌控范围内,无法做误差分析等事情。
3.使用的imu是jy901b,虽然有维特智能的算法,但其核心仍是mpu9250,mpu9250的惯性部分又是mpu6500,这和常用的mpu6050几乎一样,包括零偏不稳定性,每次上电零偏不确定性,非正交性和非线性性等各种误差是极其巨大的……所以其精度仍然没有特别大的提升,动态姿态角误差实际上能到3°,惯性导航更是会迅速发散,必须引入卫星导航和气压数据进行组合才能稳定。而开伞依赖的z方向数据恰恰是唯一无法修正的(低成本卫星导航不会提供z轴速度,气压差分出的z轴速度反而不可靠),不过在探空火箭这种轨迹相对简单的情形下问题不大,不过下一代我会尝试解决。但是imu暂时不考虑升级。因为这款imu内置的算法还是很香的。
4.使用stm32f103c8t6单片机。对这也是缺点,f1系列仍然不够,不管是外设还是算力,一块单片机完全不能完成惯导解算,组合导航,数据记录,无线通讯等功能,所以我用了两块。而且如果看过我专栏的朋友应该知道我是先打算纯惯导搞出一块板子,后面打算搞组合导航再搞另一块板子的……这是它体积爆炸的原因……下一代会用一块stm32f407vet6的。
5.使用模块化。额……对,这也是缺点,不使用模块化能大大减小体积……但是这个可能会有不同观点吧,我觉得这样画板子焊板子调板子都会耗时巨大,不方便迭代,下次还是模块化的。
6.单片机间通讯效率低,我想用简单的通讯,串口又耗完了,所以我搞出了个很大的方向错误,算惯导那块单片机串口发数据,然后tf卡模块收数据,同时引出线导向另一块单片机……而且为了tf卡上数据方便可读,用的还是数据转ascii再转回数据,浪费了大量算力在这……总之……大家知道这有问题就行了……下次不会这么搞了……
7.轻信商家……我真以为某多多上的那种无线数传板子能传1100m,实测开阔处最大70m,一般50m就断了……还用了spi,其他商品化数传电台都是串口通信的,后续改都没法改了……而且它还会莫名其妙断掉,我也不知道为什么,只能说下一代不用它了……
8.焊接问题。额……这个不是飞控的问题,我手残……有几个焊点虚焊了,导致算组合导航那块板无法向算惯导那块板发信息,这导致惯导解算不能定时开始……(不过由于imu精度低这个纯惯导数据一般没什么看的必要,而且不参与开伞的判断)还有卫星导航数据组合导航数据没法写入tf卡……
9.功能单一,内置的功能只有火工开伞……什么机械开伞、PID调姿态都要外接一块板子,根据这个飞控传出的数据判断……
10.开伞判断单一,虽然保证能在过最高点后开伞,但是可能对个别情况比如飞得实在太偏要提前开伞的,这些没有考虑,不过这个好改。
11.使用vscode开发。怎么说吧,这个还是人数相对少的吧……一般嵌入式都用keil。vscode它功能丰富,但的确没有keil好上手,我也是我们那个社团要求才学的,不过学了后发现的确比keil好用(虽然我也没有完全搞明白,我只是会用来写代码和烧录……)。不过呢,毕竟我还是觉得整个飞控可能局限性太大,只是其部分算法有意义,如果只是参考核心代码来改自己的飞控的话,应该没啥问题。
12.上位机还是较为简陋的,没有兼容飞控的不同安装方向,不过问题只是显示的3d姿态看上去比较抽象(
好了,优缺点都讲完了。如果觉得这台飞控的优点有价值,缺点能接受的话就请往下看吧。
现在简要介绍下这个飞控的构成,分为三块板子:
1.惯导部分,用于读取解算惯性数据,读取气压磁场等环境数据,记录并串口发送。
2.飞控主板,接收惯导部分的数据与卫星导航模块数据,记录并串口发送,同时无线电发回数据,判断火箭工作状态,执行火工开伞。
3.地面站部分,接收飞控主板发回的数据,添加包头与和检验包尾发给电脑。
接下来介绍飞控的工作流程:
先说下飞控发回的状态:SYSTEM_START/SELFTEST_PASS/MISSION_START/LAUNCH/PARACHUTE_DEPLOY/LANDING
这些状态是我自己定义的,我的确没有说清楚,感谢大佬提醒。这些状态的解释如下:
SYSTEM_START:系统开始工作,这是上电后一定会发的。
SELFTEST_PASS:通过自检,只有判断静止条件下,寻星成功,通讯连接成功才能通过自检。
MISSION_START:这是飞控安装好后,接收到地面站信息开始解算数据后发回的标志,此后开始进行数据解算,并检测发射。
(好吧这个名字确实没取好……)
后面三个就是字面的。
LAUNCH:发射
PARACHUTE_DEPLOY:开伞
LANDING:着陆
1.等待GPS寻星。
2.静止飞控,再次点飞控主板的复位,自检。每次上电或复位,飞控都会发回SYSTEM_START,如果自检通过则再发SELFTEST_PASS。
3.把飞控装进火箭,立好火箭。
4.在掩体后用上位机发送任务开始指令,飞控收到后会发回MISSION_START,从此开始解算组合导航数据。由于焊接问题,之前说了,没办法让纯惯导解算也现在开始……当然稍微改下完全可以做到。这里由于惯导数据已经开始漂了,所以用差分惯导解算的速度来获取速度增量,这样比起直接对测得的加速度(也就是比力)乘dt后积分能补偿旋转效应和划桨效应误差。
5.点火!同时飞控靠检测测得加速度大小超过1.2g来判断发射,并发回LAUNCH。
6.为了防止发射时出现震动导致误开伞,飞控会判断经过500ms才会考虑开伞。
7.经过最高点,vz开始小于零,飞控判断开伞,发回PARACHUTE_DEPLOY。发射前地面测试时非常完美的,不过没有录像……发射又因为很抽象的事情失败了……所以这里没有视频……要用的记得自己实验下。
8.着陆,飞控检测到火箭角速度小于某阈值及加速度与重力加速度的差小于某阈值判断着陆,发回LANDING。
好了,说了这么多,现在直接把工程发上来。
然后介绍飞控的名字,SS0,来自银之星的缩写(
好的,接下来我直接上工程。
先硬件(我每个板子都上原理图、pcb图和制板文件和立创工程吧)
抱歉原理图画的有点史(
首先是惯导那块板子。
![惯性导航_原理图.png]()
(仅参考,具体看制板文件,唯一要注意的是JY901b有磁场传感器,下面不要铺铜)
Gerber_PCB_惯性导航_2025-10-30.zip41.31KBZIP20次下载
惯性导航_819392797fbf49a191e2045931067979.zip70.83KBZIP9次下载
接下来是飞控主板。
![飞控主板_原理图.png]()
![飞控主板_PCB.png]()
Gerber_PCB_飞控主板_2025-12-29.zip41.34KBZIP11次下载
飞控主板_048036311dca4c3fb1db2584ec4c8d9b.zip82.69KBZIP10次下载
接下来是飞控地面站。
![飞控地面站_原理图.png]()
![飞控地面站_PCB.png]()
Gerber_PCB_飞控地面站_2025-12-30.zip22.42KBZIP10次下载
飞控地面站_345a923096c84d2ab9aadc3bbd23f813.zip38.54KBZIP15次下载
接下来的是飞控的外壳,这是辰星梦人画的。
航电.stl142.07KBSTL12次下载预览
![image.png]()
大概长这样。
不过由于之前说过的体积和重量过大的局限性,直接抄板和这个模型我是不推荐的,不过我还是发上来先,也是直观地说明为什么体积局限性这么大……下次我一定会减到直径50mm内的(
给各位看下实际图
![IMG_20260129_174606_edit_432096460136729.jpg]()
![DSCN4107.jpg]()
上图是没有装进盒子的,下图装了。还装了信号放大器备用遥控开伞器,遥控蜂鸣器,外置GPS等等。可见它的体积(
当时时间紧,打印机好像又出问题不能打螺纹,所以都是用热熔胶固定的……而且开始我没有设计好位置……这个是反面教材,插电池都困难。建议硬件看看得了
ok现在开始软件部分。
惯导的zip文件与gitee仓库(对不起我创建的时候以为是INSS,惯导缩写实际上是INS,但是我不太会改,因为那个cubemx和git和文件名有点关系……)
INSS0.zip420.06MBZIP11次下载
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
飞控主板的zip文件与gitee仓库(对不起这个l要双写……是controller以后注意……)
Flight_Controler0.zip2.06MBZIP3次下载
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
地面站的zip文件与gitee仓库(对不起忘记大写了……)
ground_station0.zip1.78MBZIP3次下载
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
以上烧进对应的单片机即可。
接下来是上位机。这里声明下,这个上位机几乎都是由GPT开发的,我只负责提供思路、调试和最后的小改。所以文章我会打上ai的标签,不过放心这是检查过的,没有问题。
如果有装python,就用这个,要放在一个目录下,运行ground_XXXXXXXXXX。
fc_decoder.py4.57KBPY2次下载
ground_station.py9.44KBPY2次下载
如果没有装python可以用这个
ground_station.exe109.82MBEXE18次下载
然后简单说下,打开后这个是界面。
![image.png]()
最上面是串口配置,波特率230400不要改,串口可以根据你插的口填,好吧我忘记搞自动检测了(
然后点击连接就行。
左边的是火箭姿态的3d图,不过是jy901b屏蔽罩那一面竖直向上才是对的……其他安装方法要改下代码()当然不改问题也不大,只是看着有点难受(
右边上面是当前的数据,从上到下就是欧拉角(°),加速度(m/s^2),角速度(rad/s),速度(m/s),位置(m),最下面的飞控状态就是前面说的SYSTEM_START/SELFTEST_PASS/MISSION_START/LAUNCH/PARACHUTE_DEPLOY/LANDING那些。
右边下面就是实时曲线图。
最后给下维特智能的上位机,用于JY901b的磁场校准(惯导那块板子我留了一个串口用于磁场校准),可以在维特智能官网下载,这里直接给zip文件了。
Witmotion(V2025.10.22.0).zip130.62MBZIP4次下载
这里给下工作的视频。(我之前地面实验基本没有录制视频,想着火箭发射的视频与数据就足够了,没想到遇到了如此抽象的意外
,所以工作的视频只能看这个了……这个视频是我在聊天记录中翻出来的,而且还正在开发中,界面少了那个任务开始按钮,不过其他都差不多……)
805c6b04481375666892679224c7f044.mp4 点击下载
对了说明几件事。首先那个3d图是东北天坐标系的,所以视频里会看起来偏转方向不同。其次这个飞控因为要连接GPS,所以不能在室内用,无法通过自检,视频中我改了代码,把GPS部分注释掉了。(探空火箭都是在室外发射的,这里我觉得没有必要兼容无GPS的状况,当然如果有需要可以自己把自检部分的GPS那块注释掉,其他不用动,组合导航算法中有自动检测,GPS精度低或无信号就不融合它)
解压后运行WitMotion.exe即可,然后可以看这个视频校准。XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
加速度校准不做其实没问题,毕竟低端MEMS,用厂家出厂的校准也可以,不过我还是象征意义上校准了的。如果要的话可以用我的程序,在前面INSS.zip里面有,用法可以看这篇数据校准。
好了开源部分写完了,可以用的,不过部分重要的代码我还是在回复中贴出来,首先是太长了,其次是方便我后续加。
感谢管理员的提醒,我新增了实测的视频,电路板工程文件等内容。另外我这几天也不忙,那我在回复里慢慢更新(明天内更晚)原理,架构,算法等内容,把文章往教程方面写一下。
我的计划就是先讲下模块的选用,然后是算法。
算法就是把我学习《捷联惯导算法与组合导航原理》的笔记发出来,但是只发结果部分内容,因为推导实在过于冗长,那还不如直接看书,这样只发结果还是便于了解与遗忘时的复习的。然后由于我也正在学习,再加上低成本MEMS不用考虑地球形状与自转,所以我发出的时简化版本,也更加适用于探空火箭的飞控开发。
至于架构与原理部分我就在算法更完后讲讲代码的整体逻辑以及外设的使用吧,当然因为之前我说过的串口通信方面的设计错误,这些可能有些有价值,有些就当反面教材看了(