当前位置:  编程技术>移动开发
本页文章导读:
    ▪[ZZ]GPS漂移的有关问题与看法        [ZZ]GPS漂移的问题与看法 个人认为:便携式GPS导航仪漂移在日常使用中除了与卫星定位有关系以外,还与厂家生产的工艺流程有关系的,因为QC即品质部检验员对产品及其工作流程的定义不同,.........
    ▪ 武林传刀剑江湖录(上)攻略        武林传刀剑江湖录(下)攻略 游戏名称:武林传——刀剑江湖录(中) 游戏大小:752kb 游戏封面: 游戏操作: 《主菜单操作》 方向键:移动选项 左软键:确定,右软键:返回 《游戏.........
    ▪ Thread&Handle 施用       Thread&Handle 使用 Thread&Handle   本次以进度提示为例 讲解Thread&Handle的使用   [前提] 1. Thread * 启动:start() * 停止:stop() * 定制化: 填充 void run() 2. Handler * 使用: sendMessage() / sendEmptyM.........

[1][ZZ]GPS漂移的有关问题与看法
    来源: 互联网  发布时间: 2014-02-18
[ZZ]GPS漂移的问题与看法
个人认为:便携式GPS导航仪漂移在日常使用中除了与卫星定位有关系以外,还与厂家生产的工艺流程有关系的,因为QC即品质部检验员对产品及其工作流程的定义不同,就会出现以上所说的漂移问题,因为每次组装完毕的机器,每台大家都要到外面空旷的地方搜星,测试搜星速度,一般以秒为基准,如果品质员对产品要求检验严格控制,那么搜星慢的就会挑选出来,进行折机检查,其次定位偏移严重性,一般为5-10米,如果偏移严重,也会同样被挑选下来,进行折机检查,在折机检查中,部份会送去维修组,进行零件的替换,如搜星模块、天线、屏蔽胶等。因此,见意大家购买机型时,多观察一下产品,不要因为同样机型的产品,价格便宜就购买了,现在的厂商偷工减料的比较多(如:应该用进口的,采用国产的;应该打胶固定显示屏的,懒得去打胶;应该换搜星模块的,将就一下子,就混入消费者手中了),产品品质的质量以及工程师和其操作员的素质以及职业道德决定了机器的使用寿命和质量。这是城市漫步一直坚持的品质流程。不说了,大家购买,多注意一下:严格的品质管理、强大的售后服务、价格适中的产品,才是市场需求力。
             在GPS行业呆了些年了,经常看到各大论坛的大侠讨论关于漂移的问题,谈一些自己的看法,水平有限,不足之处请多指正。     1、GPS定位的原理
     要搞清楚这个问题,首先要从GPS的定位原理讲起,从数学角度来讲,就是空间已知三点的位置,以及你到这三点的相对距离,求你的位置,这是立体几何里一个很简单的问题,是GPS的数学原理。     对应到实际应用中,已知三点的位置 ,就是天上的三颗卫星,因为卫星是按照“星历”精确运行的,所以它在某一时间的位置我们可以知道,这就满足了数学原理里的第一个解题条件;第二个条件是需要知道你到这三颗卫星的相对距离,卫星发射特定的无线电信号,你的GPS接收机收到这个信号之后来比对时间差,因为无线电的传播速度是已知的,所以通过这个时间差就可以算出你相对于卫星的距离。两个条件都满足了,你的位置也就出来了。以上只是对于GPS原理的一个简单描述,实际应用还要复杂得多,事实上达到3D定位,至少需要4颗卫星,多出的一颗是用来授时的。有兴趣的朋友可以查阅相关资料来满足你的好奇心。


     2、漂移的产生原因
     明白了GPS的定位原理,我们就会发现,虽然数学原理是很简单的,但是要通过物理手段实现两个已知条件,是很复杂的事情。首先,卫星在天上飞,谁也不敢保证它能一丝不差的在自己的轨道上,总会有或多或少的偏差。其次,你的GPS接收机上也不可能安个铯原子钟,无线电波的传播速度每秒大约是30万公里,简单计算一下你就会发现,如果时间误差了0.00001秒,那距离差了多少呢?即使你的时间不会有误差,无线电波在空气中的传播也会受到很多因素的影响,比如天气。以上的影响还不是最主要的,更重要的影响原因是你能收到多少卫星信号。GPS的信号是很微弱的,接收机上那么小一个陶瓷天线,你还指望能有什么太好的效果吗?所以基本上有什么东西阻挡的话,你就会收不到信号,即使你收到了十颗八颗信号很强的卫星,就一定会很准确了吗?非也,假如你正好赶上这十颗卫星都扎成一堆开会,或者排成一条整齐的队伍放学回家,那你惨了。
      定位是不是精确,卫星的分布位置也是一个非常重要的影响因素,好的状态是强信号的卫星以等边三角形的状态分布于天窮的3个角落,相对距离尽量的大,不要排列在近似一条直线上,这是由GPS的数学原理决定的。以上所讲的,还都只不可控的技术误差,属于”天灾“的范畴,自古以来,“天灾”是从来离不开“人祸”的,当科技发展的水平已经足够把这些误差降到很低的时候,你还会发现另一个十分尴尬的问题就是:人家压根就不想让你得到这么高的精度。大家知道,民用的GPS和军用的接收频点是不一样的,民用的有扰码,是专门给你捣乱用的!       明白了以上内容,你就会发现,太多的因素影响到了GPS的定位精度,,也就导致了你站在原地不动的时候,每秒钟计算出来你的坐标位置都不同,把这些点连成线的时候,你看到的再也不是平滑的运行轨迹,而是另人十分揪心的一团乱麻,这也就是我们平时讨论比较多的漂移。

3、我们如何对待这个问题

     通过以上的思考,我们会发现,漂移事实上是不可避免的。

      GPS的设备,跟PC机差不多,N(N->∞)多家厂商在做集成,但有能力生产CPU的,就那么几家(SiRF、MTK...)。事实上比PC还要简单一些,主要工作都是主芯片完成的,实力一点的集成商,自己设计线路板,生产相应的模块。山寨一点的就直接采购生产好的工业模块,装上壳子印上logo就去卖了。标准的GPS接收和蓝牙的工业模块都很容易买到,有兴趣的朋友也可以自己攒一台。
      说以上这些,是为了让大家明白,生产蓝牙GPS模块,事实上是没有什么技术含量的活,只要不是太山寨的厂商,都能保质保量的完成这个任务。跟做包子一样,原料和技术都差不多,不管是狗不理,还是韩包子,虽然味道可能不同,但总归都是外边有皮,里边有馅的。最大的差别就是选择不同的主芯片,比如SiRF或者MTK,这二者的关系有点象Intel和AMD,差别是有的,但都可以用。不同的芯片可能在功耗和算法上有所不同,但实际面对应用层来说,区别是不大的。
      经常看到有人提某某芯片的接收信号好,其实这个问题就象讨论Intel CPU的电脑和AMD CPU的电脑哪个安全性更高一样无聊。套用一句俗语叫:老母猪追兔子,那压根就不是它的任务。天线模块才是负责接收信号的,信号的强弱是一个物理问题,与芯片没有关系,芯片只是负责处理接收到的信号,当然,这里涉及到一个对信号处理的算法问题,科学的算法可以提高信号的辨识度以及减少误差的影响,但并不能真正提高信号接收的物理水平。对信号起到关键作用的是天线,天线的构造分平板式和螺旋式的,也很难说清哪个好哪个坏,不同的技术,各有优劣,但总体上来讲一寸长、一寸强的原则是没错的,如果你愿意背着一个锅盖大的天线,我想肯定比你现在的效果好得多。     那既然不同厂商的差不多,不同芯片的也差不多,难道说不同的GPS真的就没有什么差别吗?没错,我基本上就是这样认为的。读到这里,可能有人会骂我了,难道没有看到网上N多的对于不同芯片、不同品牌的评测吗?漂移、冷启动、热启动。。。一大堆血淋淋的数据,难道不能说明什么吗?确实可以说明一些问题,比如,作者代理的是哪个厂商的产品,或者哪个厂商给钱多。三百六十行里除了办证的、卖发票的,还有一个行业叫“枪手”,我就亲眼所见一篇文章把两个产品说成天壤之别,结果不幸就是我前面提到的公板OEM,只是壳子不一样。现在枪手的水平已经越来越高了,经常忽悠人于无形,上街裸奔确实可以吸引眼球,但过后不太容易收场,不如慢工出细活,小火文炖,看起来象技术文章,实际上引导你买东西。
     当然,我们也看到一些比较中立朋友的评测数据,确实有差别。比如经常说的手持机的漂移就小,我自己也有2台手持机,经过对比,确实发现漂移要小得多,什么原因呢?有一个成语叫“粉饰太平”,用来说明这个问题最合适不过了。比如一个小煤矿出事死了几十人,当地领导一研究,怎么办呢?让这些人再活过来是不可能的了,但可以让他们消失。于是往上边报的时候几十个就变成几个了,大问题变成小问题了。GPS厂商的工程师们可比这些当地领导聪明多了,所以这种方法多半也想得出来。很多配有失量地图的导航设备,大家会发现我们的轨迹会老老实实的落在道路里边,是它的精度高地图好吗?其实都不是,原因只有一个,在道路外边的点被软件硬生生的“拉”了回来,说好听点叫校正“。
手持机也有这种校正功能,因为是软、硬件一体的,而且应用也很单一,就是徒步行走,所以很容易为这种应用而进行一些软件上的优化,比如,软件侦测到了在很短的时间内发生了一个相对较大距离的位移,那就很可能认为这是计算误差造成的,因为普通的徒步行为不可能达到那么高的速度,当然你失足从山上滚下来除外。对于这种判断为有误差的点,很简单,直接和谐掉,所以,你会看到基本上没有漂移,不是不漂移,而是漂移被和谐掉了。。。这种”和谐“的做法,从主芯片到应用软件,都有这种机制,我们会经常看到在某些应用软件里,让你选择移动方式是徒步、自行车还是汽车,事实上就是为这种”和谐“来选择一种最合适的优化校正方案。


     了解了这些情况,我们不难明白,这种和谐的校正并不是万能的,而且是一把双刃剑,有可能把不该和谐的也给和谐掉,还是小煤窑的例子,实际死了100个,应该报多少呢?这是个问题,而且是个麻烦的问题。报死了1个,没人信,一看就是假的,报死了99个?太多帽子保不住。聪明的领导会寻找一个平衡,即不让报告看起来太假,又可以混得过去。GPS也一样,不同的厂商、不同的软件,优化校正的方法是不一样的,与具体应用和技术思路有关。看到这里大家就明白了,漂移小不能说明精度就高,因为你拿到的是一份和谐过的报告,是有水分的。手持机因为应用明确,软件硬件都是一体的,所以配合好。而蓝牙模块是不管应用的,只是一个信号接收和初步分析的设备,具体你是接到本本上还是手机上,你是徒步还是放在车里用,都是看你爱好,所以不同的软件、芯片、应用,都会有不同的表现,而且也提供了修改相关参数的机制,聪明的你应该学会按自己的需求来调整设备,搞清楚自己想要的是什么,而不是盲目的去比较谁的漂移大。  

    
[2] 武林传刀剑江湖录(上)攻略
    来源: 互联网  发布时间: 2014-02-18
武林传刀剑江湖录(下)攻略
游戏名称:武林传——刀剑江湖录(中)

游戏大小:752kb

游戏封面:

游戏操作:

《主菜单操作》

方向键:移动选项

左软键:确定,右软键:返回

《游戏操作》

2,4,6,8键及方向键四方向移动

5键:攻击和对话

3键:跳跃,9键:大招

0键:查看怪物血和名称

*:使用金疮药

#:使用百年人参

左软键:调处游戏菜单

游戏改变的地方:1。游戏封面换了

2.聂凡身后的刀的颜色,款式。

游戏介绍:旧恨未了又添新仇至爱真情震撼江湖风云,武林传3再续前缘

游戏任务:武林传—刀剑江湖录(中)聂凡决定下山,走前玄悲告诉聂凡,聂凡修炼的易筋经过快,已有走火入魔的迹象,希望聂凡想通到少林一行!

一个月后,少林寺山脚下,一僧人将聂凡带到玄悲。聂凡这次来一是为了玄空,二是为易筋经而来。玄空已经不将玄空的事放在心上,玄空想为聂凡解决易筋经的事情。原来练习易筋经要有佛法辅助,也是玄空决定传洗髓经给聂凡,但是要皈依佛教。。。玄空好賊。。聂凡放不下红尘,于是决定通过少林寺的考验。考验共分3关,每一关都会遇到不同能力的对手。3关铜人阵的属性分别是寒冰,毒,眩晕。顺利的打败了铜人,回去向玄空习得洗髓经。经过一个月的学习,聂凡的内功更加精进了。此时,突然有少林弟子来报,山下的稻香村(周杰伦新歌的名字。。。),突然聚集了大批的武林人士,据说是为附近的一口古墓而来,聂凡先行一步,玄空随后在去。

来到稻香村,进门就看见展松鹏和赵行龙在讨论古墓的事,他们商量去钱不尽钱长老召集的村中客栈去,在去客栈的途中又遇到丁二老和王道长。在去客栈路口的老者那接到去少林山门寻找3颗草药的任务。        

(得到还阳补血丹十个)在客栈的商人那接到消灭村东的盗墓贼和山贼,只要消灭他们并到达右下角就行(得到还阳补血丹十个,钱5000)。进入客栈钱长老正在讲诉关于古墓的事,这个古墓是前朝大将军的墓,内有大量财宝,门口有8个大字“入门一步,必死无赦”。而且挖墓的几个村民全全在第二天死了。村民侄女林月芳亲眼目睹其父之死,其父在挖完墓后第二天中毒而死。王道长是解毒高手,于是众人决定一起去古墓。进洞口前得到5颗怯毒散。

顺着指标走到古墓后段,在古墓后端的左上角进去遇到林月芳,她正身陷幽冥鬼徒的包围中。消灭幽冥鬼徒救出林月芳,调查密室,在右上角中毒(怎么每部都中毒。。。。)被带到古墓密室。这些幽冥鬼徒张口闭口讲的都是钱。。。众人要想活命只有拿钱来俗。。。聂凡说到自己并没有中毒,幽冥鬼徒退下,聂凡又对众人说自己中毒,幽冥鬼徒继续上前,发现聂凡事实上没中毒,一群幽冥鬼徒一起上!!!聂凡将其打败并将解药拿到。回到密室将林月芳安全送出古墓。(注意怪物是不会攻击林月芳的,和林月芳保持一定距离)。走出门发现王府士兵说众人偷官银,玄空出现,和将军说一个月把剩下的官银找到,就可将众人释放。回到村子找到马夫去辽北边城。马夫赠送给聂凡一头白马良驹。消灭盗贼,马夫方可出现,要想在城里骑马还要马证。

来到边城,林月芳说很累,要去客栈休息,聂凡与其一起来到客栈,这时,看见古董商人走出客栈,聂凡追出去。在客栈的商人处接到去丐帮收集15条蛇的任务,要杀15条蛇就行,会得到5本武林秘笈和5000经验。走出客栈向右边找到古董商人,进门需解华容道。。。将曹操向左移动一下就行

进入仓库第一层,一路向前到第二层,到右上角进门。听见古董商人和钱不尽在商讨丐帮帮主的事情。这时候出现2个剧情,一个是上前揭发钱不尽,一个是不揭发。

揭发:出去打败钱不尽,钱不尽逃跑,古董商人自杀,从古董商人身上得到太平王府令牌,在窗口边捡到鲁,萧2个长老的令牌。老钱没爆什么好东西。。。

不揭发:躲到屋檐上,等钱不尽走了在出来,古董商人自杀,从古董商人身上得到太平王府令牌。

回到客栈看见几个丐帮弟子进入,原来他们进去邀请武林人士观看丐帮帮

    
[3] Thread&Handle 施用
    来源: 互联网  发布时间: 2014-02-18
Thread&Handle 使用

Thread&Handle

 

本次以进度提示为例 讲解Thread&Handle的使用

 

[前提]

1. Thread 
* 启动:start()
* 停止:stop()
* 定制化: 填充 void run()


2. Handler
* 使用: sendMessage() / sendEmptyMessage()
* 接受&处理:定制化 void handleMessage(Message message)

 

 

典型用法:

public class ThreadUsage extends Activity {
	public final static int MESSAGE_SAMPLE = 19;
	TextView text;
	ProgressBar pBar;
	
	Handler sHandler;
	Thread sThread;
	
	/** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        text = (TextView)findViewById(R.id.text);
        
        sThread = new Thread(){
        	public void run(){
        		while(true){
					try {
						Thread.sleep(10);
					} catch (InterruptedException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
					
					Message m = new Message();
					m.what = MESSAGE_SAMPLE;
					
					sHandler.sendMessage(m);
				}
        	}
        };
        
        sThread.start();
        
        sHandler = new Handler(){
        	public void handleMessage(Message msg) {
        		int i = msg.what;
        		
        		if(i == MESSAGE_SAMPLE){
        			String s = text.getText().toString();
    				
    				text.setText(s+".");
        		}
        		else {
        			//un-support message type
        		}
            }
        };
        
    }
}

 

 

 

[代码 步骤]

1. 定义 running.xml 布局:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="horizontal"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >
<TextView  
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:id="@+id/text"
    android:paddingLeft="10dip"
    android:text="is running"
    />
<TextView  
    android:layout_width="100dip" 
    android:layout_height="wrap_content" 
    android:id="@+id/progress"
    android:text="................."
    />
<Button  
    android:layout_width="100dip" 
    android:layout_height="wrap_content" 
    android:id="@+id/buttonOK"
    android:text="OK!"
    />
</LinearLayout>

 

 

 2. 定义 RunningDialog 构造函数 并根据参数 创建目标AlertDialog

public RunningDialog(Activity a,String title,Drawable d){
		activity = a;
		
		initialView(activity);
		
		aBuilder = new AlertDialog.Builder(activity);
		aBuilder.setTitle(title).setIcon(d).setView(runningView);
		
		aDialog = aBuilder.create();
		
		installUpdate();
	}

 

private void initialView(Activity a){
		runningView = a.getLayoutInflater().inflate(R.layout.running, null);
		
		progress = (TextView)runningView.findViewById(R.id.progress);
		btnOK = (Button)runningView.findViewById(R.id.buttonOK);
		
		btnOK.setOnClickListener(new OnClickListener(){

			@Override
			public void onClick(View arg0) {
				// TODO Auto-generated method stub
				end();
			}
        	
        });
	}

 

 

3. 定义Thread&Handle 定时刷新TextView显示

private void installUpdate(){
		updateHandler = new Handler(){
			public void handleMessage(Message msg) {
        		int i = msg.what;
        		
        		if(i == MESSAGE_TOGO){
        			updateProgress();
        		}
        		else {
        			//un-support message
        		}
            }
		};
		
		updateThread = new Thread(){
			public void run(){
        		while(true){
					try {
						Thread.sleep(100);
					} catch (InterruptedException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}

					Message m = new Message();
					m.what = MESSAGE_TOGO;
					
					updateHandler.sendMessage(m);
				}
        	}
		};
		
	}
	
	private void updateProgress(){
		count++;
		
		String string = progress.getText().toString();
		
    	if(count >= 10){
    		progress.setText(".");
    		count = 0;
    	}
    	else {
    		progress.setText(string+".");
    	}
		
    	progress.setTextSize(20);
	}

 

 

4. 定义2个函数 分别用于显示/取消该AlertDialog

public void start(){
		if(isResume){
			updateThread.resume();
		}
		else {
			updateThread.start();
			isResume = true;
		}
		aDialog.show();
	}
	
	public void end(){
		updateThread.stop();
		aDialog.dismiss();
		
		updateThread.resume();
	}

 

 

5. 如何使用:

public class RunningDialogTest extends Activity {
	RunningDialog rDialog;
	
	/** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        Drawable d = this.getResources().getDrawable(R.drawable.icon);
        rDialog = new RunningDialog(this,"HelloRunning!",d);
        findViewById(R.id.button).setOnClickListener(new OnClickListener(){

			@Override
			public void onClick(View arg0) {
				// TODO Auto-generated method stub
				rDialog.start();
			}
        	
        });
    }
    
}

 

 

6. emulator 运行截图:

 

 

done! ~~~

 


    
最新技术文章:
▪Android开发之登录验证实例教程
▪Android开发之注册登录方法示例
▪Android获取手机SIM卡运营商信息的方法
▪Android实现将已发送的短信写入短信数据库的...
▪Android发送短信功能代码
▪Android根据电话号码获得联系人头像实例代码
▪Android中GPS定位的用法实例
▪Android实现退出时关闭所有Activity的方法
▪Android实现文件的分割和组装
▪Android录音应用实例教程
▪Android双击返回键退出程序的实现方法
▪Android实现侦听电池状态显示、电量及充电动...
▪Android获取当前已连接的wifi信号强度的方法
▪Android实现动态显示或隐藏密码输入框的内容
▪根据USER-AGENT判断手机类型并跳转到相应的app...
▪Android Touch事件分发过程详解
▪Android中实现为TextView添加多个可点击的文本
▪Android程序设计之AIDL实例详解
▪Android显式启动与隐式启动Activity的区别介绍
▪Android按钮单击事件的四种常用写法总结
▪Android消息处理机制Looper和Handler详解
▪Android实现Back功能代码片段总结
▪Android实用的代码片段 常用代码总结
▪Android实现弹出键盘的方法
▪Android中通过view方式获取当前Activity的屏幕截...
▪Android提高之自定义Menu(TabMenu)实现方法
▪Android提高之多方向抽屉实现方法
▪Android提高之MediaPlayer播放网络音频的实现方法...
▪Android提高之MediaPlayer播放网络视频的实现方法...
▪Android提高之手游转电视游戏的模拟操控
 


站内导航:


特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

©2012-2021,,E-mail:www_#163.com(请将#改为@)

浙ICP备11055608号-3