加速度传感器中任意静止时刻任意角度下x,y,z方向上的加速度算法

前端也精彩 2013-06-29 06:23:31
以下是自己查看网上资料写的算法,但是实际测试发现,我希望的是静止状态下得到的实际加速度应该为零,但是按照重力加速度向x,y,z分量的角度写的当下的算法是不等于0的,和实际要求不符合;请求好心人指点以下:


public void onSensorChanged(SensorEvent evt) {
// TODO Auto-generated method stub
if (evt.sensor.getType() == Sensor.TYPE_ORIENTATION) {
Or_x = evt.values[SensorManager.DATA_X];
or_x = (double) Or_x;
Or_z = evt.values[SensorManager.DATA_Z];

or_z = (double) Or_z;

Or_y = evt.values[SensorManager.DATA_Y];
or_y = (double) Or_y;

}

if (evt.sensor.getType() == Sensor.TYPE_ACCELEROMETER) {
AccelX = evt.values[SensorManager.DATA_X];
AccelY = evt.values[SensorManager.DATA_Y];
AccelZ = evt.values[SensorManager.DATA_Z];
}
// ///////////////////////////////////////////////////////////
ac_hx = Math.sin(or_z * 3.1415926 / 180) * 9.81;//静止状态下or_z翻转角下x方向固有的加速度
axp = (AccelX - ac_hx);//实际加速度


// ///////////////////////////////////////////////////////////
ac_hy = Math.sin(-or_y * 3.1415926 / 180) * 9.81;;//静止状态下or_y翻转角下y方向固有的加速度

ayp = AccelY - ac_hy;//实际加速度

// ///////////////////////////////////////////////////////////
ac_hz = Math.sqrt(9.81*9.81 - ac_hx * ac_hx + ac_hy * ac_hy);
//静止状态z方向固有的加速度


azp = (AccelZ - ac_hz);//实际加速度


// ///////////////////////////////////////////////////////////
Log.i("axp", "axp===" + axp);
Log.i("ayp", "ayp===" + ayp);
Log.i("azp", "azp===" + azp);

Tapplication.dangxia_ac_x = axp;
Tapplication.dangxia_ac_y = ayp;
Tapplication.dangxia_ac_z = azp;

Tapplication.bundle_insert_data_valide = true;

// ///////////////////////////////////////////////////////////
}
...全文
4432 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhouxinjin 2014-12-16
  • 打赏
  • 举报
回复
这个好哦
tianyuxinga 2014-11-07
  • 打赏
  • 举报
回复
引用 2 楼 sanjiaozhen 的回复:
[quote=引用 1 楼 CuGBabyBeaR 的回复:] 实际上 姿态传感器 Sensor.TYPE_ORIENTATION 的值并非为直接的 与水平面的夹角 所以不能直接这样使用三角函数计算重力加速度 在Android文档中 建议使用高通滤波来除去的重力的影响
It should be apparent that in order to measure the real acceleration of the device, the contribution of the force of gravity must be eliminated. This can be achieved by applying a high-pass filter. Conversely, a low-pass filter can be used to isolate the force of gravity.
很明显,为了测量设备的实际加速度,必须消除重力的影响。这可以用过高通滤波器来实现。相反的,低通滤波器和一用来分离重力。 相应的代码如下:
 public void onSensorChanged(SensorEvent event)
     {
          // alpha is calculated as t / (t + dT)
          // with t, the low-pass filter's time-constant
          // and dT, the event delivery rate

          final float alpha = 0.8;

          gravity[0] = alpha * gravity[0] + (1 - alpha) * event.values[0];
          gravity[1] = alpha * gravity[1] + (1 - alpha) * event.values[1];
          gravity[2] = alpha * gravity[2] + (1 - alpha) * event.values[2];

          linear_acceleration[0] = event.values[0] - gravity[0];
          linear_acceleration[1] = event.values[1] - gravity[1];
          linear_acceleration[2] = event.values[2] - gravity[2];
     }
多谢前辈,再请问这个gravity[0]是指由gravity传感器收集到的数据吗?[/quote] 请问这样算下来,gravity永远等于event.values,那这样获得的加速度岂不是永远等于0
Allen_ke 2014-08-20
  • 打赏
  • 举报
回复
大神,求助 // 用低通滤波器分离出重力加速度 gravity[0] = alpha * gravity[0] + (1 - alpha) * event.values[0]; gravity[1] = alpha * gravity[1] + (1 - alpha) * event.values[1]; gravity[2] = alpha * gravity[2] + (1 - alpha) * event.values[2]; gravity 是重力加速度在三轴上的分量 linear_acceleration 是三轴线性加速度 gravity怎样求出来?
yijing222 2013-08-15
  • 打赏
  • 举报
回复
引用 10 楼 CuGBabyBeaR 的回复:
[quote=引用 9 楼 yijing222 的回复:] 谢谢,对于这个可以控制,XYZ三个值的加速度,要计算位移的话,我要取哪一个值呢? [quote=引用 8 楼 CuGBabyBeaR 的回复:] [quote=引用 7 楼 yijing222 的回复:] 因为我要实现定位,需要过滤掉一些基本不动的加速度数值,不然不精确。有什么办法控制吗?
你可以设置一个阈值 变化大于这个阈值的时候才有响应 否则不进行响应 这个阈值应该会比较小才对[/quote][/quote] 如果是3D的话应该是他们的向量和 前提是手机在位移的过程中没有姿态变化 如果有姿态变化就麻烦了 如果是平面 且手机平放在桌面的话 需要取X和Y轴的向量和[/quote] 还有一个问题,我在debug的时候,一开始Z轴的加速度很大,将近10,受重力加速度的影响。这个怎么解决呢
yijing222 2013-08-15
  • 打赏
  • 举报
回复
是说取出x y轴各自的位移,去求他们的向量和吗?
引用 10 楼 CuGBabyBeaR 的回复:
[quote=引用 9 楼 yijing222 的回复:] 谢谢,对于这个可以控制,XYZ三个值的加速度,要计算位移的话,我要取哪一个值呢? [quote=引用 8 楼 CuGBabyBeaR 的回复:] [quote=引用 7 楼 yijing222 的回复:] 因为我要实现定位,需要过滤掉一些基本不动的加速度数值,不然不精确。有什么办法控制吗?
你可以设置一个阈值 变化大于这个阈值的时候才有响应 否则不进行响应 这个阈值应该会比较小才对[/quote][/quote] 如果是3D的话应该是他们的向量和 前提是手机在位移的过程中没有姿态变化 如果有姿态变化就麻烦了 如果是平面 且手机平放在桌面的话 需要取X和Y轴的向量和[/quote]
yijing222 2013-08-15
  • 打赏
  • 举报
回复
是说取出x y轴各自的位移,去求他们的向量和吗?
yijing222 2013-08-14
  • 打赏
  • 举报
回复
因为我要实现定位,需要过滤掉一些基本不动的加速度数值,不然不精确。有什么办法控制吗?
引用 6 楼 CuGBabyBeaR 的回复:
[quote=引用 5 楼 yijing222 的回复:] 点错了评价,sorry.手机在静止的时候加速度的值一直在发生变化,要怎么样才可以更精确呢?
这个要看你的功能需求了 不停的变化是正常的 1 实际上即便肉眼见到手机是静止的 其实也有微小的震动存在 譬如 放置手机的桌面在声波作用下的细微震动 地面的震动传递到手机上 高层楼房在风影响下的细微晃动 2 感应器在手机内部电路以及电磁波的影响下可能变化 相当于白噪音 或者数码相机噪点的产生原因 不过数值基本上是精确的 精确度是多少就不知道了 基本上加速度的话小数点后1位就够了吧 精确度太高了也没意义啊[/quote]
CuGBabyBeaR 2013-08-14
  • 打赏
  • 举报
回复
引用 9 楼 yijing222 的回复:
谢谢,对于这个可以控制,XYZ三个值的加速度,要计算位移的话,我要取哪一个值呢? [quote=引用 8 楼 CuGBabyBeaR 的回复:] [quote=引用 7 楼 yijing222 的回复:] 因为我要实现定位,需要过滤掉一些基本不动的加速度数值,不然不精确。有什么办法控制吗?
你可以设置一个阈值 变化大于这个阈值的时候才有响应 否则不进行响应 这个阈值应该会比较小才对[/quote][/quote] 如果是3D的话应该是他们的向量和 前提是手机在位移的过程中没有姿态变化 如果有姿态变化就麻烦了 如果是平面 且手机平放在桌面的话 需要取X和Y轴的向量和
yijing222 2013-08-14
  • 打赏
  • 举报
回复
谢谢,对于这个可以控制,XYZ三个值的加速度,要计算位移的话,我要取哪一个值呢?
引用 8 楼 CuGBabyBeaR 的回复:
[quote=引用 7 楼 yijing222 的回复:] 因为我要实现定位,需要过滤掉一些基本不动的加速度数值,不然不精确。有什么办法控制吗?
你可以设置一个阈值 变化大于这个阈值的时候才有响应 否则不进行响应 这个阈值应该会比较小才对[/quote]
CuGBabyBeaR 2013-08-14
  • 打赏
  • 举报
回复
引用 7 楼 yijing222 的回复:
因为我要实现定位,需要过滤掉一些基本不动的加速度数值,不然不精确。有什么办法控制吗?
你可以设置一个阈值 变化大于这个阈值的时候才有响应 否则不进行响应 这个阈值应该会比较小才对
CuGBabyBeaR 2013-08-12
  • 打赏
  • 举报
回复
引用 5 楼 yijing222 的回复:
点错了评价,sorry.手机在静止的时候加速度的值一直在发生变化,要怎么样才可以更精确呢?
这个要看你的功能需求了 不停的变化是正常的 1 实际上即便肉眼见到手机是静止的 其实也有微小的震动存在 譬如 放置手机的桌面在声波作用下的细微震动 地面的震动传递到手机上 高层楼房在风影响下的细微晃动 2 感应器在手机内部电路以及电磁波的影响下可能变化 相当于白噪音 或者数码相机噪点的产生原因 不过数值基本上是精确的 精确度是多少就不知道了 基本上加速度的话小数点后1位就够了吧 精确度太高了也没意义啊
yijing222 2013-08-12
  • 打赏
  • 举报
回复
点错了评价,sorry.手机在静止的时候加速度的值一直在发生变化,要怎么样才可以更精确呢?
引用 4 楼 CuGBabyBeaR 的回复:
[quote=引用 3 楼 sanjiaozhen 的回复:] 我把您写的linear_acceleration认为是实际的加速度,另外,对于高通滤波器的不太理解;没有这个硬件,希望能够有某个算法,然后直接将收集到的数据分析得出实际加速度.请问这样可行吗?
这里的滤波器不是一个设备 整个算法是低通滤波的实现 所谓低通滤波 是指只有低频信号可以通过的装置或者处理过程 因为重力只有在设备旋转的时候会发生变化 因此一定是低频信号 通过对传感器三轴的测量值进行低通滤波 可以获得重力在各个轴上的分量 然后再在三轴测量值上减去重力的分量 即可获得设备实际的加速度值 alpha是滤波参数 可以根据需要进行更改 event.values 是传感器收集到数据 gravity 是重力加速度在三轴上的分量 linear_acceleration 是三轴线性加速度 [/quote]
CuGBabyBeaR 2013-06-30
  • 打赏
  • 举报
回复
引用 3 楼 sanjiaozhen 的回复:
我把您写的linear_acceleration认为是实际的加速度,另外,对于高通滤波器的不太理解;没有这个硬件,希望能够有某个算法,然后直接将收集到的数据分析得出实际加速度.请问这样可行吗?
这里的滤波器不是一个设备 整个算法是低通滤波的实现 所谓低通滤波 是指只有低频信号可以通过的装置或者处理过程 因为重力只有在设备旋转的时候会发生变化 因此一定是低频信号 通过对传感器三轴的测量值进行低通滤波 可以获得重力在各个轴上的分量 然后再在三轴测量值上减去重力的分量 即可获得设备实际的加速度值 alpha是滤波参数 可以根据需要进行更改 event.values 是传感器收集到数据 gravity 是重力加速度在三轴上的分量 linear_acceleration 是三轴线性加速度
前端也精彩 2013-06-29
  • 打赏
  • 举报
回复
我把您写的linear_acceleration认为是实际的加速度,另外,对于高通滤波器的不太理解;没有这个硬件,希望能够有某个算法,然后直接将收集到的数据分析得出实际加速度.请问这样可行吗?
前端也精彩 2013-06-29
  • 打赏
  • 举报
回复
引用 1 楼 CuGBabyBeaR 的回复:
实际上 姿态传感器 Sensor.TYPE_ORIENTATION 的值并非为直接的 与水平面的夹角 所以不能直接这样使用三角函数计算重力加速度 在Android文档中 建议使用高通滤波来除去的重力的影响
It should be apparent that in order to measure the real acceleration of the device, the contribution of the force of gravity must be eliminated. This can be achieved by applying a high-pass filter. Conversely, a low-pass filter can be used to isolate the force of gravity.
很明显,为了测量设备的实际加速度,必须消除重力的影响。这可以用过高通滤波器来实现。相反的,低通滤波器和一用来分离重力。 相应的代码如下:
 public void onSensorChanged(SensorEvent event)
     {
          // alpha is calculated as t / (t + dT)
          // with t, the low-pass filter's time-constant
          // and dT, the event delivery rate

          final float alpha = 0.8;

          gravity[0] = alpha * gravity[0] + (1 - alpha) * event.values[0];
          gravity[1] = alpha * gravity[1] + (1 - alpha) * event.values[1];
          gravity[2] = alpha * gravity[2] + (1 - alpha) * event.values[2];

          linear_acceleration[0] = event.values[0] - gravity[0];
          linear_acceleration[1] = event.values[1] - gravity[1];
          linear_acceleration[2] = event.values[2] - gravity[2];
     }
多谢前辈,再请问这个gravity[0]是指由gravity传感器收集到的数据吗?
CuGBabyBeaR 2013-06-29
  • 打赏
  • 举报
回复
实际上 姿态传感器 Sensor.TYPE_ORIENTATION 的值并非为直接的 与水平面的夹角 所以不能直接这样使用三角函数计算重力加速度 在Android文档中 建议使用高通滤波来除去的重力的影响
It should be apparent that in order to measure the real acceleration of the device, the contribution of the force of gravity must be eliminated. This can be achieved by applying a high-pass filter. Conversely, a low-pass filter can be used to isolate the force of gravity.
很明显,为了测量设备的实际加速度,必须消除重力的影响。这可以用过高通滤波器来实现。相反的,低通滤波器和一用来分离重力。 相应的代码如下:
 public void onSensorChanged(SensorEvent event)
     {
          // alpha is calculated as t / (t + dT)
          // with t, the low-pass filter's time-constant
          // and dT, the event delivery rate

          final float alpha = 0.8;

          gravity[0] = alpha * gravity[0] + (1 - alpha) * event.values[0];
          gravity[1] = alpha * gravity[1] + (1 - alpha) * event.values[1];
          gravity[2] = alpha * gravity[2] + (1 - alpha) * event.values[2];

          linear_acceleration[0] = event.values[0] - gravity[0];
          linear_acceleration[1] = event.values[1] - gravity[1];
          linear_acceleration[2] = event.values[2] - gravity[2];
     }

80,363

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧