OE之earth文件序列化(上)

本文探讨了OpenSceneGraph的osgdb_earth插件如何解析和序列化Earth文件。通过XmlDocument处理XML文档并存储到Config中,识别不同类型的根节点,进行版本控制。解析后的结果转化为mapNode,整合进osg渲染流程。文章还重点介绍了版本2的序列化过程,特别是如何管理多个图层,如影像、高程、模型和镂空层,并从Config中获取层的属性配置。


在理解Config的概念之后,就可以进入OE对Earth文件的解析过程,从earth的读写插件osgdb_earth插件开始

打开ReaderWriterOsgEarth.cpp文件

熟悉的自定义osg插件读写框架,直接进入解析正题

virtual ReadResult readNode(std::istream& in, const osgDB::Options* options ) const

 在这里看到了亲切的 XmlDocument类,通过它我们将XML文档存储到了Config中

接下来就是根节点辨析了,可以看到支持<<map>>和<<earth>>两种根节点字符串

然后是earh文件的版本控制,新版本增加了一些新的节点序列化,具体可以深入

序列化的最终结果就是将earth文件解析为mapNode 节点,可以将其置入osg的节点体系,进入到osg的渲染过程

继续来到版本2的序列化 EarthFileSerializer2

关键函数 

MapNode
EarthFileSerializer2::deserialize( const Config& conf, const std::string& referenceURI ) const
{
    MapOptions mapOptions( conf.child( "options" ) );

    // legacy: check for name/type in top-level attrs:
    if ( conf.hasValue( "name" ) || conf.hasValue( "type" ) )
    {
        Config legacy;
        if ( conf.hasValue("name") ) legacy.add( "name", conf.value("name") );
        if ( conf.hasValue("type") ) legacy.add( "type", conf.value("type") );
        mapOptions.mergeConfig( legacy );
    }

    Map* map = new Map( mapOptions );

    // Yes, MapOptions and MapNodeOptions share the same Config node. Weird but true.
    MapNodeOptions mapNodeOptions( conf.child( "options" ) );

    // Read the layers in LAST (otherwise they will not benefit from the cache/profile configuration)

    // Image layers:
    ConfigSet images = conf.children( "image" );
    for( ConfigSet::const_iterator i = images.begin(); i != images.end(); i++ )
    {
        Config layerDriverConf = *i;
        layerDriverConf.add( "default_tile_size", "256" );

        ImageLayerOptions layerOpt( layerDriverConf );
        layerOpt.name() = layerDriverConf.value("name");
        //layerOpt.driver() = TileSourceOptions( layerDriverConf );

        map->addImageLayer( new ImageLayer(layerOpt) );
    }

    // Elevation layers:
    for( int k=0; k<2; ++k )
    {
        std::string tagName = k == 0 ? "elevation" : "heightfield"; // support both :)

        ConfigSet heightfields = conf.children( tagName );
        for( ConfigSet::const_iterator i = heightfields.begin(); i != heightfields.end(); i++ )
        {
            Config layerDriverConf = *i;
            layerDriverConf.add( "default_tile_size", "15" );

            ElevationLayerOptions layerOpt( layerDriverConf );
            layerOpt.name() = layerDriverConf.value( "name" );

            map->addElevationLayer( new ElevationLayer(layerOpt) );
        }
    }

    // Model layers:
    ConfigSet models = conf.children( "model" );
    for( ConfigSet::const_iterator i = models.begin(); i != models.end(); i++ )
    {
        const Config& layerDriverConf = *i;

        ModelLayerOptions layerOpt( layerDriverConf );
        layerOpt.name() = layerDriverConf.value( "name" );
        layerOpt.driver() = ModelSourceOptions( layerDriverConf );

        map->addModelLayer( new ModelLayer(layerOpt) );
        //map->addModelLayer( new ModelLayer( layerDriverConf.value("name"), ModelSourceOptions(*i) ) );
    }

    // Overlay layers (just an alias for Model Layer with overlay=true)
    ConfigSet overlays = conf.children( "overlay" );
    for( ConfigSet::const_iterator i = overlays.begin(); i != overlays.end(); i++ )
    {
        Config layerDriverConf = *i;
        if ( !layerDriverConf.hasValue("driver") )
            layerDriverConf.set("driver", "feature_geom");

        ModelLayerOptions layerOpt( layerDriverConf );
        layerOpt.name() = layerDriverConf.value( "name" );
        layerOpt.driver() = ModelSourceOptions( layerDriverConf );
        layerOpt.overlay() = true; // forced on when "overlay" specified

        map->addModelLayer( new ModelLayer(layerOpt) );
    }

    // Mask layer:
    ConfigSet masks = conf.children( "mask" );
    for( ConfigSet::const_iterator i = masks.begin(); i != masks.end(); i++ )
    {
        Config maskLayerConf = *i;

        MaskLayerOptions options(maskLayerConf);
        options.name() = maskLayerConf.value( "name" );
        options.driver() = MaskSourceOptions(options);

        map->addTerrainMaskLayer( new MaskLayer(options) );
    }

    
    //Add any addition paths specified in the options/osg_file_paths element to the file path.  Useful for pointing osgEarth at resource folders.
    Config osg_file_paths = conf.child( "options" ).child("osg_file_paths");
    ConfigSet urls = osg_file_paths.children("url");
    for (ConfigSet::const_iterator i = urls.begin(); i != urls.end(); i++) 
    {
        std::string path = osgEarth::getFullPath( referenceURI, (*i).value());
        OE_DEBUG << "Adding OSG file path " << path << std::endl;
        osgDB::Registry::instance()->getDataFilePathList().push_back( path );
    }

    MapNode* mapNode = new MapNode( map, mapNodeOptions );

    // External configs:
    Config ext = conf.child( "external" );
    if ( !ext.empty() )
    {
        mapNode->externalConfig() = ext;
    }

    return mapNode;
}
从上面可以看到

1 earth插件 map 统筹OE中所有"层"的概念,支持多层影像,高程,模型,镂空层(mask)等

2各个层相应配置的属性由指定的Option类从Config中获取,如果对应Config中有Option类指定元素相应值的配置Option将其写入

现将OE支持的层节点和部分属性分列如下(仅供参考)



%% 与ATk进行连接 %与ATK进行连接,IP地址请输入本机地址,示例中为127.0.0.1。端口号默认为6655 conID = atkOpen('127.0.0.1',6655); %% 场景属性 %新建一个名为 InclinationChange 的场景 atkConnect(conID, 'New', '/ Scenario InclinationChange'); %使用UTCG格式设置场景分析时间段,开始时间为2022-11-05零点,结束时间为2022-11-08零点 atkConnect(conID, 'SetAnalysisTimePeriod', '* "5 Nov 2022 00:00:00.000" "8 Nov 2022 00:00:00.000" '); %新建一个名为 SatInclinationChange 的卫星 atkConnect(conID, 'New', '/ Satellite SatInclinationChange'); %仿真重置 atkConnect(conID, 'Animate', '* Reset'); %% 卫星轨道属性 %设置卫星轨迹线宽为2 atkConnect(conID, 'Graphics', '*/Satellite/SatInclinationChange Basic LineWidth 2'); %设置卫星轨道预报器类型为机动规划;第一级目录默认存在一个初始段,一个预报段 atkConnect(conID, 'Astrogator', '*/Satellite/SatInclinationChange SetProp'); %在第一级目录下添加一个预报段,默认段名为Propagate atkConnect(conID, 'Astrogator', '*/Satellite/SatInclinationChange InsertSegment MainSequence.SegmentList.- Propagate'); %在第一级目录下添加一个瞄准序列段,默认段名为Target_Sequence atkConnect(conID, 'Astrogator', '*/Satellite/SatInclinationChange InsertSegment MainSequence.SegmentList.- Target_Sequence'); %在瞄准序列段内添加一个机动段,默认段名为Maneuver atkConnect(conID, 'Astrogator', '*/Satellite/SatInclinationChange InsertSegment MainSequence.SegmentList.Target_Sequence.SegmentList.- Maneuver'); %在第一级目录下添加一个预报段;由于已经存在一个预报段,所以默认此段段名为Propagate1 atkConnect(conID, 'Astrogator', '*/Satellite/SatInclinationChange InsertSegment MainSequence.SegmentList.- Propagate'); %在第一级目录下添加一个瞄准序列段;由于已经存在一个瞄准序列段,所以默认此段段名为Target_Sequence1 atkConnect(conID, 'Astrogator', '*/Satellite/SatInclinationChange InsertSegment MainSequence.SegmentList.- Target_Sequence'); %在Target_Sequence1下添加一个机动段,默认段名为Maneuver atkConnect(conID, 'Astrogator', '*/Satellite/SatInclinationChange InsertSegment MainSequence.SegmentList.Target_Sequence1.SegmentList.- Maneuver'); %在第一级目录下添加一个预报段;由于已经存在两个预报段,所以默认此段段名为Propagate2 atkConnect(conID, 'Astrogator', '*/Satellite/SatInclinationChange InsertSegment MainSequence.SegmentList.- Propagate'); %在第一级目录下添加一个瞄准序列段;由于已经存在两个瞄准序列段,所以默认此段段名为Target_Sequence2 atkConnect(conID, 'Astrogator', '*/Satellite/SatInclinationChange InsertSegment MainSequence.SegmentList.- Target_Sequence'); %在Target_Sequence2下添加一个机动段,默认段名为Maneuver atkConnect(conID, 'Astrogator', '*/Satellite/SatInclinationChange InsertSegment MainSequence.SegmentList.Target_Sequence2.SegmentList.- Maneuver'); %在第一级目录下添加一个预报段;由于已经存在三个预报段,所以此段段名为Propagate3 atkConnect(conID, 'Astrogator', '*/Satellite/SatInclinationChange InsertSegment MainSequence.SegmentList.- Propagate'); %设置初始段轨道历元 atkConnect(conID, 'Astrogator', '*/Satellite/SatInclinationChange SetValue MainSequence.SegmentList.Initial_State.InitialState.Epoch 5 Nov 2022 00:00:00.000 UTCG'); %设置初始段坐标类型为轨道根数 atkConnect(conID, 'Astrogator', '*/Satellite/SatInclinationChange SetValue MainSequence.SegmentList.Initial_State.CoordinateType "Modified Keplerian" '); %设置初始段半长轴为6570000米 atkConnect(conID, 'Astrogator', '*/Satellite/SatInclinationChange SetValue MainSequence.SegmentList.Initial_State.InitialState.Keplerian.sma 6570000 m'); %设置初始段偏心率为0 atkConnect(conID, 'Astrogator', '*/Satellite/SatInclinationChange SetValue MainSequence.SegmentList.Initial_State.InitialState.Keplerian.ecc 0'); %设置初始段轨道倾角为28度 atkConnect(conID, 'Astrogator', '*/Satellite/SatInclinationChange SetValue MainSequence.SegmentList.Initial_State.InitialState.Keplerian.inc 28 deg'); %设置初始段升交点赤经为0度 atkConnect(conID, 'Astrogator', '*/Satellite/SatInclinationChange SetValue MainSequence.SegmentList.Initial_State.InitialState.Keplerian.RAAN 0'); %设置初始段近拱点角距为0度 atkConnect(conID, 'Astrogator', '*/Satellite/SatInclinationChange SetValue MainSequence.SegmentList.Initial_State.InitialState.Keplerian.w 0'); %设置初始段真近点角为0度 atkConnect(conID, 'Astrogator', '*/Satellite/SatInclinationChange SetValue MainSequence.SegmentList.Initial_State.InitialState.Keplerian.ta 0'); %设置第一个预报段颜色为红色 atkConnect(conID, 'Astrogator', '*/Satellite/SatInclinationChange SetValue MainSequence.SegmentList.Propagate.SegmentColor 4278190335'); %设置第一个预报段停止条件为Duration atkConnect(conID, 'Astrogator', '*/Satellite/SatInclinationChange SetValue MainSequence.SegmentList.Propagate.StoppingConditions Duration'); %设置第一个预报段停止条件Duration的触发值为7200秒 atkConnect(conID, 'Astrogator', '*/Satellite/SatInclinationChange SetValue MainSequence.SegmentList.Propagate.StoppingConditions.Duration.TripValue 7200 sec'); %设置第一个预报段停止条件Duration的误差值为0.0001秒 atkConnect(conID, 'Astrogator', '*/Satellite/SatInclinationChange SetValue MainSequence.SegmentList.Propagate.StoppingConditions.Duration.Tolerance 0.0001 sec'); %设置第一个瞄准序列段内的机动段颜色 atkConnect(conID, 'Astrogator', '*/Satellite/SatInclinationChange SetValue MainSequence.SegmentList.Target_Sequence.SegmentList.Maneuver.SegmentColor 4278212095'); %设置第一个瞄准序列段内的机动段在脉冲类型下推力坐标轴为VNC atkConnect(conID, 'Astrogator', '*/Satellite/SatInclinationChange SetValue MainSequence.SegmentList.Target_Sequence.SegmentList.Maneuver.ImpulsiveMnvr.ThrustAxes "Satellite VNC(Earth)" '); %设置第一个瞄准序列段控制变量为机动段的直角坐标X atkConnect(conID, 'Astrogator', '*/Satellite/SatInclinationChange AddMCSSegmentControl MainSequence.SegmentList.Target_Sequence.SegmentList.Maneuver ImpulsiveMnvr.Cartesian.X'); %第一个瞄准序列段添加属性页 atkConnect(conID, 'Astrogator', '*/Satellite/SatInclinationChange SetValue MainSequence.SegmentList.Target_Sequence.Profiles Differential_Corrector'); %设置第一个瞄准序列段的控制变量-机动段直角坐标X为使用状态 atkConnect(conID, 'Astrogator', '*/Satellite/SatInclinationChange SetMCSControlValue MainSequence.SegmentList.Target_Sequence.Profiles.Differential_Corrector Maneuver ImpulsiveMnvr.Cartesian.X Active true'); %设置第一个瞄准序列段的控制变量-机动段直角坐标X的最大步长为100米每秒 atkConnect(conID, 'Astrogator', '*/Satellite/SatInclinationChange SetMCSControlValue MainSequence.SegmentList.Target_Sequence.Profiles.Differential_Corrector Maneuver ImpulsiveMnvr.Cartesian.X MaxStep 100 m/sec'); %设置第一个瞄准序列段的控制变量-机动段直角坐标X的累计校正量为2456.42862556706米每秒 atkConnect(conID, 'Astrogator', '*/Satellite/SatInclinationChange SetMCSControlValue MainSequence.SegmentList.Target_Sequence.Profiles.Differential_Corrector Maneuver ImpulsiveMnvr.Cartesian.X Correction 2456.42862556706 m/sec'); %设置第一个瞄准序列段的控制变量-机动段直角坐标X的摄动量为0.1米每秒 atkConnect(conID, 'Astrogator', '*/Satellite/SatInclinationChange SetMCSControlValue MainSequence.SegmentList.Target_Sequence.Profiles.Differential_Corrector Maneuver ImpulsiveMnvr.Cartesian.X Perturbation 0.1 m/sec'); %设置第一个瞄准序列段的控制变量-机动段直角坐标X的归一化参数为0.1米每秒 atkConnect(conID, 'Astrogator', '*/Satellite/SatInclinationChange SetMCSControlValue MainSequence.SegmentList.Target_Sequence.Profiles.Differential_Corrector Maneuver ImpulsiveMnvr.Cartesian.X Scale 1 m/sec'); %设置第一个瞄准序列段内的机动段的约束为Radius Of Apoapsis atkConnect(conID, 'Astrogator', '*/Satellite/SatInclinationChange SetValue MainSequence.SegmentList.Target_Sequence.SegmentList.Maneuver.Results " Radius Of Apoapsis " '); %设置第一个瞄准序列段的机动段约束Radius Of Apoapsis为使用状态 atkConnect(conID, 'Astrogator', '*/Satellite/SatInclinationChange SetMCSConstraintValue MainSequence.SegmentList.Target_Sequence.Profiles.Differential_Corrector Maneuver "Radius Of Apoapsis" Active true'); %设置第一个瞄准序列段的机动段约束Radius Of Apoapsis的收敛误差为0.1米 atkConnect(conID, 'Astrogator', '*/Satellite/SatInclinationChange SetMCSConstraintValue MainSequence.SegmentList.Target_Sequence.Profiles.Differential_Corrector Maneuver "Radius Of Apoapsis" Tolerance 0.1 m'); %设置第一个瞄准序列段的机动段约束Radius Of Apoapsis的归一化参数为1米 atkConnect(conID, 'Astrogator', '*/Satellite/SatInclinationChange SetMCSConstraintValue MainSequence.SegmentList.Target_Sequence.Profiles.Differential_Corrector Maneuver "Radius Of Apoapsis" Scale 1 m'); %设置第一个瞄准序列段的机动段约束Radius Of Apoapsis的权重系数为1 atkConnect(conID, 'Astrogator', '*/Satellite/SatInclinationChange SetMCSConstraintValue MainSequence.SegmentList.Target_Sequence.Profiles.Differential_Corrector Maneuver "Radius Of Apoapsis" Weight 1'); %设置第一个瞄准序列段的机动段约束Radius Of Apoapsis的期望值为42160000米 atkConnect(conID, 'Astrogator', '*/Satellite/SatInclinationChange SetMCSConstraintValue MainSequence.SegmentList.Target_Sequence.Profiles.Differential_Corrector Maneuver "Radius Of Apoapsis" Desired 42160000 m'); %设置第二个预报段的颜色为亮紫色 atkConnect(conID, 'Astrogator', '*/Satellite/SatInclinationChange SetValue MainSequence.SegmentList.Propagate1.SegmentColor 4294902015'); %设置第二个预报段的停止条件为Apoapsis atkConnect(conID, 'Astrogator', '*/Satellite/SatInclinationChange SetValue MainSequence.SegmentList.Propagate1.StoppingConditions Apoapsis'); %设置第二个预报段停止条件Apoapsis的重复次数为1 atkConnect(conID, 'Astrogator', '*/Satellite/SatInclinationChange SetValue MainSequence.SegmentList.Propagate1.StoppingConditions.Apoapsis.RepeatCount 1'); %设置第二个预报段停止条件Apoapsis的误差值为0.0001 atkConnect(conID, 'Astrogator', '*/Satellite/SatInclinationChange SetValue MainSequence.SegmentList.Propagate1.StoppingConditions.Apoapsis.Tolerance 0.0001'); %设置第二个瞄准序列段的机动段颜色 atkConnect(conID, 'Astrogator', '*/Satellite/SatInclinationChange SetValue MainSequence.SegmentList.Target_Sequence1.SegmentList.Maneuver.SegmentColor -256'); %设置第二个瞄准序列段内的机动段没冲类型下推力坐标轴为VNC atkConnect(conID, 'Astrogator', '*/Satellite/SatInclinationChange SetValue MainSequence.SegmentList.Target_Sequence1.SegmentList.Maneuver.ImpulsiveMnvr.ThrustAxes "Satellite VNC(Earth)" '); %设置第二个瞄准序列段的控制变量为机动段直角坐标X atkConnect(conID, 'Astrogator', '*/Satellite/SatInclinationChange AddMCSSegmentControl MainSequence.SegmentList.Target_Sequence1.SegmentList.Maneuver ImpulsiveMnvr.Cartesian.X'); %第二个瞄准序列段添加属性页 atkConnect(conID, 'Astrogator', '*/Satellite/SatInclinationChange SetValue MainSequence.SegmentList.Target_Sequence1.Profiles Differential_Corrector'); %设置第二个瞄准序列段的控制变量-机动段直角坐标X为使用状态 atkConnect(conID, 'Astrogator', '*/Satellite/SatInclinationChange SetMCSControlValue MainSequence.SegmentList.Target_Sequence1.Profiles.Differential_Corrector Maneuver ImpulsiveMnvr.Cartesian.X Active true'); %设置第二个瞄准序列段的控制变量-机动段直角坐标X的最大步长为100米每秒 atkConnect(conID, 'Astrogator', '*/Satellite/SatInclinationChange SetMCSControlValue MainSequence.SegmentList.Target_Sequence1.Profiles.Differential_Corrector Maneuver ImpulsiveMnvr.Cartesian.X MaxStep 100 m/sec'); %设置第二个瞄准序列段的控制变量-机动段直角坐标X的累计校正量为1480.06329844802 米每秒 atkConnect(conID, 'Astrogator', '*/Satellite/SatInclinationChange SetMCSControlValue MainSequence.SegmentList.Target_Sequence1.Profiles.Differential_Corrector Maneuver ImpulsiveMnvr.Cartesian.X Correction 1480.06329844802 m/sec'); %设置第二个瞄准序列段的控制变量-机动段直角坐标X的摄动量为0.1米每秒 atkConnect(conID, 'Astrogator', '*/Satellite/SatInclinationChange SetMCSControlValue MainSequence.SegmentList.Target_Sequence1.Profiles.Differential_Corrector Maneuver ImpulsiveMnvr.Cartesian.X Perturbation 0.1 m/sec'); %设置第二个瞄准序列段的控制变量-机动段直角坐标X的归一化参数为1米每秒 atkConnect(conID, 'Astrogator', '*/Satellite/SatInclinationChange SetMCSControlValue MainSequence.SegmentList.Target_Sequence1.Profiles.Differential_Corrector Maneuver ImpulsiveMnvr.Cartesian.X Scale 1 m/sec'); %设置第二个瞄准序列段内的机动段约束为Eccentricity atkConnect(conID, 'Astrogator', '*/Satellite/SatInclinationChange SetValue MainSequence.SegmentList.Target_Sequence1.SegmentList.Maneuver.Results "Eccentricity" '); %设置第二个瞄准序列段内的机动段约束Eccentricity为使用状态 atkConnect(conID, 'Astrogator', '*/Satellite/SatInclinationChange SetMCSConstraintValue MainSequence.SegmentList.Target_Sequence1.Profiles.Differential_Corrector Maneuver "Eccentricity" Active true'); %设置第二个瞄准序列段内的机动段约束收敛误差为0.001 atkConnect(conID, 'Astrogator', '*/Satellite/SatInclinationChange SetMCSConstraintValue MainSequence.SegmentList.Target_Sequence1.Profiles.Differential_Corrector Maneuver "Eccentricity" Tolerance 0.001'); %设置第二个瞄准序列段内的机动段约束归一化参数为1 atkConnect(conID, 'Astrogator', '*/Satellite/SatInclinationChange SetMCSConstraintValue MainSequence.SegmentList.Target_Sequence1.Profiles.Differential_Corrector Maneuver "Eccentricity" Scale 1'); %设置第二个瞄准序列段内的机动段约束权重系数为1 atkConnect(conID, 'Astrogator', '*/Satellite/SatInclinationChange SetMCSConstraintValue MainSequence.SegmentList.Target_Sequence1.Profiles.Differential_Corrector Maneuver "Eccentricity" Weight 1'); %设置第二个瞄准序列段内的机动段约束期望值为0 atkConnect(conID, 'Astrogator', '*/Satellite/SatInclinationChange SetMCSConstraintValue MainSequence.SegmentList.Target_Sequence1.Profiles.Differential_Corrector Maneuver "Eccentricity" Desired 0'); %设置第三个预报段的颜色为绿色 atkConnect(conID, 'Astrogator', '*/Satellite/SatInclinationChange SetValue MainSequence.SegmentList.Propagate2.SegmentColor 4278255360'); %设置第三个预报段的停止条件为AscendingNode atkConnect(conID, 'Astrogator', '*/Satellite/SatInclinationChange SetValue MainSequence.SegmentList.Propagate2.StoppingConditions AscendingNode'); %设置第三个预报段的停止条件AscendingNode的重复次数为2 atkConnect(conID, 'Astrogator', '*/Satellite/SatInclinationChange SetValue MainSequence.SegmentList.Propagate2.StoppingConditions.AscendingNode.RepeatCount 2'); %设置第三个预报段的停止条件AscendingNode的误差值为0.000001 atkConnect(conID, 'Astrogator', '*/Satellite/SatInclinationChange SetValue MainSequence.SegmentList.Propagate2.StoppingConditions.AscendingNode.Tolerance 0.000001'); %设置第三个瞄准序列段的机动段颜色 atkConnect(conID, 'Astrogator', '*/Satellite/SatInclinationChange SetValue MainSequence.SegmentList.Target_Sequence2.SegmentList.Maneuver.SegmentColor -65536'); %设置第三个瞄准序列段内的机动段脉冲属性下推力坐标轴为VNC atkConnect(conID, 'Astrogator', '*/Satellite/SatInclinationChange SetValue MainSequence.SegmentList.Target_Sequence2.SegmentList.Maneuver.ImpulsiveMnvr.ThrustAxes "Satellite VNC(Earth)" '); %设置第三个瞄准序列段的控制变量为机动段的直角坐标X atkConnect(conID, 'Astrogator', '*/Satellite/SatInclinationChange AddMCSSegmentControl MainSequence.SegmentList.Target_Sequence2.SegmentList.Maneuver Impul-siveMnvr.Cartesian.X'); %第三个瞄准序列段添加属性页 atkConnect(conID, 'Astrogator', '*/Satellite/SatInclinationChange SetValue MainSequence.SegmentList.Target_Sequence2.Profiles Differential_Corrector'); %设置第三个瞄准序列段控制变量-机动段直角坐标X为使用状态 atkConnect(conID, 'Astrogator', '*/Satellite/SatInclinationChange SetMCSControlValue MainSequence.SegmentList.Target_Sequence2.Profiles.Differential_Corrector Maneuver ImpulsiveMnvr.Cartesian.X Active true'); %设置第三个瞄准序列段控制变量-机动段直角坐标X的最大步长为100米每秒 atkConnect(conID, 'Astrogator', '*/Satellite/SatInclinationChange SetMCSControlValue MainSequence.SegmentList.Target_Sequence2.Profiles.Differential_Corrector Maneuver ImpulsiveMnvr.Cartesian.X MaxStep 100 m/sec'); %设置第三个瞄准序列段控制变量-机动段直角坐标X的累计校正量为-359.983751789857米每秒 atkConnect(conID, 'Astrogator', '*/Satellite/SatInclinationChange SetMCSControlValue MainSequence.SegmentList.Target_Sequence2.Profiles.Differential_Corrector Maneuver ImpulsiveMnvr.Cartesian.X Correction -359.983751789857 m/sec'); %设置第三个瞄准序列段控制变量-机动段直角坐标X摄动量为0.1米每秒 atkConnect(conID, 'Astrogator', '*/Satellite/SatInclinationChange SetMCSControlValue MainSequence.SegmentList.Target_Sequence2.Profiles.Differential_Corrector Maneuver ImpulsiveMnvr.Cartesian.X Perturbation 0.1 m/sec'); %设置第三个瞄准序列段控制变量-机动段直角坐标X归一化参数为1米每秒 atkConnect(conID, 'Astrogator', '*/Satellite/SatInclinationChange SetMCSControlValue MainSequence.SegmentList.Target_Sequence2.Profiles.Differential_Corrector Maneuver ImpulsiveMnvr.Cartesian.X Scale 1 m/sec'); %设置第三个瞄准序列段的控制变量为机动段直角坐标Y atkConnect(conID, 'Astrogator', '*/Satellite/SatInclinationChange AddMCSSegmentControl MainSequence.SegmentList.Target_Sequence2.SegmentList.Maneuver Impul-siveMnvr.Cartesian.Y'); %设置第三个瞄准序列段控制变量-机动段直角坐标Y为使用状态 atkConnect(conID, 'Astrogator', '*/Satellite/SatInclinationChange SetMCSControlValue MainSequence.SegmentList.Target_Sequence2.Profiles.Differential_Corrector Maneuver ImpulsiveMnvr.Cartesian.Y Active true'); %设置第三个瞄准序列段控制变量-机动段直角坐标Y的最大步长为100米每秒 atkConnect(conID, 'Astrogator', '*/Satellite/SatInclinationChange SetMCSControlValue MainSequence.SegmentList.Target_Sequence2.Profiles.Differential_Corrector Maneuver ImpulsiveMnvr.Cartesian.Y MaxStep 100 m/sec'); %设置第三个瞄准序列段控制变量-机动段直角坐标Y的累计校正量为-1444.72488992759米每秒 atkConnect(conID, 'Astrogator', '*/Satellite/SatInclinationChange SetMCSControlValue MainSequence.SegmentList.Target_Sequence2.Profiles.Differential_Corrector Maneuver ImpulsiveMnvr.Cartesian.Y Correction -1444.72488992759 m/sec'); %设置第三个瞄准序列段控制变量-机动段直角坐标Y的摄动量为0.1米每秒 atkConnect(conID, 'Astrogator', '*/Satellite/SatInclinationChange SetMCSControlValue MainSequence.SegmentList.Target_Sequence2.Profiles.Differential_Corrector Maneuver ImpulsiveMnvr.Cartesian.Y Perturbation 0.1 m/sec'); %设置第三个瞄准序列段控制变量-机动段直角坐标Y的归一化参数为1米每秒 atkConnect(conID, 'Astrogator', '*/Satellite/SatInclinationChange SetMCSControlValue MainSequence.SegmentList.Target_Sequence2.Profiles.Differential_Corrector Maneuver ImpulsiveMnvr.Cartesian.Y Scale 1 m/sec'); %设置第三个瞄准序列段内的机动段约束为Inclination和Eccentricity atkConnect(conID, 'Astrogator', '*/Satellite/SatInclinationChange SetValue MainSequence.SegmentList.Target_Sequence2.SegmentList.Maneuver.Results "Inclination" "Eccentricity" '); %设置第三个瞄准序列段内机动段约束Inclination为使用状态 atkConnect(conID, 'Astrogator', '*/Satellite/SatInclinationChange SetMCSConstraintValue MainSequence.SegmentList.Target_Sequence2.Profiles.Differential_Corrector Maneuver "In-clination" Active true'); %设置第三个瞄准序列段内机动段约束Inclination的收敛误差为0度 atkConnect(conID, 'Astrogator', '*/Satellite/SatInclinationChange SetMCSConstraintValue MainSequence.SegmentList.Target_Sequence2.Profiles.Differential_Corrector Maneuver "In-clination" Tolerance 0 deg'); %设置第三个瞄准序列段内机动段约束Inclination的归一化参数为1弧度 atkConnect(conID, 'Astrogator', '*/Satellite/SatInclinationChange SetMCSConstraintValue MainSequence.SegmentList.Target_Sequence2.Profiles.Differential_Corrector Maneuver "In-clination" Scale 1 rad'); %设置第三个瞄准序列段内机动段约束Inclination的权重系数为1 atkConnect(conID, 'Astrogator', '*/Satellite/SatInclinationChange SetMCSConstraintValue MainSequence.SegmentList.Target_Sequence2.Profiles.Differential_Corrector Maneuver "In-clination" Weight 1'); %设置第三个瞄准序列段内机动段约束Inclination的期望值为0度 atkConnect(conID, 'Astrogator', '*/Satellite/SatInclinationChange SetMCSConstraintValue MainSequence.SegmentList.Target_Sequence2.Profiles.Differential_Corrector Maneuver "In-clination" Desired 0 deg'); %设置第三个瞄准序列段内机动段约束Eccentricity为使用状态 atkConnect(conID, 'Astrogator', '*/Satellite/SatInclinationChange SetMCSConstraintValue MainSequence.SegmentList.Target_Sequence2.Profiles.Differential_Corrector Maneuver "Eccentricity" Active true'); %设置第三个瞄准序列段内机动段约束Eccentricity的收敛误差为0.001 atkConnect(conID, 'Astrogator', '*/Satellite/SatInclinationChange SetMCSConstraintValue MainSequence.SegmentList.Target_Sequence2.Profiles.Differential_Corrector Maneuver "Eccentricity" Tolerance 0.001'); %设置第三个瞄准序列段内机动段约束Eccentricity的收敛误差为0.001 atkConnect(conID, 'Astrogator', '*/Satellite/SatInclinationChange SetMCSConstraintValue MainSequence.SegmentList.Target_Sequence2.Profiles.Differential_Corrector Maneuver "Eccentricity" Scale 1'); %设置第三个瞄准序列段内机动段约束Eccentricity的权重系数为1 atkConnect(conID, 'Astrogator', '*/Satellite/SatInclinationChange SetMCSConstraintValue MainSequence.SegmentList.Target_Sequence2.Profiles.Differential_Corrector Maneuver "Eccentricity" Weight 1'); %设置第三个瞄准序列段内机动段约束Eccentricity期望值为0 atkConnect(conID, 'Astrogator', '*/Satellite/SatInclinationChange SetMCSConstraintValue MainSequence.SegmentList.Target_Sequence2.Profiles.Differential_Corrector Maneuver "Eccentricity" Desired 0'); %设置第四个预报段的颜色为黄色 atkConnect(conID, 'Astrogator', '*/Satellite/SatInclinationChange SetValue MainSequence.SegmentList.Propagate3.SegmentColor 4278255615'); %设置第四个预报段的停止条件为Duration atkConnect(conID, 'Astrogator', '*/Satellite/SatInclinationChange SetValue MainSequence.SegmentList.Propagate3.StoppingConditions Duration'); %设置第四个预报段停止条件Duration的触发值为129600秒 atkConnect(conID, 'Astrogator', '*/Satellite/SatInclinationChange SetValue MainSequence.SegmentList.Propagate3.StoppingConditions.Duration.TripValue 129600 sec'); %设置第四个预报段停止条件Duration的误差值为0.00001秒 atkConnect(conID, 'Astrogator', '*/Satellite/SatInclinationChange SetValue MainSequence.SegmentList.Propagate3.StoppingConditions.Duration.Tolerance 0.00001 sec'); %运行此算例 atkConnect(conID, 'Astrogator', '*/Satellite/SatInclinationChange RunMCS'); 根据此语句,帮我写多个卫星通过优化蚁群算法和DE算法变轨去捕捉多个空间碎片目标的Matlab程序,尽量详细具体,不要省略步骤
最新发布
07-05
### OSGEarth 使用 Earth 文件 加载 高程 TIFF 图像 在 OSGEarth 中,可以通过创建 `earth` 文件来定义场景中的图层及其配置。对于加载高程 TIFF 图像,需要设置特定的参数以确保正确解析和显示地形数据。 #### 创建 Earth 文件 首先,在 `.earth` 文件中指定基础地图和其他必要选项: ```xml <?xml version="1.0" encoding="UTF-8"?> <map> <!-- 定义全局坐标系 --> <profile name="global"> <desc>Global geographic profile</desc> <datum>wgs84</datum> <ellipsoid>wgs84</ellipsoid> </profile> <!-- 添加高程图层 --> <layer type="elevation"> <name>Elevation Layer from GeoTIFF</name> <driver>gdal</driver> <url>c:/path/to/your/elev.tif</url> <srs>+proj=longlat +datum=WGS84 +no_defs</srs> </layer> <!-- 可选:添加影像图层作为底图 --> <layer type="image"> <name>Base Image Map</name> <driver>bing</driver> <key>[Your Bing Maps Key]</key> </layer> </map> ``` 上述 XML 片段展示了如何声明一个基于 GDAL 的驱动程序读取本地存储路径下的 TIFF 文件[^4]。注意 `<srs>` 标签用于指明输入栅格的空间参照系统 (SRS),这有助于保证不同来源的数据能够准确叠加在一起。 #### 初始化并运行应用程序 接下来编写 C++ 代码片段初始化视窗环境,并加载之前准备好的 earth 文件: ```cpp #include <osgViewer/Viewer> #include <osgDB/readFile> #include "osgEarth/MapNode" int main(int argc, char* argv[]) { // 设置 viewer 和 mapnode osgViewer::Viewer viewer; // 构建 MapOptions 对象 osgEarth::MapOptions options; options.setProfile(osgEarth::Registry::instance()->createProfile("global")); // 载入 .earth 地图文件 std::string filename = "c:\\path\\to\\test1.earth"; osg::ref_ptr<osgEarth::Map> map = new osgEarth::Map(options); if (!map->load(filename)) { OE_WARN << "Failed to load the specified earth file." << std::endl; return -1; } // 将 Map 绑定到 SceneGraph 上 osg::ref_ptr<osgEarth::MapNode> node = new osgEarth::MapNode(map.get()); viewer.setSceneData(node.get()); // 启动主循环 return viewer.run(); } ``` 这段代码实现了基本的地图查看器框架,其中包含了对自定义 earth 文件的支持。当执行此程序时,将会呈现由 TIFF 提供的高度信息构成的地貌模型[^1]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值