找回密码
 马上注册

QQ登录

只需一步,快速开始

查看: 16999|回复: 8

在Android手机上用Python读回传感器信息

[复制链接]
发表于 2011-2-23 22:11:22 | 显示全部楼层 |阅读模式
Android上安装Python的过程见我的那篇长帖。刚才试了一下用Python读回手机上传感器的值。
看了一下SL4A的函数列表(http://code.google.com/p/android-scripting/wiki/ApiReference),和传感器有关的基本上有如下几个:
readSensors
sensorsGetAccuracy
sensorsGetLight
sensorsReadAccelerometer
sensorsReadMagnetometer
sensorsReadOrientation
startSensing
stopSensing


如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
 楼主| 发表于 2011-2-23 22:12:37 | 显示全部楼层
连猜带蒙地写了段代码,测试时去一直不返回值。
想想总归是:
开始,
读传感器值,
结束。
可是为什么总是不返回值呢?
嗯,难道是因为需要反应时间?
于是加了个延时,OK,搞定!
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

 楼主| 发表于 2011-2-23 22:34:02 | 显示全部楼层

程序第1版

  1. import android
  2. import time

  3. droid = android.Android()

  4. droid.startSensing()
  5. time.sleep(1)
  6. print droid.readSensors()
  7. droid.stopSensing()
复制代码

程序可以正常运行,然后,出来了一长串的东东。抄在下面:Result(id=2, result={u'acccuracy': 3, u'pitch': -1.248052365493775, u'xmag': -43.635, u'azimuth': 2.764240360260009, u'zforce': 2.9556195, u'yforce': 9.1528740000000006, u'time': 1298470052.108, u'ymag': 21.25, u'zmag': 80.6875, u'roll': 0.16683030724525452, u'xforce': -0.531193550000000001}, error=None)

哈哈~ 好长的一串,都是些什么啊?
仔细一看,原来Python够实在的,把所有传感器的值都读了一遍,并以Mapping的方式返回。

如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

 楼主| 发表于 2011-2-23 22:39:54 | 显示全部楼层
有没有办法只显示其中的一段呢?比如我想做手机的倾角控制NXT小车的话,感兴趣的,应该是pitch和roll啊。其实挺容易的,改一版:
  1. import android
  2. import time

  3. droid = android.Android()

  4. droid.startSensing()
  5. time.sleep(1)
  6. #print droid.readSensors()
  7. sv = droid.readSensors()
  8. print(sv.result['pitch'])
  9. print(sv.result['roll'])
  10. droid.stopSensing()
复制代码

果然,这次只返回了两个数值。成功~
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

 楼主| 发表于 2011-2-23 22:46:25 | 显示全部楼层
本帖最后由 grant7788 于 2011-2-23 22:55 编辑

可是实际上这样并不能让人完全满意,因为readSensors还是读回了各种传感器的值,只是显示得比较少而已。这样的话操作的时间还会相对只读回一种传感器的值的时间要长。
仔细看APIReference,有单独读回某种传感器的值的函数:

sensorsReadAccelerometersensorsReadAccelerometer()
Returns the most recently received accelerometer values. #返回三个轴的加速度的值
Returns:   a List of Floats [(acceleration on the) X axis, Y axis, Z axis].

sensorsReadMagnetometer()
Returns the most recently received magnetic field values. #返回三个轴的磁场强度
Returns: a List of Floats [(magnetic field value for) X axis, Y axis, Z axis].

sensorsReadOrientationsensorsReadOrientation()
Returns the most recently received orientation values. #返回方向的值,其实是方向,纵倾,横摇。
Returns:  a List of Doubles [azimuth, pitch, roll].
好,再写个程序,每种东东都读一次,
然后,我们感兴趣的是纵倾角和横摇角,做个循环一直读这个。
  1. import android
  2. import time

  3. droid = android.Android()

  4. droid.startSensing()
  5. time.sleep(1)
  6. print droid.readSensors()
  7. print

  8. Ori = droid.sensorsReadAccelerometer()
  9. print("sensorsReadAccelerometer: ")
  10. print(Ori.result)

  11. Ori = droid.sensorsReadMagnetometer()
  12. print("sensorsReadMagnetometer: ")
  13. print(Ori.result)

  14. print("sensorsReadOrientation: ")
  15. while (1):
  16.     Ori = droid.sensorsReadOrientation()
  17.     print(Ori.result)
  18.     time.sleep(0.1)

  19. droid.stopSensing()
复制代码

这个例子中,Ori = droid.sensorsReadOrientation(),读回的Ori实际上是一个结构,其中Ori.result是一个数组,Ori.result[0]放的是方向,
Ori.result[1]放的是纵倾角,
Ori.result[2]放的是横摇角。

如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

 楼主| 发表于 2011-2-23 22:49:49 | 显示全部楼层
本帖最后由 grant7788 于 2011-2-23 22:53 编辑

几张手机上截的图:
1. 有几种方法可以把程序写到SL4A里去:
a. 直接写... 有点儿累,毕竟那个软键盘太小了。
b. 电脑上打好,USB线连手机后,拷贝到micro-sd卡上,让SL4A去找。
c. 可以用二维条码扫描的方式。先不写了,大家有兴趣可以搜一下。哪天有空了我也可能写一下方法。
这个是已经写好,准备运行的Python文件。
py_rdsensor_01.png

2. 按Menu键,弹出的菜单中选择Save & Run
py_rdsensor_02.png

运行的结果。朝不同的方向倾斜手机,看看输出的值有什么变化吗?
py_rdsensor_03.png





如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

 楼主| 发表于 2011-2-23 22:57:44 | 显示全部楼层
嗯,可以读到传感器的值啦,下一步貌似就应该用Python试着连NXT主机了。
这两天就试一下吧... 连续好多天晚睡了,今天准备早点睡,各位晚安。
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

发表于 2011-2-24 16:53:24 | 显示全部楼层
手机 写程序 很酷啊
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

发表于 2012-5-26 15:53:16 | 显示全部楼层
想实现用python 脚本给传感器模拟一个touch的值,不知道需要怎么搞定??
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 马上注册

本版积分规则

QQ|手机版|中文乐高 ( 桂ICP备13001575号-7 )

GMT+8, 2024-5-23 15:04 , Processed in 0.143124 second(s), 22 queries .

Powered by Discuz! X3.5

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表