|
我在 http://www.ourdev.cn/bbs/bbs_content.jsp?bbs_sn=4666414&bbs_page_no=1&bbs_id=3072 中提到的问题现向大家做一个
终结。究竟什么因素导致GPS寻星缓慢,原因不必复述。那么在某种特定要求下通过某种办法来更新星历提高寻星速度是否可行,
答案是肯定的。典型应用就是移动运营商的AGPS。由我的实验来看,在GPS冷启操作之后导入正确的星历数据(还有年历),GPS会
在20秒内(甚至更短)实现3D定位,效果自不必说。那么在大家熟悉的NMEA模式下能否导入星历数据来实现快速定位呢?答案却是
否定的。NMEA只是各GPS厂商所遵循的通讯规范,并没有涉及到星历和年历数据,相信大家也找不到。只有GPS在厂家自已的特定
操作下才会有更高级的设置。
基于SIRF III的GPS设备就是在其二进制模式下来操作底层一些的东西的。大家对C3-370升级固件不陌生,那就是在SIRF的二进制
模式下操作的。废话不多说了进入正题,先说说SiRF二进制的概念吧。
SiRF二进制格式指令有包头(2byte)、信息长度(2byte)、信息内容(<1023byte)、校验和(2byte)与包尾(2byte)构成。
其包头内容固定为0xA0、0xA2,包尾内容固定为0xB0、0xB3。校验和是信息内容中所有字节的累加和。信息长度与校验和都是高
8位在前低8位在后的小端格式。
切换至SiRF二进制模式是由NMEA语句的$PSRF100来执行的,设置好波特率即可。具体请参考NMEA手册。
进入到SiRF二进制模式后有好多NMEA语句无法完成的专用指令,下面讲述如何读写年历和星历数据,来加快GPS寻星的速度。没
玩过吧,现在开始了。
刚刚已执行过切换操作,现通过执行0x92命令来读取当前的年历数据,具体的执行语句为:
A0 A2 00 02 92 00 00 92 B0 B3
年历数据为448个16位有符号类型的数据组成,代表了32颗不同卫星的相对状态,每颗卫星有14个数据。年历数据实际有效数据为
896个字节,其时效期可长达数月。以下为Almanac Collection Time(UTC): Wed Apr 13 08:05:23 2011的年历数据。
以第1行为例,一个长度为30(0x1E)字节的消息体,回复编号为0xOE,即年历数据。第0x01号的卫星数据为:56 C1....4A 3A。
A0 A2 00 1E 0E 01 56 C1 41 32 B0 90 1D 81 FD 58 00 A1 0D 28 81 E3 F2 BA 0A 09 27 3D 33 06 00 2C 4A 3A 0A 12 B0 B3
A0 A2 00 1E 0E 02 97 C1 42 53 63 7B FE 1A FD 4D 00 A1 0D 8F FA 87 D4 84 B5 AC 8C E3 5E 2B 00 2D B7 18 0D A8 B0 B3
A0 A2 00 1E 0E 03 97 C1 43 73 78 63 F6 BD FD 22 00 A1 0C B9 CB 69 6D 2C 0F 4D 46 B3 D8 5C 00 23 BB E4 0D 4A B0 B3
A0 A2 00 1E 0E 04 97 C1 44 4E 70 63 FD 82 FD 43 00 A1 0C A6 FB 45 F7 1D 38 79 C3 08 97 0B 00 77 D9 E3 0D 86 B0 B3
A0 A2 00 1E 0E 05 97 C1 45 12 5E 63 07 F6 FD 25 00 A1 0C B5 25 CD 70 0A BC 58 8E 9D 2E ED FF C3 5D 23 0D 0C B0 B3
A0 A2 00 1E 0E 06 97 C1 46 36 BF 63 FB 6C FD 2C 00 A1 0C B8 CE 66 33 DE 7A 82 9A B4 A3 D1 FC 51 5A E7 0F 90 B0 B3
A0 A2 00 1E 0E 07 97 C1 47 23 21 63 14 E8 FD 5C 00 A1 0C FE 7B 92 E0 80 DD 0E 02 CC 41 01 00 07 9D 1E 0B 85 B0 B3
A0 A2 00 1E 0E 08 97 C1 48 5E 3C 63 23 0C FD 6F 00 A1 0C 81 7E 9C B4 82 7B 94 ED 2B ED 01 00 03 D3 00 0B B7 B0 B3
A0 A2 00 1E 0E 09 97 C1 49 8C D8 63 1A BB FD 63 00 A1 0D 0E 7A 67 10 3F 93 F0 E6 DD BF 09 00 36 A4 2F 0C B7 B0 B3
A0 A2 00 1E 0E 0A 97 C1 4A 52 F2 63 04 AA FD 1F 00 A1 0C 45 26 C7 10 1C BA 9C 99 39 33 F6 00 14 A1 E7 0C 23 B0 B3
A0 A2 00 1E 0E 0B 97 C1 4B 5F E2 63 DC B3 FD 1C 00 A1 0B 89 F0 FD 89 25 70 D2 08 86 56 ED FF EA F5 CD 10 96 B0 B3
A0 A2 00 1E 0E 0C 97 C1 4C 1E 9E 63 14 E3 FD 39 00 A1 0D B1 A6 87 DD F6 8D AF 02 47 26 FE 00 31 DE 52 0D 73 B0 B3
A0 A2 00 1E 0E 0D 97 C1 4D 26 98 63 1E E6 FD 61 00 A1 0C 96 53 D5 1F 49 C6 72 68 9D 20 24 00 00 69 19 0B 19 B0 B3
A0 A2 00 1E 0E 0E 97 C1 4E 2E 1B 63 1A 5D FD 57 00 A1 0C DE 52 DB 89 AA 79 3D 68 77 80 12 00 3D 65 0D 0A FA B0 B3
A0 A2 00 1E 0E 0F 97 C1 4F 1B DE 63 04 F9 FD 36 00 A1 0C 5D 4F D3 00 FD DB 33 57 A7 8F EE 00 28 E8 2C 0D 3E B0 B3
A0 A2 00 1E 0E 10 97 C1 50 34 1B 63 15 8E FD 39 00 A1 0D D3 A7 41 65 FA 32 9D A2 36 33 EA FF EE 3A 79 0D 7D B0 B3
A0 A2 00 1E 0E 11 97 C1 51 33 45 63 0B F9 FD 49 00 A1 0D 8C D1 C0 B7 9D F9 EE 76 46 A3 18 00 06 E2 75 0D C7 B0 B3
A0 A2 00 1E 0E 12 97 C1 52 63 67 63 FA 2D FD 15 00 A1 0C 36 26 93 BF A3 E5 76 AE 23 81 11 00 2B 50 AB 0C 12 B0 B3
A0 A2 00 1E 0E 13 97 C1 53 3B 13 63 0A 60 FD 48 00 A1 0C C0 D3 F5 C8 FF C1 D6 5B 68 59 EE FF FC 27 84 0F 6F B0 B3
A0 A2 00 1E 0E 14 97 C1 54 26 38 63 FA 49 FD 13 00 A1 0C F4 24 61 27 34 6E 5C BD E1 13 06 00 0C B4 1F 0A C3 B0 B3
A0 A2 00 1E 0E 15 97 C1 55 90 7A 63 F9 59 FD 3E 00 A1 0D C2 FB A0 23 9F 00 7E E1 C2 26 EE FF E3 94 FE 10 40 B0 B3
A0 A2 00 1E 0E 16 97 C1 56 2D 08 63 F8 AD FD 11 00 A1 0D 21 26 BF BF AF A2 4E 8E 36 34 13 00 18 44 EE 0B 84 B0 B3
A0 A2 00 1E 0E 17 97 C1 57 3A 74 63 0E 6A FD 46 00 A1 0C 28 51 09 05 7F 93 4F 4A 52 E4 29 FF E5 94 0E 0B 64 B0 B3
A0 A2 00 1E 0E 18 97 C1 58 31 87 63 04 2B FD 48 00 A1 0D 5F FD 6B 55 F4 03 FC 2B E6 98 32 00 22 A2 5D 0C 1E B0 B3
A0 A2 00 1E 0E 19 97 C1 59 05 43 63 0D 96 FD 2F 00 A1 0C E4 A5 55 E0 21 1D DF BF BA 0D FF 00 1D BD 9E 0C D7 B0 B3
A0 A2 00 1E 0E 1A 97 C1 5A A7 DE 63 1D 5A FD 5C 00 A1 0C D9 53 A5 2F 2E 51 D8 3C 41 1A E9 FF AD 24 7D 0D 63 B0 B3
A0 A2 00 1E 0E 1B 97 C1 5B B1 37 63 19 27 FD 66 00 A1 0D 2F 79 59 DF CC 71 D0 64 D5 5B 21 00 33 DA 50 0C 77 B0 B3
A0 A2 00 1E 0E 1C 97 C1 5C 8A F4 63 14 6F FD 37 00 A1 0D 1B A7 8D 62 B2 F3 A4 91 4E D5 04 00 26 6C 6B 0C D3 B0 B3
A0 A2 00 1E 0E 1D 97 C1 5D 16 49 63 0C 41 FD 4A 00 A1 0B F2 D2 17 FD CD 4F 21 EC 1D 64 1A 00 2A C3 BE 0C 29 B0 B3
A0 A2 00 1E 0E 1E 97 C1 5E 67 69 63 0B 64 FD 2C 00 A1 0C D1 A4 26 75 3D F1 75 6E 10 0D 2C 00 26 FB C7 0B AC B0 B3
A0 A2 00 1E 0E 1F 97 C1 5F 3F 95 63 18 46 FD 62 00 A1 0C CA 7B 9D F0 D8 B5 67 03 17 8E 08 00 3B 62 AC 0C 44 B0 B3
A0 A2 00 1E 0E 20 97 C1 60 63 E7 63 08 69 FD 26 00 A1 0D 20 29 6E 3F DF 62 17 20 4E EB E1 FF C9 CA 33 0D 22 B0 B3
以上是32颗卫星的年历数据,当转换为10进制时这些数据是:
22209, 16690, -20336, 7553, -680, 161, 3368, -32285, -3398, 2569, 10045, 13062, 44, 19002
-26687, 16979, 25467, -486, -691, 161, 3471, -1401, -11132, -19028, -29469, 24107, 45, -18664
-26687, 17267, 30819, -2371, -734, 161, 3257, -13463, 27948, 3917, 18099, -10148, 35, -17436
-26687, 17486, 28771, -638, -701, 161, 3238, -1211, -2275, 14457, -15608, -26869, 119, -9757
-26687, 17682, 24163, 2038, -731, 161, 3253, 9677, 28682, -17320, -29027, 12013, -61, 23843
-26687, 17974, -16541, -1172, -724, 161, 3256, -12698, 13278, 31362, -25932, -23599, -943, 23271
-26687, 18211, 8547, 5352, -676, 161, 3326, 31634, -8064, -8946, 716, 16641, 7, -25314
-26687, 18526, 15459, 8972, -657, 161, 3201, 32412, -19326, 31636, -4821, -4863, 3, -11520
-26687, 18828, -10141, 6843, -669, 161, 3342, 31335, 4159, -27664, -6435, -16631, 54, -23505
-26687, 19026, -3485, 1194, -737, 161, 3141, 9927, 4124, -17764, -26311, 13302, 20, -24089
-26687, 19295, -7581, -9037, -740, 161, 2953, -3843, -30427, 28882, 2182, 22253, -22, -2611
-26687, 19486, -24989, 5347, -711, 161, 3505, -22905, -8714, -29265, 583, 9982, 49, -8622
-26687, 19750, -26525, 7910, -671, 161, 3222, 21461, 8009, -14734, 26781, 8228, 0, 26905
-26687, 20014, 7011, 6749, -681, 161, 3294, 21211, -30294, 31037, 26743, -32750, 61, 25869
-26687, 20251, -8605, 1273, -714, 161, 3165, 20435, 253, -9421, 22439, -28690, 40, -6100
-26687, 20532, 7011, 5518, -711, 161, 3539, -22719, 26106, 12957, -24010, 13290, -18, 14969
-26687, 20787, 17763, 3065, -695, 161, 3468, -11840, -18531, -1554, 30278, -23784, 6, -7563
-26687, 21091, 26467, -1491, -747, 161, 3126, 9875, -16477, -6794, -20957, -32495, 43, 20651
-26687, 21307, 4963, 2656, -696, 161, 3264, -11275, -14081, -15914, 23400, 23022, -4, 10116
-26687, 21542, 14435, -1463, -749, 161, 3316, 9313, 10036, 28252, -16927, 4870, 12, -19425
-26687, 21904, 31331, -1703, -706, 161, 3522, -1120, 9119, 126, -7742, 9966, -29, -27394
-26687, 22061, 2147, -1875, -751, 161, 3361, 9919, -16465, -23986, -29130, 13331, 24, 17646
-26687, 22330, 29795, 3690, -698, 161, 3112, 20745, 1407, -27825, 19026, -7127, -27, -27634
-26687, 22577, -30877, 1067, -696, 161, 3423, -661, 22004, 1020, 11238, -26574, 34, -23971
-26687, 22789, 17251, 3478, -721, 161, 3300, -23211, -8159, 7647, -16454, 3583, 29, -16994
-26687, 23207, -8605, 7514, -676, 161, 3289, 21413, 12078, 20952, 15425, 6889, -83, 9341
-26687, 23473, 14179, 6439, -666, 161, 3375, 31065, -8244, 29136, 25813, 23329, 51, -9648
-26687, 23690, -2973, 5231, -713, 161, 3355, -22643, 25266, -3164, -28338, -11004, 38, 27755
-26687, 23830, 18787, 3137, -694, 161, 3058, -11753, -563, 20257, -5091, 25626, 42, -15426
-26687, 24167, 26979, 2916, -724, 161, 3281, -23514, 30013, -3723, 28176, 3372, 38, -1081
-26687, 24383, -27293, 6214, -670, 161, 3274, 31645, -3880, -19097, 791, -29176, 59, 25260
-26687, 24675, -6301, 2153, -730, 161, 3360, 10606, 16351, 25111, 8270, -5151, -55, -13773
将年历数据写入到GPS要执行0x82命令来写入当前的年历数据,具体的执行语句为(数据是上面读出的例子):
A0 A2 03 81 82 56 C1....CA 33 xx xx B0 B3
长度为897(0x381)字节的消息体,命令编号为0x82(命令编号也是消息体的一部分),即年历数据。数据为第1号卫星到第32号卫星的所
有数据。xx xx为该消息体的校验和。
设备收到有效写入数据后将回复A0 A2 00 02 0C 82 00 8E B0 B3,即0x82指令已经确认,年历数据更新完成。
关键的星历数据操作来啦。通过执行0x93命令来读取当前的星历数据,具体的执行语句为:
A0 A2 00 03 93 00 00 00 93 B0 B3
以下为北纬37.632东经115.613 (UTC)13 08:16:54 2011的部分星历数据(4颗星):
长度为92(0x5C)字节的消息体,0x0F为消息编号,即星历数据,后面的0x16是当前编号为22的卫星数据,内容为:00 16 00 5D...F2 A7。
A0 A2 00 5C 0F 16 00 16 00 5D F0 26 97 D2 00 4F 1B DE BC 3B 46 70 30 64 D0 02 DB 57 48 12 00 FF FC 13 B3 FE 00 16 00
5D D5 2A 57 00 81 3E 03 FE BE 3C 76 00 9F 02 D0 30 0F 0A 92 A1 0D 9E 56 48 12 7E 00 16 00 5D D5 AC FF F2 26 CA 0A E0
00 16 25 F0 F8 FF 21 24 AF 97 CE B0 FF 9F 37 57 F2 A7 26 2B B0 B3
A0 A2 00 5C 0F 1E 00 1E 00 5D C0 A7 97 D1 00 57 1B DE BC 3B 46 70 30 64 D0 02 EF 47 48 12 00 00 19 2C 1D A9 00 1E 00
5D C1 29 47 FB 62 36 49 DE 92 35 54 FC 56 06 76 7E A6 08 38 A1 0D 43 04 48 12 7D 00 1E 00 5D C1 AF FF A4 A4 30 51 5A
00 45 27 1C 64 F0 26 48 3D E9 08 6E FF A0 61 47 03 04 20 35 B0 B3
A0 A2 00 5C 0F 1F 00 1F 00 5D C0 A7 97 D0 00 5F 1B DE BC 3B 46 70 30 64 D0 02 E4 32 48 12 00 00 2D 08 A4 A3 00 1F 00
5D C1 29 32 09 41 2C 16 73 99 27 11 08 39 03 FA 1B FC 10 7A A1 0D 20 D2 48 12 7E 00 1F 00 5D C1 AF 00 2F 7B A6 EC 9F
00 0D 27 EA 6F 8D 1D AD D8 AD 8B 59 FF A9 C1 32 0F 4B 20 97 B0 B3
A0 A2 00 5C 0F 20 00 20 00 5D C0 A7 97 D0 00 5F 1B DE BC 3B 46 70 30 64 D0 02 F9 87 48 12 00 FF BF E1 4E CA 00 20 00
5D C1 29 87 FF FA 35 44 90 D5 02 5F 00 0A 06 3D 5E 4E 0B 58 A1 0D 95 A2 48 12 7D 00 20 00 5D C1 AF 00 01 29 78 38 7C
00 5B 26 EC EF B5 21 CC DF 59 7F 28 FF A6 BC 87 F2 30 24 DE B0 B3
以上4颗卫星的星历数据转换为10进制为:
22, 93, 61478, 38866, 79, 7134, 48187, 18032, 12388, 53250, 56151, 18450, 255, 64531, 46078, 22, 93, 54570, 22272,
33086, 1022, 48700, 30208, 40706, 53296, 3850, 37537, 3486, 22088, 4734, 22, 93, 54700, 65522, 9930, 2784, 22, 9712,
63743, 8484, 44951, 52912, 65439, 14167, 62119
30, 93, 49319, 38865, 87, 7134, 48187, 18032, 12388, 53250, 61255, 18450, 0, 6444, 7593, 30, 93, 49449, 18427, 25142,
18910, 37429, 21756, 22022, 30334, 42504, 14497, 3395, 1096, 4733, 30, 93, 49583, 65444, 42032, 20826, 69, 10012, 25840,
9800, 15849, 2158, 65440, 24903, 772
31, 93, 49319, 38864, 95, 7134, 48187, 18032, 12388, 53250, 58418, 18450, 0, 11528, 42147, 31, 93, 49449, 12809, 16684,
5747, 39207, 4360, 14595, 64027, 64528, 31393, 3360, 53832, 4734, 31, 93, 49583, 47, 31654, 60575, 13, 10218, 28557,
7597, 55469, 35673, 65449, 49458, 3915
32, 93, 49319, 38864, 95, 7134, 48187, 18032, 12388, 53250, 63879, 18450, 255, 49121, 20170, 32, 93, 49449, 34815, 64053,
17552, 54530, 24320, 2566, 15710, 19979, 22689, 3477, 41544, 4733, 32, 93, 49583, 1, 10616, 14460, 91, 9964, 61365, 8652,
57177, 32552, 65446, 48263, 62000
哪些卫星的星历数据有效,将出现该编号卫星的数据。星历数据的有效期仅为几小时。
将星历数据写入到GPS要执行0x95命令来写入,具体的执行语句为:
A0 A2 00 5B 95 00 16 00 5D F0 26 97 D2 00 4F....F2 A7 xx xx B0 B3
A0 A2 00 5B 95 00 1E 00 5D C0 A7 97 D1 00 57....03 04 xx xx B0 B3
A0 A2 00 5B 95 00 1F 00 5D C0 A7 97 D0 00 5F....0F 4B xx xx B0 B3
A0 A2 00 5B 95 00 20 00 5D C0 A7 97 D0 00 5F....F2 30 xx xx B0 B3
每次只能写入一颗卫星的星历数据,即每次写入合计99字节。
每执行完一条指令后设备将回复A0 A2 00 02 0C 95 00 A1 B0 B3,即0x95指令已经确认,当前卫星的星历数据更新完成。
至此年历和星历数据已经写入到GPS设备中了,数据时效正确的话应该很快就可以定位了。手机中SIRF方案的AGPS辅助定位也只能这么操
作。具体的年历和星历数据内容标准定义请参考ICD-GPS-200文档说明,我们只是把GPS中有效数据读出来再写到冷启后的GPS中,其他的
具体应用就不做探讨啦。
其实在SiRF二进制模式下有比NMEA模式更大的权限,操作与解析的方法也更加严谨和方便(传说中的静态导航步行模式也在该模式下设置,
注意0x8F指令,呵呵)。当然NMEA则是通用的语法,兼容性没的说。在二进制模式下大家不必感到陌生,只要看好手册,核对好波特率绝
对没有问题。
以上所获取的数据及操作方法在基于SIRF III的C3-370上调试成功。好啦,以9600波特率,切换回NMEA方式下继续调试吧。
A0 A2 00 18 81 02 01 01 00 01 01 01 05 01 01 01 00 01 00 01 00 01 00 01 00 01 25 80 01 3A B0 B3
SiRF Binary Protocol Reference Manualourdev_630632MBRZ3W.pdf(文件大小:2.28M) (原文件名:SiRF2-Navman.pdf)
程序配合一下,更明白些了。
unsigned char Almanac_Data[448*2]; //年历数据占用448个字即896个字节
unsigned char Ephemeris_Data[32][45*2]; //星历数据为32颗卫星,每颗卫星占用45个字即90个字节
/****************************************************************************
【功能说明】将GPS由NMEA切换至SIRF二进制模式下,波特率为57600
****************************************************************************/
void Switch_to_SiRF57600(void)
{
UART_SendStr(GPS,"$PSRF100,0,57600,8,1,0*37\r\n");
}
/****************************************************************************
【功能说明】将GPS由SIRF二进制模式切换至NMEA下,波特率为4800
****************************************************************************/
void Switch_to_NMEA4800(void)
{
unsigned char i;
unsigned char NMEA4800[32]={0xA0,0xA2,0x00,0x18,0x81,0x02,0x01,0x01,\
0x00,0x01,0x01,0x01,0x05,0x01,0x01,0x01,0x00,0x01,0x00,0x01,0x00,0x01,\
0x00,0x01,0x00,0x01,0x12,0xC0,0x01,0x67,0xB0,0xB3};
for (i=0;i<sizeof(NMEA4800);i++)
{
UART_SendByte(GPS,NMEA4800);
}
}
/****************************************************************************
【功能说明】在SIRF二进制模式下,设置年历数据
****************************************************************************/
void Set_Almanac(void)
{
unsigned char Head[5]={0xA0,0xA2,0x03,0x81,0x82};
unsigned short i;
unsigned short sum;
for (i=0;i<sizeof(Head);i++)
{
UART_SendByte(GPS,Head); //发送设置年历指令
}
sum = 0x82; //该指令也是消息体的一部分,也参与校验
for (i=0;i<sizeof(Almanac_Data);i++)
{
UART_SendByte(GPS,Almanac_Data);
sum += Almanac_Data;
}
UART_SendByte(GPS,sum>>8);
UART_SendByte(GPS,sum&0xFF); //发送校验和
UART_SendByte(GPS,0xB0);
UART_SendByte(GPS,0xB3); //发送包尾结束数据
}
/****************************************************************************
【功能说明】在SIRF二进制模式下,设置星历数据
****************************************************************************/
void Set_Ephemeris(void)
{
unsigned char Head[5]={0xA0,0xA2,0x00,0x5B,0x95};
unsigned short i,j;
unsigned short sum;
for (i=0;i<32;i++) //共有32颗卫星数据将要逐次发送
{
if ((Ephemeris_Data[0]==0x00) && (Ephemeris_Data[1]==0x00))
{
continue; //卫星数据无效的不用发送
}
else
{
for (j=0;j<sizeof(Head);j++)
{
UART_SendByte(GPS,Head[j]); //发送设置星历指令
}
sum = 0x95; //该指令也是消息体的一部分,也参与校验
for (j=0;j<90;j++)
{
UART_SendByte(GPS,Ephemeris_Data[j]);
sum += Ephemeris_Data[j];
}
UART_SendByte(GPS,sum>>8);
UART_SendByte(GPS,sum&0xFF); //发送校验和
UART_SendByte(GPS,0xB0);
UART_SendByte(GPS,0xB3); //发送包尾结束数据
}
}
} |
阿莫论坛20周年了!感谢大家的支持与爱护!!
一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。
|