北斗簡介

1.北斗衛星導航系統

中國北斗衛星導航系統(BeiDou Navigation Satellite System,BDS)是中國自行研製的全球衛星導航系統.北斗衛星導航系統由空間段、地面段和用戶段三部分組成,可在全球範圍內全天候、全天時爲各類用戶提供高精度、高可靠定位、導航、授時服務,並具有短報文通信能力,已經初步具備區域導航、定位和授時能力,定位精度10米,測速精度0.2米/秒,授時精度10納秒。
系統構成:北斗衛星導航系統空間段由5顆靜止軌道衛星和30顆非靜止軌道衛星組成。

1.北斗一代
由4顆衛星組成,現在只有1C正常工作

北斗一代運用了“有源定位”的方法。導航儀需要向衛星發出信號,由衛星把信號傳給地面站,再由它解算出導航儀的位置,之後發給導航儀.由於是採用少量衛星實現的有源定位,系統在定位精度、用戶容量、定位的頻率次數、隱蔽性等方面均受到限制
2.北斗二代
是中國正在實施的自主發展、獨立運行的全球衛星導航系統,致力於向全球用戶提供定位、導航、授時服務
由23顆組成衛星組成(2007年到2016年)
在計劃中,整個系統將由35顆衛星組成,其中5顆是靜止軌道衛星
2017到2018年1月12日發射了第24,25,26,27顆衛星組成北斗3號
北斗衛星導航系統三步走發展規劃
時間節點 2004 2012 2020
實現目標 區域有源定位 區域無源定位 全球無源定位
北斗二代是一個軍民兩用的系統。項目的主要參與者爲中國人民解放軍總參謀部、總裝備部、國家國防科技工業局、中國科學院、中國航天科技集團公司、中國電子科技集團公司、國防科技大學
現在北斗一代用於國家特種行業領域,二代軍民兩用

2.系統構成

北斗衛星導航系統由空間段、地面段、用戶段組成
1.空間段
北斗衛星導航系統空間段計劃由35顆衛星組成,包括5顆靜止軌道衛星、27顆中地球軌道衛星、3顆傾斜同步軌道衛星.
2.地面段
系統的地面段由主控站、注入站、監測站組成,主控站用於系統運行管理與控制等,注入站用於向衛星發送信號,監測站用於接收衛星的信號,併發送給主控站
3.用戶段
用戶段即用戶的終端,即可以是專用於北斗衛星導航系統的信號接收機,也可以是同時兼容其他衛星導航系統的接收機

3.有源無源定位

定位原理:由於衛星的位置精確可知,在接收機對衛星觀測中,我們可得到衛星到接收機的距離,利用三維座標中的距離公式,利用3顆衛星,就可以組成3個方程式,解出觀測點的位置(X,Y,Z)。考慮到衛星的時鐘與接收機時鐘之間的誤差,實際上有4個未知數,X、Y、Z和鐘差,因而需要引入第4顆衛星,形成4個方程式進行求解,從而得到觀測點的經緯度和高程.
有源時間測距定位:用戶終端通過導航衛星向地面控制中心發出一個申請定位的信號,之後地面控制中心發出測距信號,根據信號傳輸的時間得到用戶與兩顆衛星的距離,北斗一代完全基於此技術,而之後的北斗二代除了使用新的技術外,也保留了這項技術
無源時間測距定位:用戶接收至少4顆導航衛星發出的信號,根據時間信息可獲得距離信息,根據三球交匯的原理,用戶終端自行可以自行計算其空間位置
北斗一代定位:三球交匯原理,先發起位置申請
北斗二代定位:和GPS相同,無線電僞距定位,接收4顆衛星的信號
RNSS英文全稱Radio Navigation Satellite System:由用戶接收衛星無線電導航信號,是一種衛星無線電導航業務,自主完成至少到4顆衛星的距離測量,進行用戶位置,速度及航行參數計算。GPS等系統是典型的RNSS系統。
RDSS英文全稱Radio Determination Satellite Service:是另一種衛星無線電測定業務,用戶至衛星的距離測量和位置計算無法由用戶自身獨立完成,必須由外部系統通過用戶的應答來完成。其特點是通過用戶應答,在完成定位的同時,完成了向外部系統的用戶位置報告,還可實現定位與通信的集成
RDSS協議版本:北斗用戶數據接口協議4.0版,2.1版
RNSS協議版本:一般和GPS一樣是NMEA0183協議

4.信號傳輸

北斗衛星導航系統使用碼分多址技術
北斗衛星導航系統的官方宣佈,在L波段和S波段發送導航信號,在L波段的B1、B2、B3頻點上發送服務信號,包括開放的信號和需要授權的信號。

B1頻點:1559.052MHz-1591.788MHz
B2頻點:1166.220MHz-1217.370MHz
B3頻點:1250.618MHz-1286.423MHz
信息收發:授權用戶擁有北斗衛星導航系統和短報文服務,這項服務僅限於亞太地區。軍用版容量爲120個漢字,民用版49個漢字
北斗波束:波束(wave beam)是指由衛星天線發射出來的電磁波在地球表面上形成的形狀(比如說像手電筒向黑暗處射出的光束。)。主要有全球波束、點形波束、賦形波束。它們由發射天線來決定其形狀。

5.北斗校驗位

校驗和字段是語句中的最後一個字段,它在定界符“”星號之後。是對語句中所有字符異或運算。所有字符指在定界符“$”與“”之間(但不包括這些定界符)的全部字符,兩位ASCII碼錶示

unsigned char check(unsigned char *a){
    unsigned int i;
    unsigned char checksum=0;
    for(checksum=a[1],i=2;a[i]!='*';i++){
        checksum^=a[i]; 
    }

    printf("result=0x%x\n", checksum);

    return checksum;

}
輸入:check("$BDICA,0,00*");
結果:result=0x7d
public class bdtest {

    public static void main(String[] args) {
        byte[] msg = null;
        String bdmessage = "A4";

        try {
            msg = "一二三12".getBytes("GBK");
        } catch (Exception e) {

        }

        //把漢字轉成兩個字節用hexstring 表示
        for(int j=0; j<msg.length;j++){
            String tempStr = Integer.toHexString(msg[j]);
            System.out.println("hexstring:"+tempStr+" length:"+tempStr.length());
            if(tempStr.length() > 2){//如果是漢字
                tempStr = tempStr.substring(tempStr.length()-2);//取最後兩位
                System.out.println(":"+tempStr);
            }
            bdmessage +=tempStr;
        }
        bdmessage = bdmessage.toUpperCase();


        bdmessage = bdmessage.concat("*");
        String data = "$CCTXA,144871,1,2,"+bdmessage;
        System.out.println(data);

         int checksum = CheckSum(data);
            String sum = Integer.toHexString(checksum);
            if(sum.length()<2)
                sum="0"+sum;

            data +=sum;
            data +="\r\n";
            System.out.println("data:"+data);

            //驗證接收
            String dd = "D2BBB6FEC8FD3132";
            byte[] t = HexStringToBytes(dd);
            String recv = "";
            try {
                recv = new String(t,"GBK");
            } catch (Exception e) {

            }
            System.out.println("recv:"+recv);

    }
    //按位異或
    public static int CheckSum(String s){
         String ss = s.substring(1,s.indexOf("*"));

         byte[] bt = ss.getBytes();
         int checksum = bt[0];

         for(int i=1; i<bt.length;i++){
             checksum ^= bt[i];
         }

         return checksum;

     }
    //hextstring 轉bytes
    private static byte[] HexStringToBytes(String s) 
    {
         byte[] bytes;
         bytes = new byte[s.length() / 2];

         for (int i = 0; i < bytes.length; i++) 
         {
             bytes[i] = (byte) Integer.parseInt(s.substring(2 * i, 2 * i + 2),16);
         }

         return bytes;
    }
}

輸出結果:
hexstring:ffffffd2 length:8
:d2
hexstring:ffffffbb length:8
:bb
hexstring:ffffffb6 length:8
:b6
hexstring:fffffffe length:8
:fe
hexstring:ffffffc8 length:8
:c8
hexstring:fffffffd length:8
:fd
hexstring:31 length:2
hexstring:32 length:2
$CCTXA,144871,1,2,A4D2BBB6FEC8FD3132*
data:$CCTXA,144871,1,2,A4D2BBB6FEC8FD3132*4f

recv:一二三12

分割NMEA0183協議

#include <stdio.h>
#include <string.h>
//char *strtok(char s[], char *delim),把字符串s[] 按*delim分隔符分解成字符串數組,其中分隔符可以是多個",//-"均可
int main(){
    char bddata[] = "$BDGGA,062938.00,3110.4700719,N,12123.2657056,E,1,25,0.6,58.9666,M,0.000,M,99,AAAA*4";
    char *p;
    int i=0;
    p = strtok(bddata, ",*");
    printf("bddata: %s\n", p);
    while(1){
        p = strtok(NULL, ",*");
        if(p == NULL)
          break;
    printf("bddata: %s\n", p);
    }


    return 0;

}

bddata: $BDGGA
bddata: 062938.00
bddata: 3110.4700719
bddata: N
bddata: 12123.2657056
bddata: E
bddata: 1
bddata: 25
bddata: 0.6
bddata: 58.9666
bddata: M
bddata: 0.000
bddata: M
bddata: 99
bddata: AAAA
bddata: 4

參考:http://blog.sina.com.cn/s/blog_539b8ff50102wl0n.html
https://baike.baidu.com/item/%E5%8C%97%E6%96%97%E5%8D%AB%E6%98%9F%E5%AF%BC%E8%88%AA%E7%B3%BB%E7%BB%9F/10390403?fr=aladdin

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章