如果我有一个简单的网页和脚本,如下所示:
<body>
<div id="alpha">a</div>
<div id="beta">b</div>
<div id="gamma">g</div>
</body>
<script>
window.addEventListener('deviceorientation', function(event) {
var alpha = event.alpha;
var beta = event.beta;
var gamma = event.gamma;
document.getElementById("alpha").innerHTML = alpha;
document.getElementById("beta").innerHTML = beta;
document.getElementById("gamma").innerHTML = gamma;
}, false);
</script>
Run Code Online (Sandbox Code Playgroud)
我可以在Android的移动Firefox中打开它,它将输出3个如下所示的数字:
89.256125
3.109375
0.28125
Run Code Online (Sandbox Code Playgroud)
旋转设备时,数字会根据旋转轴而变化.我注意到"alpha"的值非常嘈杂 - 即使手机在桌面上休息,它们也会不间断地反弹,而其他两个保持稳定.我明白阿尔法是我的标题.我好奇的是,它是从指南针(有噪音问题)得到"alpha"值而另外两个来自陀螺仪吗?
另一个问题是当我改变音高时,由于某种原因,标题也会改变,即使我实际上没有改变音标.我只是好奇为什么会这样,以及如何纠正它?
此外,由于陀螺仪测量角速度,我认为这个事件监听器是自动集成的 - 集成算法是否与任何一个一样好?它是否使用加速度计来校正漂移?
在这个谷歌技术讲座视频中,从15:00到19:00,演讲者谈到通过使用加速器来校正陀螺仪固有的漂移,以及校准相对于重力的方向:http://www.youtube .com/watch?v = C7JQ7Rpwn2k 我该怎么做呢?
感谢任何人的见解.
我Sensor.TYPE_ORIENTATION用来确定设备的当前角度,但TYPE_ORIENTATION在API版本8上已弃用.在SensorManager手册中,它指的是使用getOrientation()功能TYPE_ORIENTATION.
这是我的旧代码:
public void onSensorChanged(SensorEvent event) {
Log.d("debug","Sensor Changed");
if (event.sensor.getType()==Sensor.TYPE_ORIENTATION) {
Log.d("debug",Float.toString(event.values[0]));
float mAzimuth = event.values[0];
float mPitch = event.values[1];
float mRoll = event.values[2];
Log.d("debug","mAzimuth :"+Float.toString(mAzimuth));
Log.d("debug","mPitch :"+Float.toString(mPitch));
Log.d("debug","mRoll :"+Float.toString(mRoll));
}
}
Run Code Online (Sandbox Code Playgroud)
我对使用getOrientation()功能感到困惑,有人能告诉我一个如何获得角度的例子吗?
我正在设置Raspberry Pi来记录Sensirion SCD30传感器的数据(CO2,湿度和温度).我的代码在python3中,使用SMBus库通过Pi的GPIO中的I2C引脚与传感器通信.有一个命令可以确定传感器是否准备好发送数据.
该值0x0202通过I2C发送,并返回3个字节的数据:
0x00 0x00 0x81 for data not ready
0x00 0x01 0xB0 for data ready
Run Code Online (Sandbox Code Playgroud)
前两个字节是MSB和数据就绪值的LSB.正确结合他们应该0x0000和0x0001.第三个字节是前两个字节的CRC8.这是用多项式0x31和初始化计算的0xFF.
大约一半的时间,字节以错误的顺序发送.而不是MSB LSB CRC发送MSB CRC LSB.例如,如果数据准备就绪,则可能发送0x00, 0xB0, 0x01而不是0x00, 0x01, 0xB0.我无法弄清楚为什么会发生这种情况,我担心发送数据时会出现一些损坏或问题.我可以更改代码以识别CRC是否是第二个字节,但我想找到潜在的问题.
我正在使用smbus库发送和接收I2C数据.这是我发送命令和读取数据的代码:
bus = smbus.SMBus(0)
I2C_ADDRESS = 0x61
def sendCommand(self, cmd): # sends a 2 byte command (cmd)
data = [0]*2
data[0] = cmd >> 8 # splits 2 byte command into MSB and …Run Code Online (Sandbox Code Playgroud) 我正在为Android平台构建应用程序,我想使用加速度计.现在,我已经找到了一个非常好的传感器仿真应用程序(OpenIntents的SensorSimulator),但是,对于我想要做的事情,我想创建自己的传感器模拟器应用程序.
我还没有找到关于如何做到这一点的信息(我不知道反汇编模拟器的jar是否正确),正如我所说,我想构建一个更小更简单的传感器模拟器版本,更适合我的意图.
你知道我从哪里开始吗?我在哪里可以看到我需要构建的代码片段是什么?
基本上,我只是想要一些方向.
我正在尝试实现一个使用方向传感器的箭头,以指向特定位置.Google地方信息在ListView中为找到的每个地点实施此箭头.
我已经设法获得了方位角,但是给定了一个位置,我不知道如何继续计算我需要的角度.而且,我需要从真正的北方和磁北方进行转换.有没有人有这种实施的例子?
提前致谢.
在过去的几天里,我一直在研究小型指南针应用程序,并且已经启动并运行了代码,但似乎指南针读数不准确.在校准了两部手机之后,我第一次测试了我发现这个,我只是把手机靠在平面上,看着读数然后水平翻转并将它放在同一平面上(180转)并且值得做不改变180*它接近240*.
然后我测试了读数与指南针,有时读数似乎接近,但在其他点,它超过50*关闭.我甚至试图将我的手机和指南针放在地板上以保持指南针远离任何磁干扰同样的结果(注意我也保持指南针和手机分开,通过排列书的边缘使它们保持在同一方向) .
然后我将示例应用程序放在另一部手机上(首先是nexus S,第二个是Motorola droid 1).在两部手机之间,差异的范围是在某些点相等,但最多的点在50到15度之间.
我查看了文档,还浏览了许多不同的论坛帖子,我没有看到任何人有相同的结果.我的代码中可能存在一些小错误,导致我的读数错误地出现,或者一些我没有看到的记录错误.
任何见解或建议将不胜感激!!
继承传感器,我在SensorEventListener类中更改了代码
public void onSensorChanged(SensorEvent event)
{
// If the sensor data is unreliable return
if (event.accuracy == SensorManager.SENSOR_STATUS_UNRELIABLE)
{
Toast.makeText(main.this, "Sensor Status Unreliable",Toast.LENGTH_SHORT).show();
}
// Gets the value of the sensor that has been changed
switch (event.sensor.getType())
{
case Sensor.TYPE_ACCELEROMETER:
m_vfgravity = event.values.clone();
break;
case Sensor.TYPE_MAGNETIC_FIELD:
m_vfgeomag = event.values.clone();
break;
}
if (m_vfgravity != null && m_vfgeomag != null)
{
if(SensorManager.getRotationMatrix(m_vfinR, m_vfI, m_vfgravity, m_vfgeomag))
{
SensorManager.getOrientation(m_vfinR, m_vforientVals);
m_fCompBearing = (float) Math.round((Math.toDegrees(m_vforientVals[0])) …Run Code Online (Sandbox Code Playgroud) 我有一个重要的无限循环,允许传感器不断更新其值.但是,当另一个传感器带来新值时,我想打破这个循环.如何从一个无限循环切换到另一个?
当前代码:
for(;;){
SON_Start();
// Wait 65ms for max range time
delay10ms(7);
// Read Range
i = SON_Read(SON_ADDRESSES[sonarReading]);
// pause
delayMs(100);
if(i<15)
drive(200, RadCW);
}
Run Code Online (Sandbox Code Playgroud)
我想补充一下:
如果Sensor2返回一个读数(例如Sensor2 > 20),那么我想打破循环并转到另一个无限for循环来开始一个新函数.
我正在尝试构建一个简单的增强现实应用程序,因此我开始使用传感器数据.
根据此线程(Android罗盘示例)和示例(http://www.codingforandroid.com/2011/01/using-orientation-sensors-simple.html),使用Sensor.TYPE_ACCELEROMETER和Sensor计算方向. TYPE_MAGNETIC_FIELD并不适合.
所以我无法获得"好"的价值.azimut值根本没有任何意义,所以如果我只是将电话向上移动,则值会发生极大的变化.即使我只是旋转手机,这些值也不代表手机方向.
有谁有想法,谁根据给定的例子提高价值质量?
android sensor orientation augmented-reality compass-geolocation
我正在使用USB蓝牙适配器运行RPi.当我使用hcitool时,我可以发现SmartTag设备.但是当我使用gatttool时,我无法连接.它说"主机停机(112)".这是我的命令:
$ sudo hcitool lescan
LE Scan ...
BC:6A:29:AB:DE:2B (unknown)
BC:6A:29:AB:DE:2B SensorTag
Run Code Online (Sandbox Code Playgroud)
检查我的RPi上的蓝牙适配器我得到:
$ hcitool dev
Devices:
hci0 5C:F3:70:60:E6:1B
Run Code Online (Sandbox Code Playgroud)
然后,当我像这样使用gatttool时,我得到:
$ sudo gatttool -i hci0 -b BC:6A:29:AB:DE:2B -I
[ ][BC:6A:29:AB:DE:2B][LE]>
Run Code Online (Sandbox Code Playgroud)
当我输入connect时,我得到了这个:
[ ][BC:6A:29:AB:DE:2B][LE]> connect
Connecting... connect error: Host is down (112)
[ ][BC:6A:29:AB:DE:2B][LE]>
Run Code Online (Sandbox Code Playgroud)
我在网上发现一些信息说"主机已关闭"意味着蓝牙传感器不在可发现模式.但就SmartTag而言,这是不正确的,因为我按下TI所说的传感器上的一个按钮(侧面按钮)以使其可被发现.hcitool lescan使用同一个来查找设备.还有一个Android应用程序可以在手机上运行,当按下相同的按钮时,它可以扫描,连接和读取SmartTag传感器.
有谁知道问题可能是什么?提前致谢
首先,我是新手,我需要一些帮助!
我有一个LEGO Mindstorms EV3机器人,我下载(LEGO Mindstorms EV3家庭版)来控制EV3.不幸的是,我在上述软件中找不到EV3的源代码.所以,如果有人能告诉我使你能够编程EV3的软件的名称,请!我将不胜感激!
我还下载了(Bricxcc)软件,但它是旧版本.我找不到包含EV3的新版本.
我可以用C语言编写EV3程序吗?或者为传感器添加一些功能?
注意:我用leJOS软件结束用java编写代码它更容易,而且java中的EV3砖有很多资源.祝你一切顺利!
sensor ×10
android ×6
orientation ×3
c ×2
raspberry-pi ×2
for-loop ×1
gatt ×1
gyroscope ×1
hci ×1
i2c ×1
infinite ×1
javascript ×1
location ×1
python ×1
robot ×1
simulation ×1
smbus ×1