Flutter 鸿蒙传感器数据采集实现:加速度与陀螺仪
·
Flutter 鸿蒙传感器数据采集实现:加速度与陀螺仪
欢迎加入开源鸿蒙跨平台社区! https://openharmonycrossplatform.csdn.net
效果展示


传感器数据演示
运动传感器
- 加速度传感器 (X, Y, Z)
- 陀螺仪传感器 (X, Y, Z)
- 磁力计传感器 (X, Y, Z)
环境传感器
- 光照强度
- 距离传感器
- 温度传感器
- 湿度传感器
- 气压传感器
数据可视化
实时图表
- 数据曲线显示
- 三轴数据对比
- 历史数据记录
实现步骤
1. 传感器管理器实现
核心类设计
class SensorManager {
static final SensorManager _instance = SensorManager._internal();
factory SensorManager() => _instance;
final _accelerometerEvents = StreamController<SensorEvent>();
final _gyroscopeEvents = StreamController<SensorEvent>();
Stream<SensorEvent> get accelerometerEvents => _accelerometerEvents.stream;
Stream<SensorEvent> get gyroscopeEvents => _gyroscopeEvents.stream;
void startAccelerometer() {
accelerometerSensor.listen((event) {
_accelerometerEvents.add(event);
});
}
void startGyroscope() {
gyroscopeSensor.listen((event) {
_gyroscopeEvents.add(event);
});
}
}
2. 加速度传感器
数据采集
StreamSubscription? _accelSubscription;
void startAccelerometer() {
_accelSubscription = accelerometerEvents.listen((event) {
setState(() {
accelX = event.x;
accelY = event.y;
accelZ = event.z;
});
});
}
3. 陀螺仪传感器
角速度数据
StreamSubscription? _gyroSubscription;
void startGyroscope() {
_gyroSubscription = gyroscopeEvents.listen((event) {
setState(() {
gyroX = event.x;
gyroY = event.y;
gyroZ = event.z;
});
});
}
4. 数据可视化
图表绘制
class SensorChartPainter extends CustomPainter {
final List<SensorDataPoint> data;
void paint(Canvas canvas, Size size) {
final paint = Paint()
..style = PaintingStyle.stroke
..strokeWidth = 2;
drawAxis(canvas, size);
drawDataLine(canvas, size, data.map((d) => d.x).toList(), Colors.red);
drawDataLine(canvas, size, data.map((d) => d.y).toList(), Colors.green);
drawDataLine(canvas, size, data.map((d) => d.z).toList(), Colors.blue);
}
}
功能特性
1. 多传感器支持
传感器列表
enum SensorType {
accelerometer,
gyroscope,
magnetometer,
light,
proximity,
temperature,
humidity,
pressure,
}
2. 数据采集
采样控制
void startListening({int sampleRate = 10}) {
final interval = Duration(milliseconds: 1000 ~/ sampleRate);
sensorTimer = Timer.periodic(interval, (timer) {
updateSensorData();
});
}
3. 数据存储
历史记录
class SensorDataPoint {
final DateTime time;
final double x;
final double y;
final double z;
SensorDataPoint({
required this.time,
required this.x,
required this.y,
required this.z,
});
}
List<SensorDataPoint> history = [];
4. 实时显示
数据更新
void updateSensorData() {
final now = DateTime.now();
history.add(SensorDataPoint(
time: now,
x: currentX,
y: currentY,
z: currentZ,
));
if (history.length > maxHistoryLength) {
history.removeAt(0);
}
setState(() {});
}
使用说明
基本使用
-
启动采集
- 点击开始按钮
- 选择传感器类型
- 设置采样率
-
查看数据
- 实时数值显示
- 图表可视化
- 历史数据查看
-
数据导出
- 导出CSV格式
- 导出JSON格式
- 分享数据文件
高级功能
数据过滤
List<double> applyLowPassFilter(List<double> data, double alpha) {
final filtered = <double>[];
var previous = data.first;
for (var value in data) {
previous = alpha * value + (1 - alpha) * previous;
filtered.add(previous);
}
return filtered;
}
技术要点
1. 传感器坐标系
设备坐标系
+Y (顶部)
|
|
+------ +X (右侧)
/
/
+Z (屏幕前方)
2. 数据校准
零点校准
class SensorCalibration {
double offsetX = 0;
double offsetY = 0;
double offsetZ = 0;
void calibrate(List<SensorEvent> samples) {
offsetX = -samples.map((e) => e.x).reduce((a, b) => a + b) / samples.length;
offsetY = -samples.map((e) => e.y).reduce((a, b) => a + b) / samples.length;
offsetZ = -samples.map((e) => e.z).reduce((a, b) => a + b) / samples.length;
}
SensorEvent apply(SensorEvent event) {
return SensorEvent(
x: event.x + offsetX,
y: event.y + offsetY,
z: event.z + offsetZ,
);
}
}
3. 性能优化
采样率控制
class SamplingController {
int _skipCount = 0;
final int skipInterval;
bool shouldProcess() {
_skipCount++;
if (_skipCount >= skipInterval) {
_skipCount = 0;
return true;
}
return false;
}
}
最佳实践
1. 资源管理
及时释放
void dispose() {
_accelSubscription?.cancel();
_gyroSubscription?.cancel();
_sensorTimer?.cancel();
super.dispose();
}
2. 电池优化
按需采集
void pauseOnBackground() {
AppLifecycleListener(
onPause: () {
stopListening();
},
onResume: () {
startListening();
},
);
}
3. 数据精度
精度设置
enum SensorAccuracy {
low, // 低功耗
medium, // 平衡
high, // 高精度
}
void setAccuracy(SensorAccuracy accuracy) {
sensorManager.setSensorDelay(sensorType, accuracy.delayMs);
}
应用场景
1. 运动追踪
计步器
int stepCount = 0;
double lastMagnitude = 0;
void detectStep(SensorEvent event) {
final magnitude = sqrt(event.x * event.x + event.y * event.y + event.z * event.z);
if ((magnitude - lastMagnitude).abs() > stepThreshold) {
stepCount++;
}
lastMagnitude = magnitude;
}
2. 手势识别
摇一摇
void detectShake(SensorEvent event) {
final acceleration = sqrt(
event.x * event.x + event.y * event.y + event.z * event.z
);
if (acceleration > shakeThreshold) {
onShakeDetected();
}
}
3. 屏幕旋转
方向检测
Orientation getDeviceOrientation(SensorEvent event) {
if (event.x.abs() > event.y.abs()) {
return event.x > 0 ? Orientation.portrait : Orientation.portraitDown;
} else {
return event.y > 0 ? Orientation.landscapeRight : Orientation.landscapeLeft;
}
}
总结
Flutter鸿蒙传感器数据采集功能实现了完整的传感器数据采集解决方案,包括:
- ✅ 多种传感器支持
- ✅ 实时数据采集
- ✅ 数据可视化
- ✅ 历史数据存储
- ✅ 数据过滤校准
该功能为Flutter for OpenHarmony应用提供了专业的传感器数据采集能力,适用于运动追踪、手势识别等场景。
更多推荐


所有评论(0)