查看: 3166|回复: 4

osgearth坐标系

[复制链接]
  • TA的每日心情
    开心
    2020-3-20 17:50
  • 签到天数: 1 天

    [LV.1]初来乍到

    发表于 2020-3-26 13:43:36 | 显示全部楼层 |阅读模式


    站心坐标系:Earth-fixed coordinate system(站点坐标系、东-北-天坐标系ENU)。用于需了解以观察者为中心的其他物体运动规律,如接收机可见GPS卫星的视角、方位角及距离等,需要用到站心坐标系。可进一步分为:
    (1)站心直角坐标系
    定义:以站心(如GPS接收天线中心)为坐标系原点O,Z轴与椭球法线重合,向上为正(天向),y与椭球短半轴重合(北向),x轴与地球椭球的长半轴重合(东向)所构成的直角坐标系,称为当地东北天坐标系(ENU)。-------------- 这个用得较多
    (2)站心极坐标系
    定义:以站心为坐标极点O,以水平面(即xoy平面)为基准面,以东向轴(即x轴)为极轴,ρ为卫星到站点的距离,az为星视方向角(azimuth angle),el为星视仰角(elevation)。
    2.4 CGCS2000坐标
    CGCS2000是(中国)2000国家大地坐标系的缩写,该坐标系是通过中国GPS 连续运行基准站、 空间大地控制网以及天文大地网与空间地网联合平差建立的地心大地坐标系统。2000(中国)国家大地坐标系以ITRF 97 参考框架为基准, 参考框架历元为2000.0。
    根据2000 国家大地坐标系(CGCS 2000) 的定义及其所定义的4 个基本椭球常数,推导CGCS 2000 椭球的主要几何和物理参数,比较这些参数与GRS 80 和WGS 84 椭球相应参数之间的差异,给出CGCS 2000 椭球与GRS 80 及WGS 84 椭球定义的正常重力值的差异, 并分析在CGCS 2000 及WGS 84 系下同一点坐标的差异。研究表明:CGCS 2000椭球上的正常重力值与GRS 80 ,WGS 84 椭球上的正常重力值的差值分别约为- 143. 54 ×10 - 8 m/ s2 和0. 02×10 - 8 m/ s2 。同一点在CGCS 2000 与GRS 80 和WGS 84 下经度相同,纬度的最大差值分别为8. 26 ×10 - 11″(相当于2. 5 ×10 - 6 mm) 和3. 6 ×10 - 6″(相当于0. 11 mm) 。这里主要是指椭球参数的不同而引起的同一点经纬度的差异,给定点位在某一框架和某一历元下的空间直角坐标,投影到CGCS 2000 椭球和WGS 84 椭球上所得的纬度的最大差异相当于0. 11 mm。

    2.5 PE-90坐标
    GLONASS使用的是前苏联地心坐标系(PE-90)。
    3 时间坐标
    3.1 ATI
    国际原子时(TAI):针对某些元素的原子能级跃迁频率有极高的稳定性,可采用基于铯原子(Cs 132.9)的能级跃迁原子秒作为时标。国际计量局(BIPM)根据世界20多个国家的实验室的100多台原子钟提供的数据进行处理,得出“国际时间标准”称为国际原子时(TAI)。原子时秒长的定义是:铯133原子基态的两个超精细能级间在零磁场下跃迁辐射周期 9,192,631,770倍所持续的时间。1967年第十三届国际计量委员会决定,把在海平面上实现的上述原子时秒,规定为国际单位制时间单位。从此,时间计量标准便正式由天文学的宏观领域过渡到了物理学的微观领域。
    因此ATI可理解为一种标准的时间计量单位。

    3.2 UTC
    协调世界时(英:Universal Time Coordinated ,法:Temps Universel Coordonné),又称世界统一时间,世界标准时间,国际协调时间。英文(CUT)和法文(TUC)的缩写不同,作为妥协,简称UTC。协调世界时是以原子时秒长为基础,在时刻上尽量接近于世界时的一种时间计量系统。
    闰秒(或称为跳秒)是对协调世界时作出加一秒或减一秒的调整。国际原子时的准确度为每日数纳秒,而世界时的准确度为每日数毫秒。对于这种情况,一种称为协调世界时的折中时标于1972年面世。为确保协调世界时与世界时相差不会超过0.9秒,在有需要的情况下会在协调世界时内加上正或负一整秒。这一技术措施就称为闰秒。

    3.3 GPS时
    GPS时间系统采用原子时AT1秒长作时间基准,秒长定义为铯原子CS133基态的两个超精细能级间跃迁辐射振荡9192631170周所持续的时间,时间起算的原点定义在1980年1月6日世界协调时UTC0时,启动后不跳秒,保证时间的连续。以后随着时间积累,GPS时与UTC时的整秒差以及秒以下的差异通过时间服务部门定期公布。
    文档编写时期,GPS与UTC相差16个闰秒。

    3.4 BDS时
    北斗系统的时间基准为北斗时(BDT)。BDT采用国际单位制(SI)秒为基本单位连续累计,不闰秒,起始历元为2006年1月1日协调世界时(UTC)00时00分00秒,采用周和周内秒计数。BDT通过UTC(NTSC)与国际UTC建立联系,BDT与UTC的偏差保持在100纳秒以内(模1秒)。BDT与UTC之间的闰秒信息在导航电文中播报。北斗周和GPS周相差1356周,北斗秒和GPS秒相差14秒。
    文档编写时期,BDS与UTC相差2个闰秒。

    3.5 GLO时
    GLONASS时间系统亦采用原子时ATI秒长作为时间基准, 是基于前苏联莫斯科的协调世界时UTC ( SU) , 采用的UTC时并含有跳秒改正。其与GPS时间间的转换关系参见参考文献[2]。
    与GPS时相类似,GLONASS也建立了自己专用的原子时用于全球的导航与定位。与GPS时不同的是它是以采用莫斯科时间为标准,以俄罗斯(前苏联)维持的UTC(SU)作为时问度量的基准。GLONASST与UTC(SU)具有相同的闰秒,存在3小时的整数偏移,不存在整秒差,但相差一个微小偏差(1ms以内)。
  • TA的每日心情
    开心
    2020-3-20 17:50
  • 签到天数: 1 天

    [LV.1]初来乍到

     楼主| 发表于 2020-3-26 19:45:54 | 显示全部楼层
    本帖最后由 liyihongcug 于 2020-3-27 15:48 编辑

    欧拉角需要自己理解 。下面图很好懂 但教材的死活不能说通。怪事,开发说了算
    创建初始化摄像机视图
        var initialPosition=new .Cartesian3.fromDegrees(-73.998114468289017509, 40.674512895646692812, 2631.082799425431);//摄像机位置 ,经度,纬度,高度
        var initialOrientation=new .HeadingPitchRoll.fromDegrees(7.1077496389876024807, -31.987223091598949054, 0.025883251314954971306);//飞行 专用的  表示旋转角度之类的东西: 飞行中飞机机体轴相对于地面的角位置
        var homeCameraView={
            destination:initialPosition,
            orientation:{
                heading:initialOrientation.heading, //偏航角
                pitch:initialOrientation.pitch,     //俯仰角
                roll:initialOrientation.roll    //滚转角
            }
        };
    camera.setView(homeCameraView);
    heading 偏航角
    pitch 俯仰角
    roll 滚转this.updateRotation = function (options) {
        if (!.defined(model)) return;
        var options = options ? options : {};
        //三轴旋转
        var xAxis = options.xAxis ? angletoradian(options.xAxis) : 0;
        var yAxis = options.yAxis ? angletoradian(options.yAxis) : 0;
        var zAxis = options.zAxis ? angletoradian(options.zAxis) : 0;

        hpRoll.heading = zAxis;
        hpRoll.roll = xAxis;
        hpRoll.pitch = yAxis;
        model.rotation = hpRoll;
        postionVector = .Cartesian3.multiplyByScalar(.Cartesian3.UNIT_X, 0, new .Cartesian3());
        position = .Matrix4.multiplyByPoint(model.modelMatrix, postionVector, position);
        .Transforms.headingPitchRollToFixedFrame(position, hpRoll, .Ellipsoid.WGS84, fixedFrameTransform, model.modelMatrix);
    };


    坐标轴旋转一种原生的计算
    局部坐标系原点转neu 之后计算相对位置,之后计算旋转,以Z轴为例
    定义MMM为世界系到体坐标系的旋转矩阵,则模型(见下图龙飞船模型)上任意一点P的坐标[x,y,z]T\begin{bmatrix} x,y,z\end{bmatrix}^{T}[
    Z轴的旋转矩阵:
    var new_x = localPosition_A.x * Math.cos((angle)) + localPosition_A.y *   Math.sin((angle));
        var new_y = localPosition_A.y * Math.cos((angle)) - localPosition_A.x * Math.sin((angle));
        var new_z = localPosition_A.z;

    osg等框架封装后的计算直接很简单不考虑neu  
  • TA的每日心情
    开心
    2020-3-20 17:50
  • 签到天数: 1 天

    [LV.1]初来乍到

     楼主| 发表于 2020-3-27 14:19:50 | 显示全部楼层
    本帖最后由 liyihongcug 于 2020-4-1 20:41 编辑

    A点绕B点旋转的 思路 。BS必须考虑neu。 osg极少考虑这个,他的局部坐标系也是全局笛卡尔坐标

    多维向量:
         向量之间的点积(数量积/内积)两个向量分量乘积之和,结果为一个标量
         向量之间的叉积(向量积)结果为一个垂直于原向量的新向量
    例子:  
    osg::Vec3 v1;
    v1.set(1.0, 1.0, 0.0);// 设置向量值
    v1.normalize();//向量归一化处理
    float x = v1[0];//获取分量值

    osg::Vec3 v2(2.0, 5.0, 8.0);//通过构造函数赋值
    v2 *= 0.5;//向量的数乘
    v2 = osg::Vec3(1.0, 0.0, -2.0) - v2;//向量的四则运算

    float distance = (v1-v2).length();//求取两向量的距离(和向量的模) set(), ptr(), length(), normalize()
    float dotProduct = v1*v2;//向量点乘
    osg::Vec3 crossProduct = v1 ^ v2;//向量叉乘   

    osg::Vec4 vec(1.0, 1.0, 0.0, 1.0);
    float w = vec[3];
    或者
    float w = vec.w();

    四元数和欧拉角:
    四元数:由3个复数和1个实数组成的复杂数字。
    欧拉角度旋转:沿直角坐标轴旋转分量之和。

    比较:欧拉需要计算3个旋转分量的作用之和,沿俯仰(Pitch),沿航向(Heading),沿翻滚(Roll)
             而四元数只需要对旋转轴V和旋转角度进行设置。

    OSG中使用Quat类表达四元数

    osg:uat类:
           Quat()//构造函数,构造一个没有旋转的四元数
                 Quat(double x, double y, double z, double w)//构造函数,直接设置四元数的四个分量
                  Quat(float angle, const Vec3f& axis)//构造函数,使四元数沿某个向量轴旋转一定角度。
                  const Quat operator*(const Quat&)const Quat& operator* =(const Quat&)//将两个四元数相                                                                                                         乘,相当于两个旋转动作叠加
    void makeRotate(double angle, double x,double y, double z)
    或                                                     //使四元数沿一定角度旋转,并据此设置四元数的值
                  void makeRotate(double angle,const Vec3f& vec)
                  void makeRotate(const Vec3f& vec1, const Vec3f& vec2)//使四元数从轴vec1旋转到轴vec2,并                                                                                                          据此设置四元数的值

    例子:一个四元数沿x轴逆时针旋转90度
       
    osg::Quat quat(osg:I_2, osg::Vec3(1.0, 1.0, 0.0));
          // osg::PI_2是OSG预定义宏,表示数学上的π/2
    直接使用角度值而不需要用弧度来表示角度
    osg::Quat quat(osg:egreesToRadians(90.0), osg::Vec3(1.0, 1.0, 0.0));
    绕某个轴旋转的四元数quat1 和绕另一个轴旋转的四元数quat2,相乘得到新的四元数,它表示这两个旋转结果的叠加之和
    osg::Quat quat3 = quat1 * quat2;//表示这两个旋转结果的叠加之和

    将某个四元数quat中包含的旋转动作内容读出来:
    osg::Vec3 vec;
    double angle;
    quat.getRotate(angle,vec);
    double degree = osg::RadiansToDegrees(angle);
    //可以得到四元数表达的旋转轴vec
    //以及绕这个轴旋转的旋转角度degree,其中使用了弧度制转换角度值函数osg::RadiansToDegrees()


    osg指定向量旋转指定角度
    向量AB,沿着n旋转10度

    osg::Vec3 left = AB*osg::Matrix::rotate(osg::inDegrees(10), n);

    osg::Vec3 right = AB*osg::Matrix::rotate(osg::inDegrees(-10), n);//right=-left



    特殊情况下,可以使用向量叉乘实现,例如旋转90度

    osg::Vec3 left = n^AB;

    osg::Vec3 right = AB^n;
  • TA的每日心情
    开心
    2020-3-20 17:50
  • 签到天数: 1 天

    [LV.1]初来乍到

     楼主| 发表于 2020-4-2 11:21:54 | 显示全部楼层
    Cartesian3.midpoint(left, right, result)        计算右笛卡尔和左笛卡尔之间的中点
    osg pos[(start + end) / 2] = (pos[start] + pos[end]) / 2;

    该用户从未签到

    发表于 2020-9-16 10:26:37 | 显示全部楼层
    请问我卫星绕地球旋转,在经过南北极时,卫星在航向角会自己旋转180度。绕地球的运行方向不变,这是为啥?
    您需要登录后才可以回帖 登录 | 注册

    本版积分规则

    OSG中国官方论坛-有您OSG在中国才更好

    网站简介:osgChina是国内首个三维相关技术开源社区,旨在为国内更多的技术开发人员提供最前沿的技术资讯,为更多的三维从业者提供一个学习、交流的技术平台。

    联系我们

    • 工作时间:09:00--18:00
    • 反馈邮箱:1315785073@qq.com
    快速回复 返回顶部 返回列表