陀螺仪+X+Y+Z文档格式.docx
《陀螺仪+X+Y+Z文档格式.docx》由会员分享,可在线阅读,更多相关《陀螺仪+X+Y+Z文档格式.docx(15页珍藏版)》请在冰点文库上搜索。
要实现指南针,只需要这个就可以了(不考虑设备非水平的情况);
2.pitch仰俯:
绕X轴转动的角度(-180<
=pitch<
=180),如果设备水平放置,前方向下俯就是正,如图:
前方向上仰就是负值;
求磁sensor的y和z反正切可得到此角度值。
3.roll滚转:
绕Y轴转动(-90<
=roll<
=90),向左翻滚是正值
向右翻滚是负值;
求z和x的反正切可得到此值。
sensors.h中还定义了其他各种sensor。
要实现的就是这两个:
1#defineSENSOR_TYPE_MAGNETIC_FIELD2
2
3#defineSENSOR_TYPE_ORIENTATION3
复制代码
在/hardware/sensors/sensors.cpp中添加对MAGNETIC_FIELD和ORIENTATION的支持
简单的说一下怎样添加,下面的代码不完整,请参考/sdk/emulator/sensors/sensors_qemu.c
4//加入需要的宏定义
5#defineID_BASESENSORS_HANDLE_BASE
6#defineID_ACCELERATION(ID_BASE+0)
7#defineID_MAGNETIC_FIELD(ID_BASE+1)
8#defineID_ORIENTATION(ID_BASE+2)
9#defineS_HANDLE_ACCELEROMETER(1<
<
ID_ACCELERATION)
10#defineS_HANDLE_MAGNETIC_FIELD(1<
ID_MAGNETIC_FIELD)
11#defineS_HANDLE_ORIENTATION(1<
ID_ORIENTATION)
12#defineSENSORS_NUM4
13#defineSUPPORTED_SENSORS((1<
NUM_SENSORS)-1)
14//在sensor_tsensors_list[]中添加两个sensor的信息,
15//这些只是一些Sensor的信息,应用程序可以获取到。
16#ifdefMAGNETIC_FIELD
17{
18name:
"
XXX3-axisMagneticfieldsensor"
19vendor:
XXXcompany"
20version:
1,
21handle:
S_HANDLE_MAGNETIC_FIELD,
22type:
SENSOR_TYPE_MAGNETIC_FIELD,
23maxRange:
600.0f,//最大范围
24resolution:
30.0f,//最小分辨率
25power:
6.7f,//这个不太懂
26},
27#endif
28#ifdefORIENTATION
29{
30name:
XXXOrientationsensor"
31vendor:
32version:
33handle:
S_HANDLE_ORIENTATION,
34type:
SENSOR_TYPE_ORIENTATION,
35maxRange:
360,
36resolution:
0.1,
37power:
20,
38},
39#endif
40//定义一个结构来保存orientation的信息
41staticstructorientation{
42floatazimuth;
43floatpitch;
44floatroll;
45}orientation;
46//在control__open_data_source()函数中打开设备
47staticnative_handle_t*
48control__open_data_source(structsensors_control_device_t*dev)
49{
50SensorControl*ctl=(void*)dev;
51native_handle_t*handle;
52intfd_m=open(MAGNETIC_DATA_DEVICE,O_RDONLY);
53LOGD("
OpenMagneticDatasource:
%d,%d/n"
fd_m,errno);
54if(fd_m>
=0)
55{
56dev->
fd[ID_MAGNETIC_FIELD]=dup(fd_m);
57}
58returnhandle;
59}
60//实现数据的打开和关闭函数
61staticint
62data__data_open(structsensors_data_device_t*dev,native_handle_t*handle)
63{
64structsensors_data_context_t*dev;
65dev=(structsensors_data_context_t*)device;
66for(inti=0;
i<
SENSORS_NUM;
i++)
67{
68dev->
fd[i]=dup(handle->
data[i]);
69}
70native_handle_close(handle);
71native_handle_delete(handle);
72return0;
73}
74staticint
75data__data_close(structsensors_data_device_t*dev)
76{
77structsensors_data_context_t*dev;
78dev=(structsensors_data_context_t*)device;
79
80for(inti=0;
81{
82if(dev->
fd[i]>
83{
84close(dev->
fd[i]);
85}
86dev->
fd[i]=-1;
87}
88return0;
89}
90//最关键的poll函数
91staticint
92data__poll(structsensors_data_device_t*dev,sensors_data_t*values)
93{
94SensorData*data=(void*)dev;
95intfd=data->
events_fd;
96//判断设备是否打开
97if(dev->
fd[ID_MAGNETIC_FIELD]<
0)
98{
99LOGD("
In%sdev[%d]isnotopen!
/n"
__FUNCTION__,ID_MAGNETIC_FIELD);
100return-1;
101}
102pollfdpfd[SENSORS_NUM]=
103{
104//省略其他sensor代码
105{
106fd:
dev->
fd[ID_MAGNETIC_FIELD],
107events:
POLLIN,
108revents:
109},
110//省略其他sensor代码
111};
112interr=poll(pfd,SENSORS_NUM,s_timeout);
113
114unsignedintmask=SUPPORTED_SENSORS;
115staticunsignedintpoll_flag=0;
116if(poll_flag==0)
117{
118poll_flag=mask;
119}
120//省略其他sensor
121if(poll_flag&
(1<
ID_MAGNETIC_FIELD))
122{
123if((pfd[ID_MAGNETIC_FIELD].revents&
POLLIN)==POLLIN)
124{
125charrawData[6];
126err=read(dev->
fd[ID_MAGNETIC_FIELD],&
rawData,sizeof(rawData));
127if(err<
0)
128{
129LOGE("
readmagneticfieldret:
%derrno:
%d/n"
err,errno);
130returnerr;
131}
132structtimespect;
133clock_gettime(CLOCK_REALTIME,&
t);
134data->
time=timespec_to_ns(&
135data->
sensor=SENSOR_TYPE_MAGNETIC_FIELD;
136data->
magnetic.status=SENSOR_STATUS_ACCURACY_HIGH;
137//上报的数据单位要转换成uTesla
138data->
magnetic.x=((rawData[1]<
8)|rawData[0])/MAGNETIC_CONVERT;
139data->
magnetic.y=((rawData[3]<
8)|rawData[2])/MAGNETIC_CONVERT;
140data->
magnetic.z=((rawData[5]<
8)|rawData[4])/MAGNETIC_CONVERT;
141
142//把陀螺仪需要的数据计算出来,用atan2(),头文件要加上#include<
math.h>
143floatazimuth=atan2((float)(data->
magnetic.x),(float)(data->
magnetic.y));
144if(azimuth<
145{
146azimuth=360-fabs(azimuth*180/PI);
147}
148else
149{
150azimuth=azimuth*180/PI;
151}
152orientation.azimuth=360-azimuth;
153
154//rotationaroundtheXaxis.+180~-180degree
155orientation.pitch=atan2((float)(data->
magnetic.y),(float)(data->
magnetic.z)
156)*180/PI;
157//rotationaroundtheYaxis+90~-90degree
158floatroll=atan2((float)(data->
magnetic.z))
159*180/PI;
160if(roll>
90)
161{
162roll=-(180.0-roll);
163}
164elseif(roll<
-90)
165{
166roll=180+roll;
167}
168orientation.roll=roll;
169}
170returnS_HANDLE_MAGNETIC_FIELD;
171}
172if(poll_flag&
173{
174//数据已经计算好了直接上报就行
175structtimespect;
176clock_gettime(CLOCK_REALTIME,&
177data->
178data->
sensor=SENSOR_TYPE_ORIENTATION;
179data->
orientation.azimuth=orientation.azimuth;
180data->
orientation.pitch=orientation.pitch;
181data->
orientation.roll=orientation.roll;
182poll_flag&
=~(1<
ID_ORIENTATION);
183returnS_HANDLE_ORIENTATION;
184}
185}
写好后可以用一个叫做sensorlist的程序先测试一下,看报上去的数据是否正常。
然后可以试试一个叫做PacificNavyFighter的游戏来爽一爽了。