智能家具中室外定位和室内无线信号定位研究

定位技术由来已久。通过GPS,百度,谷歌的定位技术,为目前社交网络发展提供了更进一步的精确和方向,同时也会各种智能家具自动化情景模式提供了解决方案。

室内定位在智能化家具的场景协议处理中具有十分有用,如果能精确的了解室主人的精确位置,就能制定更智能化更节约能源的自动化。比如智能电灯或者插座在主人进屋后自动亮灭,智能风扇在主人离开时自动停止,室内的电动门自动开关等等。

利用室内不同地点的无线发射源,比如WIFI,蓝牙,新BLE技术,可以实现室内定位。假设室内有ABC三个无线设备,根据信号误减算出距离,建立坐标,已知某人位于P(x,y)点,这与A(x1,y1),B(x2,y2),C(x3,y3)的距离分别为a,b,c。求P点座标

可以得到三个方程:

( x1 - x )2 + ( y1- y)2 = a2

( x2 - x)2 + ( y2 -y)2 = b2

( x3 - x)2 + ( y3 -y)2 = c2

使用多项式定理,可以化解方程并求解这个二元二次方程。

或者使用解析几何处理,对原坐标系进行旋转和平移,使A点为原点(0,0),B点位于x轴(d,0),C点在新坐标系为(i,j),根据勾定理和圆的解析方程,得到简化方程

方程1:

a2 = x2 + y2

方程2:

b2 = (x - d)2 + y2

方程3:

c2 = (x - i)2 + (y - j)2

1和2相减得到新坐标系中x的值为
x = (r12 - r22+ d2) / 2d

然后得到y值

y = (r12 - r32- x2 + (x - i)2 + j2) / 2j

而d的值为:

d= (x2-x1)2 + (y2-y1) 2

 

I,j的值是(x3,y3)经过平移和旋转后得到

B原本不在x轴,B顺时针旋转B角度后使其位于X轴,

标准的数学模型中,三个圆会完美的相交于一点,但由于使用无线信号,信号强度衰减既与本身物理属相相关,也与室内装修布局有关,所以实际衰减会比理论衰减更多,所以根据理论衰减度与距离的关系方程算出的距离会比实际偏大。这样得到的圆的半径比实际长,三圆没办法相交于或者相切于一点,而可能是相交于一个区域。理论上来讲,用户处于的某一点就在该区域内。

以view左上角为原点,右为x轴,下为y轴,建立坐标系。计算人在室内的相对位置。

屏幕坐标系中点顺时针和逆时针加平移公式,x1,y1原坐标系坐标,x2,y2为新坐标系坐标,逆时针变换后可以顺时针还原

点顺时针或者坐标轴逆时针

X1=x2cosb-y2sinb+x0

Y1=y2cosb+x2sinb-y0

点逆时针或者坐标轴顺时针

X2=(x1-x0)*cosb+(y1-y0)*sinb

Y2=(y1-y0)*cosb-(x1-x0)*sinb

//BLE1 position
	private int m_x1 = 300;
	private int m_y1 = 180;
	//BLE2 position
	private int m_x2 = 600; //180;
	private int m_y2 = 420; //580;
	//BLE3 position
	private int m_x3 = 180; //600;
	private int m_y3 = 580; //420;
    //user position
	private int m_x = 600;
	private int m_y = 600;
    //
//	private int m_r1 = 130, m_r2 = 300, m_r3 = 300;

//	private int m_xx = 0;
//	private int m_yy = 0;

	/*
	private int m_x1 = 100;
	private int m_y1 = 100;
	//BLE2 position
	private int m_x2 = 400; //180;
	private int m_y2 = 100; //580;
	//BLE3 position
	private int m_x3 = 100; //600;
	private int m_y3 = 400; //420;
    //user position
	private int m_x = 400;
	private int m_y = 400;
	*/
//	private int times = 10000;
	//以A为原点 ,B为x轴上的点,转换坐标系
	public double getSinx(int x, int y, int x1, int y1)
	{
		return (((y-y1)*1.0f)/Math.sqrt((x-x1)*(x-x1)+(y-y1)*(y-y1)));
	}
	public double getCosx(int x, int y, int x1, int y1)
	{
		return (((x-x1)*1.0f)/Math.sqrt((x-x1)*(x-x1)+(y-y1)*(y-y1)));
	}
	//获得B点x坐标
	public int getDD(int x1, int y1, int x2, int y2)
	{
		return ((x2-x1)*(x2-x1)+(y2-y1)*(y2-y1));
	}
	//get new x
	public int getX(int x1, int y1, int x2, int y2, int x3, int y3, int r1,
			int r2, int r3) {
		int x = 0;
		int dd = getDD(x1, y1, x2, y2);
		Log.i(tag, "getX d1=" + dd);
		double d = (Math.sqrt(dd));
		Log.i(tag, "getX d=" + d);
		x = (int) ((r1 * r1 - r2 * r2 + dd) / (2 * d));
		Log.i(tag, "getX x=" + x);
		return x;
	}
	//get old x
	public int getXX(int x, int y, int x2, int y2, int x1, int y1) {
		int nx = 0;
		//x=x‘cost-y‘sint+x0,
		double cosbx = getCosx(x2, y2, x1, y1);
		double sinbx = getSinx(x2, y2, x1, y1);

		nx = ((int)(x*cosbx-y*sinbx))+x1;
		Log.i(tag, "getXX nx=" + nx);
		return nx;
	}
	//get new y
	public int getY(int x1, int y1, int x2, int y2, int x3, int y3, int r1,
			int r2, int r3) {
		int y = 0;
		// y = (r12 - r32 - x2 + (x - i)2 + j2) / 2j
		double cosx = getCosx(x2, y2, x1, y1);
		double sinx = getSinx(x2, y2, x1, y1);
		Log.i(tag, "getY sinx=" + sinx + "cosx="+cosx);
		//int i = (int)(((x3*x2+y3*y2)*1.0f)/Math.sqrt(x2*x2+y2*y2))-x1;//x3 - x1;
		int i = (int)(((x3-x1)*cosx+(y3-y1)*sinx));

		Log.i(tag, "getY i=" + i);
		//int j = (int)(((x2*y3-y2*x3)*1.0f)/Math.sqrt(x2*x2+y2*y2))-y1;//y3 - y1;
		int j = (int)((y3-y1)*cosx-(x3-x1)*sinx);

		Log.i(tag, "getY j=" + j);
		int x = getX(x1, y1, x2, y2, x3, y3, r1, r2, r3);
		y = (int)((r1 * r1 - r3 * r3 - x * x + (x - i) * (x - i) + j * j) / (2 * j));
		Log.i(tag, "getY y=" + y);
		return y;
	}
	//get old y
	public int getYY(int x, int y, int x2, int y2, int x1, int y1) {
		int ny = 0;
		//y=x‘sint+y‘cost+y0.
		//double cosx = getCosx(x2, y2, x1, y1);
		//double sinx = getSinx(x2, y2, x1, y1);
		double cosbx = getCosx(x2, y2, x1, y1);
		double sinbx = getSinx(x2, y2, x1, y1);

		ny = (int)((x*sinbx+y*cosbx))+y1;
		Log.i(tag, "getYY ny=" + ny);
		return ny;
	}
	public int getR1(int x1, int y1, int x, int y) {
		int r1 = 0;

		int d1 = (x1 - x) * (x1 - x) + (y1 - y) * (y1 - y);
		Log.i(tag, "getR1 d1=" + d1);
		double d = Math.sqrt(d1);
		Log.i(tag, "getR1 d=" + d);
		r1 = (int) d;
		return r1;
	}

	public int getR2(int x2, int y2, int x, int y) {
		int r2 = 0;

		int d1 = (x2 - x) * (x2 - x) + (y2 - y) * (y2 - y);
		Log.i(tag, "getR2 d1=" + d1);
		double d = Math.sqrt(d1);
		Log.i(tag, "getR2 d=" + d);
		r2 = (int) d;
		return r2;
	}

	public int getR3(int x3, int y3, int x, int y) {
		int r3 = 0;

		int d1 = (x3 - x) * (x3 - x) + (y3 - y) * (y3 - y);
		Log.i(tag, "getR3 d1=" + d1);
		double d = Math.sqrt(d1);
		Log.i(tag, "getR3 d=" + d);
		r3 = (int) d;
		return r3;
	}
	public Point getManPoint(int x1, int y1, int x2, int y2, int x3, int y3,
			int r1, int r2, int r3) {
		Point p = new Point(0,0);
		for (int j = 0; j < scr_h; j++) {
			for (int i = 0; i < scr_w; i++) {

				if (((i - x1) * (i - x1) + (j - y1) * (j - y1) <= r1 * r1)
						&& ((i - x2) * (i - x2) + (j - y2) * (j - y2) <= r2
								* r2)
						&& ((i - x3) * (i - x3) + (j - y3) * (j - y3) <= r3
								* r3)) {
                        p.set(i, j);
                        return p;
				}
			}
		}
		return p;
	}
	public void setValue(int x1, int y1, int x2, int y2, int x3, int y3, int x, int y)
	{
		this.m_x1 = x1;
		this.m_y1 = y1;
		this.m_x2 = x2;
		this.m_y2 = y2;
		this.m_x3 = x3;
		this.m_y3 = y3;
		this.m_x = x;
		this.m_x = y;
	    this.invalidate();
	}
	void onDrawView(Canvas canvas) {
		// add and modify

		Paint p = new Paint();
		canvas.drawBitmap(img, 0, 0, p);
		p.setColor(Color.BLUE);

		canvas.drawCircle(m_x1, m_y1, 10, p);
		p.setTextSize(50);
		canvas.drawText("A", m_x1+10, m_y1+10, p);
		canvas.drawCircle(m_x2, m_y2, 10, p);
		canvas.drawText("B", m_x2+10, m_y2+10, p);
		canvas.drawCircle(m_x3, m_y3, 10, p);
		canvas.drawText("C", m_x3+10, m_y3+10, p);
		p.setColor(Color.RED);
		canvas.drawCircle(m_x, m_y, 20, p);
		canvas.drawText("P", m_x+20, m_y+20, p);
		p.setColor(Color.BLUE);
		p.setStyle(Paint.Style.STROKE);// 设置空心
		p.setStrokeWidth(10);
		/*
		canvas.drawCircle(m_x1, m_y1, m_r1, p);
		canvas.drawCircle(m_x2, m_y2, m_r2, p);
		canvas.drawCircle(m_x3, m_y3, m_r3, p);

		int x = getX(m_x1, m_y1, m_x2, m_y2, m_x3, m_y3, m_r1, m_r2, m_r3);

		int y = getY(m_x1, m_y1, m_x2, m_y2, m_x3, m_y3, m_r1, m_r2, m_r3);
		x = getXX(x, y, m_x2, m_y2, m_x1);
		y = getYY(x, y, m_x2, m_y2, m_y1);
		canvas.drawCircle(x, y, 100, p);
		*/
		int r1= getR1(m_x1, m_y1, m_x, m_y);
		int r2= getR1(m_x2, m_y2, m_x, m_y);
		int r3= getR1(m_x3, m_y3, m_x, m_y);
		canvas.drawCircle(m_x1, m_y1, r1, p);
		canvas.drawCircle(m_x2, m_y2, r2, p);
		canvas.drawCircle(m_x3, m_y3, r3, p);

		int x = getX(m_x1, m_y1, m_x2, m_y2, m_x3, m_y3, r1+10, r2+10, r3+10);
		int y = getY(m_x1, m_y1, m_x2, m_y2, m_x3, m_y3, r1+10, r2+10, r3+10);
		Log.i(tag, "onDrawView x="+x+"y="+y);
		int xx = getXX(x, y, m_x2, m_y2, m_x1, m_y1);
		int yy = getYY(x, y, m_x2, m_y2, m_x1, m_y1);
		Log.i(tag, "onDrawView xx="+xx+"yy="+yy);
		Log.i(tag, "onDrawView this.m_x="+this.m_x+"this.m_y="+this.m_y);
		p.setColor(Color.YELLOW);
		canvas.drawCircle(xx, yy, 30, p);
	}
时间: 2024-10-07 02:00:12

智能家具中室外定位和室内无线信号定位研究的相关文章

物联网实践之——一步一步&quot;徒手&quot;建立智能家具远程控制系统

首先非常感谢,上篇文章中一些前辈的指导,其中一些意见让我获益匪浅! 关于物联网,我觉得灵魂还是在软件上,前端的各种硬件联网标准一旦形成也就没啥事了,更多的仍然是数据的存储,分析.其实,物联网说白了更是一种数据服务一条龙.从数据的采集到数据的传送以及数据的存储和处理.数据的传送就不用说了,属于通信的范畴,属于宽带和三大运营商的领地,数据的的采集属嵌入式的范畴,数据的存储可能一般的程序员和DBA就可以搞定,最有核心的部分就是数据的分析了,只可惜做数据挖掘和大数据处理的,大都是博士和硕士级别的吧!所以

我们为什么要使用室内人员定位?

随着物联网的逐步发展,定位技术也越来越被人们所熟知.近年来比较火热的定位技术包括:UWB.WIFI.蓝牙.红外.LORA技术等等.当初看到这些的时候我是一脸蒙蔽的,这东西听起来有点高大上啊,可是手机就有定位功能,还贼准(真的吗),整那么多花里胡哨的有啥用,就算不用老美的GPS,国内的北斗也是越来越厉害了啊?看官有所不知,以现在的定位技术来说,GPS也好.北斗也好,只要对精度追求不高,那么室外定位都没有什么问题,可是要想在室内进行高进准定位呢? 我们不去说它们都是利用什么技术,只要明白这些天空之上

一款新型的智能家居WiFi选择方案——SimpleWiFi在无线智能家居中的应用

一款新型的智能家居WiFi选择方案——SimpleWiFi在无线智能家居中的应用 先上图:     随着科学技术的不断发展,局域网也正逐渐向无线化,多网合一的方向发展,在这个多网合一快速发展过程中,带动了多种无线技术的广泛应用,WIFI便是其中的一种.WiFi用于智能家居控制,有着其得天独厚的优势.其优势如下: 优势一:WiFi终端设备现在基本上已经普及,WiFi已经智能手持终端的标配.大到笔记本.Pad,小到手机,WiFi已经是无所不在. 优势二:WiFi作为无线局域网的技术标准,能够通过无线

在智能电视中的实时数据呈现web开发经验分享

先上图,一睹为快. 看到图,身为资源web开发者的你,是不是在大脑中闪现出了一个个的技术名词,websocket.html5.css3(animation/transition).javascript(ajax/setTimeout/setInterval). 同样专注web开发xx年的你,有没有考虑到以下问题: 1.实时数据展现,如果采用ajax定时拉取对现有业务的影响,在DB性能这块,可能导致DB服务死去 2.采用客户端主动拉取还是服务器端的推技术,服务器推技术似乎实现起来太多麻烦,后端的配

Visual Studio 2013 (vs2013)中“向前定位”,“向后定位”按钮

Visual Studio 2013 (vs2013)中默认的界面中似乎没有向前向后定位这个非常实用的功能,下面是把它们找出来的方法: 方法1:右键-->工具栏空白处-->最下面,自定义-->命令-->工具栏-->右侧下位列表中选“文本编辑器”-->添加命令-->左侧列表选视图-->右侧列表中找“向前导航”和“向后导航”(按拼音首字母排序,靠下)-->确定 方法2:任意工具栏的最右键下位箭头-->添加或删除按钮-->自定义,之后同上 Vis

Selenium自动化中DOM,XPATH,CSS定位Web页面对象的优劣性分析

加速IE浏览器自动化执行效率:Selenium自动化中DOM,XPATH,CSS定位Web页面对象的优劣性分析 1.技术背景       在Web应用中,用户通过键盘在输入框中输入值和鼠标点击按钮,链接等.比如在用户名输入框和密码输入框输入正确的用户名和密码,然后点击登录按钮进行登录.在Selenium自动化中,Selenium提供多种API来对HTML元素进行操作,对于每个HTML元素,需要一个可以标识它的标识符,在Selenium中称之为定位器,Selenium支持多种不同类型的定位器,有标

Python3.x:Selenium中的webdriver进行页面元素定位

Python3.x:Selenium中的webdriver进行页面元素定位 页面上的元素就像人一样,有各种属性,比如元素名字,元素id,元素属性(class属性,name属性)等等.webdriver就是利用元素的这些属性来进行定位的. 可以用于定位的常用的元素属性: id name class name tag name link text partial link text xpath css selector 对应于webdriver中的定位一个元素方法分别是: driver.find_e

solidity智能合约中tx.origin的正确使用场景

简介 tx.origin是Solidity的一个全局变量,它遍历整个调用栈并返回最初发送调用(或事务)的帐户的地址.在智能合约中使用此变量进行身份验证会使合约容易受到类似网络钓鱼的攻击. 但针对tx.origin的使用并不用谈虎色变,正确的使用还是有它的应用场景的. 漏洞详解 漏洞合约 在如下合约中使用到了tx.origin的判断. pragma solidity ^0.4.11; // 不要使用这个合约,其中包含一个 bug. contract TxUserWallet { address o

Android定位开发之百度定位、高德定位、腾讯定位,三足鼎立一起为我所用!

这几天的项目不是非常紧.于是想为未来可能要做的项目做一些技术储备. 下一个项目非常有可能是定位开发,须要用到手机定位功能,于是查了查如今比較流行的第三方定位,最火的基本上就是百度定位>高德定位>腾讯定位了. 想了想不如做一个DEMO把三种定位方式混合一下试试. BaiduLocTool.java package com.dhcc.mixlocation; import android.content.Context; import com.baidu.location.BDLocation;