我正在 Raspberrypi 4B 4Gb 上运行最新的 raspberry pi 操作系统“Linux raspberrypi 5.4.51-v7l+ #1327 SMP Thu Jul 23 11:04:39 BST 2020 armv7l GNU/Linux”。
我已经安装了 Python3
sudo apt-get install python3-dev python3-pip
更新了设置工具、轮子和 pip
sudo python3 -m pip install --upgrade pip setuptools wheel
并安装了 Adafruit_DHT 模块
sudo pip3 install Adafruit_DHT
之后,我将 DHT22 连接到 gpio4 上的 rpi 并创建了以下 python 脚本:
import Adafruit_DHT
import time
from datetime import datetime
DHT_SENSOR = Adafruit_DHT.DHT22
DHT_PIN = 4
PROBE_NAME = "PI4"
humidity, temperature = Adafruit_DHT.read_retry(DHT_SENSOR, DHT_PIN)
if humidity is not …
Run Code Online (Sandbox Code Playgroud) 我正在尝试使用 arduino uno R3 从 DHT-11 传感器读取温度和湿度
#include <DHT.h>
#include <LiquidCrystal.h>
#define DHTPIN A3
#define DHTTYPE DHT11
DHT dht(DHTPIN,DHTTYPE);
LiquidCrystal lcd(5,8,9,10,11,12);
String hum="Humidity:";
String temptext="Temp:";
void setup() {
Serial.begin(9600);
lcd.clear();
lcd.begin(16,2);
dht.begin();
}
void loop() {
float humidity = dht.readHumidity();
delay(500);
float temp = dht.readTemperature();
delay(500);
Serial.println(hum+humidity);
Serial.println(temptext+temp);
lcd.clear();
lcd.print(hum + humidity);
lcd.setCursor(0,2);
lcd.print(temptext+temp);
delay (5000);
}
Run Code Online (Sandbox Code Playgroud)
我确定我的接线是正确的。DHT-11 只报告 NAN 的可能原因是什么?会不会坏了(我刚打开包装)?
嘿,当我运行我的代码时,我收到错误: dex base.apk 的校验和不匹配。我正在使用 Xamarin.forms 构建一个应用程序,并安装插件(https://github.com/CrossGeeks/DeviceSensorsPlugin)来读取传感器数据。
03-26 06:21:42.956 D/OpenGLRenderer( 4376): HWUI GL Pipeline
03-26 06:21:43.475 D/Mono ( 4376): DllImport searching in: '__Internal' ('(null)').
03-26 06:21:43.475 D/Mono ( 4376): Searching for 'java_interop_jnienv_call_nonvirtual_int_method_a'.
03-26 06:21:43.475 D/Mono ( 4376): Probing 'java_interop_jnienv_call_nonvirtual_int_method_a'.
03-26 06:21:43.476 D/Mono ( 4376): Found as 'java_interop_jnienv_call_nonvirtual_int_method_a'.
03-26 06:21:43.847 D/Mono ( 4376): Image addref System.Xml[0xca4a39a0] -> System.Xml.dll[0xca4aec00]: 2
03-26 06:21:43.851 D/Mono ( 4376): Prepared to set up assembly 'System.Xml' (System.Xml.dll)
03-26 06:21:43.852 D/Mono ( 4376): Assembly System.Xml[0xca4a39a0] added to …
Run Code Online (Sandbox Code Playgroud) 我想使用 Swift 获取 iPhone 上气压计的压力值。有人可以告诉我该怎么做吗?我用来CLLocation
访问海拔高度。可以用同一个类来进行压力吗?
编辑:
我将以下内容放入我的viewDidLoad()
方法中,但它没有打印任何内容...请告知。
let altimeter = CMAltimeter()
if CMAltimeter.isRelativeAltitudeAvailable() {
altimeter.startRelativeAltitudeUpdates(to: OperationQueue.current!, withHandler: { data, error in
if !(error != nil) {
print("Relative Altitude: \(data?.relativeAltitude)")
print("Relative Pressure: \(data?.pressure)")
self.pressLabel.text = String(describing: data?.pressure)
}
})
}
Run Code Online (Sandbox Code Playgroud) 长话短说
为什么我得到的加速度计值
Sensor.TYPE_ACCELEROMETER
略有偏移?我指的不是重力,而是因轴和手机而异的一些小误差。我可以校准加速度计吗?或者是否有补偿这些错误的标准方法?
我正在开发一个应用程序,需要尽可能精确的加速度测量(主要是垂直加速度,即与重力方向相同)。
我做了很多测试,结果发现我得到的原始值Sensor.TYPE_ACCELEROMETER
是错误的。如果我让手机完全水平放置且屏幕朝上,则加速计显示的 Z 值为 9.0,其应约为 9.81。同样,如果我将手机置于纵向或横向模式,X 和 Y 加速度计值显示约为 9.6。而不是 9.81。
这当然会影响我的垂直加速度,因为我正在使用 来SensorManager.getRotationMatrixFromVector()
计算垂直加速度,导致垂直加速度根据设备的旋转而偏离不同的量。
现在,在有人抢先提出我应该尝试使用Sensor.TYPE_LINEAR_ACCELERATION
替代方法之前,我必须指出我实际上也在这样做,与TYPE_ACCELERATION
. 然后,通过使用重力传感器,我计算垂直加速度(如本答案中所述)。有趣的是,我得到的结果与使用原始加速度计SensorManager.getRotationMatrixFromVector()
和矩阵乘法(最后减去重力)的方法完全相同。
我能够在任何旋转中为固定电话获得几乎完全为零的垂直加速度的唯一方法是获取原始加速度计值,添加偏移量(来自早期的观察,即 和)X+0.21
,然后执行旋转矩阵内容以获得世界坐标系加速度。请注意,因为不仅仅是计算出的垂直加速度是错误的 - 它实际上是来自 的原始值,我认为它排除了陀螺仪传感器等其他误差源?Y+0.21
Z+0.81
Sensor.TYPE_ACCELEROMETER
我在两部不同的手机(三星 Galaxy S5 和索尼 Xperia Z3 紧凑型)上进行了测试,两者都有这些加速度计值偏差 - 但当然,两部手机上的值并不相同。
为什么 的值Sensor.TYPE_ACCELEROMETER
会偏离,有没有更好的方法来“校准”加速度计,而不是简单地观察它们偏离重力的程度并在使用它们之前将差异添加到值中?
我已经编写了一个JS SDK,可以监听移动设备的旋转,并提供3个输入:
?:角度可以在0到360度之间变化
吗?:-180至180度之间的角度
?:-90至90度之间的角度
我曾尝试使用Euler Angles确定设备方向,但遇到了万向节锁定效应,当设备指向上方时,该计算会爆炸。这导致我使用Quaternion,而不受万向节锁定效应的影响。
我已经找到了可转换?,?的js库。和?到四元数,因此对于以下值:
?:81.7324
?:74.8036
吗?:-84.3221
我得到这个四元数的ZXY订单:
w:0.7120695154301472
x:0.6893688637611577
y:-0.10864439143062626
z:0.07696733776346154
码:
var rad = Math.PI / 180;
window.addEventListener("deviceorientation", function(ev) {
// Update the rotation object
var q = Quaternion.fromEuler(ev.alpha * rad, ev.beta * rad, ev.gamma * rad, 'ZXY');
// Set the CSS style to the element you want to rotate
elm.style.transform = "matrix3d(" + q.conjugate().toMatrix4() + ")";
}, …
Run Code Online (Sandbox Code Playgroud) 我正在开发一个跨平台增强现实库,我的 Android 代码运行良好,但我在 iOS 上遇到了问题。我正在使用 Android 的TYPE_ROTATION_VECTOR传感器,它会生成SensorEvent。此事件返回一个包含 5 个值的数组(如此处所述),这些值用于生成旋转矩阵(使用此方法)。我只对前 4 个值感兴趣。它们被描述为:
\n\n\nSensorEvent.values[0] x *sin(\xce\xb8/2)
\nSensorEvent.values[1] y *sin(\xce\xb8/2)
\nSensorEvent.values[2] z *sin(\xce\xb8/2)
\nSensorEvent.values[3] cos(\xce\xb8/2)
\n
上述链接继续说
\n\n\n旋转矢量传感器 (TYPE_ROTATION_VECTOR) 以单位四元数的形式提供设备相对于地球坐标系的方向。具体来说,旋转矢量将设备的方向表示为角度和轴的组合,其中设备绕轴 < x , y\n, z > 旋转了角度 \xce\xb8 。旋转向量的前四个元素等于单位四元数 x sin(\xce\xb8/2)、y sin(\xce\xb8/2)、z\n*sin(\xce\xb8 /2)>. 旋转向量的元素是无单位的。
\n
iOS 中的 CoreMotion 提供了四元数读取,但它似乎与 Android 的 TYPE_ROTATION_VECTOR 值没有关联(至少不是直接关联)。我也尝试过 deviceMotionattitude.rotationMatrix
直接尝试过deviceMotion的值,但没有用。
所以我的问题是:在iOS中,如何获得相当于Android的TYPE_ROTATION_VECTOR的传感器值?
\n我最近购买了一块gy-521 板,我尝试通过以下连接将其与 Raspberry Pi 3 一起使用
RPi3 | GY-521
---------------------
3.3V <-------> Vcc
GND <-------> GND
SCL <-------> SCL
SDA <-------> SDA
Run Code Online (Sandbox Code Playgroud)
使用i2cdetect -y 1
我获得以下信息
0 1 2 3 4 5 6 7 8 9 a b c d e f
00: -- -- -- -- -- -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: -- -- -- …
Run Code Online (Sandbox Code Playgroud) 我对 IMU 的短期位置跟踪进行了很多研究,但似乎找不到任何东西。很多人说用加速度计跟踪位置是不可能的,但这一切都是在长期位置跟踪的背景下进行的。我只是在寻找不到一秒钟的东西。
我用谷歌搜索了一下,发现了这个视频。
这显示了使用 IMU 来实现这一点,但是当我对加速度进行二重积分时,它变得非常混乱。关于如何解决这个问题有什么建议吗?卡尔曼滤波器能解决一些问题吗?
在android.googlesource.com上测试了重大运动示例以了解有关此触发传感器的更多信息。不幸的是,传感器没有触发。我做错了什么?
代码狙击手
class TriggerListener extends TriggerEventListener {
private Context mContext;
private TextView mTextView;
TriggerListener(Context context, TextView textView) {
mContext = context;
mTextView = textView;
}
@Override
public void onTrigger(TriggerEvent event) {
if (event.values[0] == 1) {
mTextView.append(mContext.getString(R.string.sig_motion) + "\n");
mTextView.append(mContext.getString(R.string.sig_motion_auto_disabled) + "\n");
}
}
}
public class MainActivity extends AppCompatActivity {
private SensorManager mSensorManager;
private Sensor mSigMotion;
private TriggerListener mListener;
private TextView mTextView;
@Override
protected void onPause() {
super.onPause();
if (mSigMotion != null) mSensorManager.cancelTriggerSensor(mListener, mSigMotion);
}
@Override
protected …
Run Code Online (Sandbox Code Playgroud)