Basilisk学习笔记(1)--架构

一、这玩意本质就是个架构

1、学习路径

原来以为安装完了就应该猛砍example,后来发现应该先看基本概念。我看另一个洪同学的blog也是从这开始的,https://hanspeterschaub.info/basilisk/Learn.html

2、结构理解

代码还是官网里Basilisk常常简称叫BSK,(就像模拟航天器的飞行软件Flight Software常常叫FSW)所以BSK框架中相当于有四个核心概念之间的关系:

1)层级包含关系:场景→进程→任务→模块
2)组合实现关系:模块组合成任务,任务组合成进程,进程组合成场景
3)控制流与数据流:上层组件控制下层组件,下层组件向上层反馈数据和状态

4)允许1:N关系,还允许一个模块也可以挂多个进程,相当于N:M

(原来自己画了一个图不好,还不如改成官方例子最能说明这种“返向关联”)

#
#  ISC License
#
#  Copyright (c) 2021, Autonomous Vehicle Systems Lab, University of Colorado at Boulder
#
#  Permission to use, copy, modify, and/or distribute this software for any
#  purpose with or without fee is hereby granted, provided that the above
#  copyright notice and this permission notice appear in all copies.
#
#  THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
#  WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
#  MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
#  ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
#  WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
#  ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
#  OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
#

from Basilisk.moduleTemplates import cModuleTemplate
from Basilisk.utilities import SimulationBaseClass
from Basilisk.utilities import macros


def run():
    """
    Controlling the simulation time
    """

    #  Create a sim module as an empty container
    scSim = SimulationBaseClass.SimBaseClass()

    #  create the simulation process
    dynProcess = scSim.CreateNewProcess("dynamicsProcess")
    fswProcess = scSim.CreateNewProcess("fswProcess", 10)

    # create the dynamics task and specify the integration update time
    fswProcess.addTask(scSim.CreateNewTask("fswTask1", macros.sec2nano(1.)))
    fswProcess.addTask(scSim.CreateNewTask("fswTask2", macros.sec2nano(2.)))
    fswProcess.addTask(scSim.CreateNewTask("fswTask3", macros.sec2nano(3.)), 10)
    
    dynProcess.addTask(scSim.CreateNewTask("dynamicsTask1", macros.sec2nano(2.)))
    dynProcess.addTask(scSim.CreateNewTask("dynamicsTask2", macros.sec2nano(5.)), 10)
    dynProcess.addTask(scSim.CreateNewTask("dynamicsTask3", macros.sec2nano(10.)))

    # create modules
    mod1 = cModuleTemplate.cModuleTemplate()
    mod1.ModelTag = "cModule1"

    mod2 = cModuleTemplate.cModuleTemplate()
    mod2.ModelTag = "cModule2"

    # add modules to various task lists
    scSim.AddModelToTask("dynamicsTask1", mod1, 4)
    scSim.AddModelToTask("dynamicsTask1", mod2, 5)
    scSim.AddModelToTask("dynamicsTask2", mod2)
    scSim.AddModelToTask("dynamicsTask2", mod1)
    scSim.AddModelToTask("dynamicsTask3", mod1)
    scSim.AddModelToTask("dynamicsTask3", mod2)

    scSim.AddModelToTask("fswTask1", mod1)
    scSim.AddModelToTask("fswTask1", mod2, 2)
    scSim.AddModelToTask("fswTask2", mod2)
    scSim.AddModelToTask("fswTask2", mod1)
    scSim.AddModelToTask("fswTask3", mod1)
    scSim.AddModelToTask("fswTask3", mod2)



    scSim.InitializeSimulation()
    scSim.ConfigureStopTime(macros.sec2nano(30.0))
    scSim.ExecuteSimulation()
    # print to the terminal window the execution order of the processes, task lists and modules
    scSim.ShowExecutionOrder()
    # uncomment this code to show the execution order figure and save it off
    fig = scSim.ShowExecutionFigure(True)
    fig.savefig("qs-bsk-2b-order.svg", transparent=True, bbox_inches = 'tight', pad_inches = 0)

    return


if __name__ == "__main__":
    run()

还能把这个结构输出成fig = scSim.ShowExecutionFigure(True)

5)目的是通过该自己一系列的组合形成一个特定的仿真场景

模块Module之间就需要传递消息,根据模块功能不同,我看官网分了好几个小例子可以又搞出很多种组合,非常热闹。关键是那些小功能是为了实现我们自己的某种仿真场景,本质上具体实现功能结构还是要自己写的。只是用了BSK这个框架,比自己又要想MQ的问题啊,又要想最后结果显示的问题啊要方便。而且有了这个框架组织,可以几个同学按功能分一分模块,分头做,一起测。

二、其他感受

1、本质是一个框架

与其说BSK是一个仿真软件,不如说其实是一个仿真框架。用来验证飞控软件策略啊,小汽车自动驾驶算法啊,什么的都可以。就像Spring那种交手架,随机附赠的example例子是给了一些module,但还是那句话,本质上这BSK是个仿真框架,验证小汽车或者小飞机的控制算法都可以。

2、关于Vizard显示

1)Vizard完全是另一个软件,除非自己再BSK里写一个module,或者python里exec,就不要想让BSK运行一个场景后自动调用Vizard了。

2)确实支持liveStream和broadcastStream 

https://hanspeterschaub.info/basilisk/Vizard/vizardAdvanced/vizardLiveComm.html

1.连接与阻塞

模式是否等待Vizard阻塞行为
liveStream✅ 是,必须等待 Vizard 连接成功后 Basilisk 才会开始运行阻塞仿真启动
broadcastStream❌ 否,不管有没有 Vizard 连接,Basilisk 都会运行非阻塞,仿真立即开始

2. 使用场景

liveStream:适合单人交互式仿真,用户需要控制面板、暂停、调节参数等。
broadcastStream:适合多人观看或教学演示,例如教师运行主仿真,学生通过多个 Vizard 客户端“订阅”观看。

3. 可视化同步控制

liveStream 用户可自行控制视角、面板、设置等。
broadcastStream 的“订阅者”视角可被主控方同步,如轨道线、坐标系、面板状态等,适合统一教学视图

4. 可同时启用

vizSupport.enableUnityVisualization(..., liveStream=True, broadcastStream=True)

按官方说法:
Basilisk 会等待主 Vizard(liveStream)连接;
连接成功后,其他 Vizard 客户端可通过广播地址订阅观看;
主控 Vizard 的设置可同步到所有订阅者。

(据说是这样,我并没有试。broadcastStream 是不是地址他一定要组播地址或者广播地址,没看明白)

5.其实还是输出文件更好

我是不想弄了,我觉得可能因为BSK本质是个仿真框架(目的我怀疑是为了快快的验证算法的正确性),让它把仿真的场景“边计算边显示”的1:1的显示到Vizard上的方法我是没找到,都是“咻的一声”就跑完了,好像官网对于这种快快的仿真还很得意。除非把积分步长搞大,但是那样就不是我们想仿真的效果了。所以总结下来看,还不如,就是单独生成文件

vizSupport.enableUnityVisualization(scSim, simTaskName, scObject,
                                              
                                               # liveStream=True,
                                                 saveFile=__file__
                                              )

vizard加载输出的文件,自己还能通过Vizard界面控制控制速度啥的。(另外,它这个场景仿真场景开始结束的时间,都是相对那个固定的默认的起点的时间吗?没找到啥地方设置啊,那比方说仿真场景想弄个进出日食模式下的电池管理啥的,怎么弄?)

3、目前来说

只能说尺有所长、寸有所短。各有各的用处吧,STK最全面,但是又要钱又不给的。Orekit+Oreczml+cesium 或者 BSK+Vizard 让各自解决各自该解决的问题吧。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值