陀螺仪+X+Y+Z文档格式.docx

上传人:b****2 文档编号:5138075 上传时间:2023-05-04 格式:DOCX 页数:15 大小:224.08KB
下载 相关 举报
陀螺仪+X+Y+Z文档格式.docx_第1页
第1页 / 共15页
陀螺仪+X+Y+Z文档格式.docx_第2页
第2页 / 共15页
陀螺仪+X+Y+Z文档格式.docx_第3页
第3页 / 共15页
陀螺仪+X+Y+Z文档格式.docx_第4页
第4页 / 共15页
陀螺仪+X+Y+Z文档格式.docx_第5页
第5页 / 共15页
陀螺仪+X+Y+Z文档格式.docx_第6页
第6页 / 共15页
陀螺仪+X+Y+Z文档格式.docx_第7页
第7页 / 共15页
陀螺仪+X+Y+Z文档格式.docx_第8页
第8页 / 共15页
陀螺仪+X+Y+Z文档格式.docx_第9页
第9页 / 共15页
陀螺仪+X+Y+Z文档格式.docx_第10页
第10页 / 共15页
陀螺仪+X+Y+Z文档格式.docx_第11页
第11页 / 共15页
陀螺仪+X+Y+Z文档格式.docx_第12页
第12页 / 共15页
陀螺仪+X+Y+Z文档格式.docx_第13页
第13页 / 共15页
陀螺仪+X+Y+Z文档格式.docx_第14页
第14页 / 共15页
陀螺仪+X+Y+Z文档格式.docx_第15页
第15页 / 共15页
亲,该文档总共15页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

陀螺仪+X+Y+Z文档格式.docx

《陀螺仪+X+Y+Z文档格式.docx》由会员分享,可在线阅读,更多相关《陀螺仪+X+Y+Z文档格式.docx(15页珍藏版)》请在冰点文库上搜索。

陀螺仪+X+Y+Z文档格式.docx

要实现指南针,只需要这个就可以了(不考虑设备非水平的情况);

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的游戏来爽一爽了。

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 求职职场 > 社交礼仪

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2