- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
首先,你好,我正在使用 Ibeacon 进行内部定位的 Node.js javascript 工作。作为我工作的 helper :我使用 Evothings Studio。我正在将我的代码传输到 Evothings studio,并通过我的 Android 和 iOS 手机查看我的作品。现在我想告诉你我遇到的问题。根据RSSI信号电平,我发现计算的距离不是很准确。我想使用卡尔曼滤波器来清除该信号电平(RSSI)的噪声。本文介绍了卡尔曼滤波器在 Javascript 中的使用。据说很容易实现,但我却无法开始实践。 ””卡尔曼滤波器库:“https://github.com/wouterbulten/kalmanjs”。如何使用卡尔曼滤波器清除 RSSI 信号中的噪声?如何将卡尔曼滤波器应用于这些代码?
var app = (function()
{
// Application object.
var app = {};
// History of enter/exit events.
var mRegionEvents = [];
// Nearest ranged beacon.
var mNearestBeacon = null;
// Timer that displays nearby beacons.
var mNearestBeaconDisplayTimer = null;
// Background flag.
var mAppInBackground = false;
// Background notification id counter.
var mNotificationId = 0;
// Mapping of region event state names.
// These are used in the event display string.
var mRegionStateNames =
{
'CLRegionStateInside': 'Enter',
'CLRegionStateOutside': 'Exit'
};
// Here monitored regions are defined.
// TODO: Update with uuid/major/minor for your beacons.
// You can add as many beacons as you want to use.
var mRegions =
[
{
id: 'BEACON1',
uuid: 'fda50693-a4e2-4fb1-afcf-c6eb07647825',
major: 10035,
minor: 56498
},
{
id: 'region2',
uuid: 'f7826da6-4fa2-4e98-8024-bc5b71e0893e',
major: 60378,
minor: 22122
}
];
// Region data is defined here. Mapping used is from
// region id to a string. You can adapt this to your
// own needs, and add other data to be displayed.
// TODO: Update with major/minor for your own beacons.
var mRegionData =
{
'BEACON1': 'WGX_BEACON1',
'region2': 'Region Two'
};
app.initialize = function()
{
document.addEventListener('deviceready', onDeviceReady, false);
document.addEventListener('pause', onAppToBackground, false);
document.addEventListener('resume', onAppToForeground, false);
};
function onDeviceReady()
{
startMonitoringAndRanging();
startNearestBeaconDisplayTimer();
displayRegionEvents();
}
function onAppToBackground()
{
mAppInBackground = true;
stopNearestBeaconDisplayTimer();
}
function onAppToForeground()
{
mAppInBackground = false;
startNearestBeaconDisplayTimer();
displayRegionEvents();
}
function startNearestBeaconDisplayTimer()
{
mNearestBeaconDisplayTimer = setInterval(displayNearestBeacon, 1000);
}
function stopNearestBeaconDisplayTimer()
{
clearInterval(mNearestBeaconDisplayTimer);
mNearestBeaconDisplayTimer = null;
}
function startMonitoringAndRanging()
{
function onDidDetermineStateForRegion(result)
{
saveRegionEvent(result.state, result.region.identifier);
displayRecentRegionEvent();
}
function onDidRangeBeaconsInRegion(result)
{
updateNearestBeacon(result.beacons);
}
function onError(errorMessage)
{
console.log('Monitoring beacons did fail: ' + errorMessage);
}
// Request permission from user to access location info.
cordova.plugins.locationManager.requestAlwaysAuthorization();
// Create delegate object that holds beacon callback functions.
var delegate = new cordova.plugins.locationManager.Delegate();
cordova.plugins.locationManager.setDelegate(delegate);
// Set delegate functions.
delegate.didDetermineStateForRegion = onDidDetermineStateForRegion;
delegate.didRangeBeaconsInRegion = onDidRangeBeaconsInRegion;
// Start monitoring and ranging beacons.
startMonitoringAndRangingRegions(mRegions, onError);
}
function startMonitoringAndRangingRegions(regions, errorCallback)
{
// Start monitoring and ranging regions.
for (var i in regions)
{
startMonitoringAndRangingRegion(regions[i], errorCallback);
}
}
function startMonitoringAndRangingRegion(region, errorCallback)
{
// Create a region object.
var beaconRegion = new cordova.plugins.locationManager.BeaconRegion(
region.id,
region.uuid,
region.major,
region.minor);
// Start ranging.
cordova.plugins.locationManager.startRangingBeaconsInRegion(beaconRegion)
.fail(errorCallback)
.done();
// Start monitoring.
cordova.plugins.locationManager.startMonitoringForRegion(beaconRegion)
.fail(errorCallback)
.done();
}
function saveRegionEvent(eventType, regionId)
{
// Save event.
mRegionEvents.push(
{
type: eventType,
time: getTimeNow(),
regionId: regionId
});
// Truncate if more than ten entries.
if (mRegionEvents.length > 10)
{
mRegionEvents.shift();
}
}
function getBeaconId(beacon)
{
return beacon.uuid + ':' + beacon.major + ':' + beacon.minor;
}
function isSameBeacon(beacon1, beacon2)
{
return getBeaconId(beacon1) == getBeaconId(beacon2);
}
function isNearerThan(beacon1, beacon2)
{
return beacon1.accuracy > 0
&& beacon2.accuracy > 0
&& beacon1.accuracy < beacon2.accuracy;
}
function updateNearestBeacon(beacons)
{
for (var i = 0; i < beacons.length; ++i)
{
var beacon = beacons[i];
if (!mNearestBeacon)
{
mNearestBeacon = beacon;
}
else
{
if (isSameBeacon(beacon, mNearestBeacon) ||
isNearerThan(beacon, mNearestBeacon))
{
mNearestBeacon = beacon;
}
}
}
}
function displayNearestBeacon()
{
if (!mNearestBeacon) { return; }
// Clear element.
$('#beacon').empty();
// Update element.
var element = $(
'<li>'
+ '<strong>BEACON1</strong><br />'
+ 'UUID: ' + mNearestBeacon.uuid + '<br />'
+ 'Major: ' + mNearestBeacon.major + '<br />'
+ 'Minor: ' + mNearestBeacon.minor + '<br />'
+ 'Distance: ' + mNearestBeacon.accuracy + '<br />'
+ 'RSSI: ' + mNearestBeacon.rssi + '<br />'
+ '</li>'
);
$('#beacon').append(element);
}
function displayRecentRegionEvent()
{
if (mAppInBackground)
{
// Set notification title.
var event = mRegionEvents[mRegionEvents.length - 1];
if (!event) { return; }
var title = getEventDisplayString(event);
// Create notification.
cordova.plugins.notification.local.schedule({
id: ++mNotificationId,
title: title });
}
else
{
displayRegionEvents();
}
}
function displayRegionEvents()
{
// Clear list.
$('#events').empty();
// Update list.
for (var i = mRegionEvents.length - 1; i >= 0; --i)
{
var event = mRegionEvents[i];
var title = getEventDisplayString(event);
var element = $(
'<li>'
+ '<strong>' + title + '</strong>'
+ '</li>'
);
$('#events').append(element);
}
// If the list is empty display a help text.
if (mRegionEvents.length <= 0)
{
var element = $(
'<li>'
+ '<strong>'
+ 'İbeacon Taramasi Yapiliyor.'
+ '</strong>'
+ '</li>'
);
$('#events').append(element);
}
}
function getEventDisplayString(event)
{
return event.time + ': '
+ mRegionStateNames[event.type] + ' '
+ mRegionData[event.regionId];
}
function getTimeNow()
{
function pad(n)
{
return (n < 10) ? '0' + n : n;
}
function format(h, m, s)
{
return pad(h) + ':' + pad(m) + ':' + pad(s);
}
var d = new Date();
return format(d.getHours(), d.getMinutes(), d.getSeconds());
}
return app;
})();
app.initialize();
最佳答案
完成卡尔曼滤波器的实验后,您可能会发现距离估计的误差仍然太高。这是因为 RSSI 测量中除了随机噪声之外还有其他误差源,其中许多误差源可能是影响接收器测量的 radio 信号电平的其他变量(例如反射、障碍物、天线方向图变化)的函数。
一般来说,使用基于 RSSI 的直接距离计算最多能够准确地估计 1 米真实距离下的 0.5-2 米,而在更远的距离上准确度要低得多。即使使用卡尔曼滤波器或运行平均值滤除噪声后也是如此。 (请注意,iOS 距离估计使用 20 秒的 RSSI 运行平均值,并且 CLBeacon 上的 RSSI 字段值是一秒内的平均值。)
如果使用三边测量或类似的方法来计算位置,您会发现只能在不超过 1-2 米的极短距离内获得可行的结果。
关于javascript - Node.js 卡尔曼滤波器一维,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54817228/
我有一个 Haskell 程序,它用 Metropolis 模拟 Ising 模型 算法。主要操作是一个模板操作,它需要下一个的总和 2D 中的邻居,然后将其与中心元素相乘。那么 元素可能已更新。 在
对于卷积,我想在一个维度上应用圆形填充,在所有其他维度上应用零填充。我该怎么做? 对于卷积,有 28 个 channel ,并且数据在球形箱中描述。半径时间有 20 个箱子,极地时间有 20 个箱子,
假设您有一个数组并想创建另一个数组,该数组的值连续等于第一个数组的 10 个元素的标准差。在 for 循环的帮助下,它可以像下面的代码一样轻松编写。我想要做的是避免使用 for 循环来加快执行时间。有
我有一个长度为size * size的一维数组,表示值的平方字段。 我的目标是将数组旋转到位(previous question)。我目前在获取正确的内圈索引方面遇到问题。我的算法有什么错误? 这是我
stride = 1 和 1 个过滤器的 1D CNN 的输出长度不应该等于输入长度而不需要填充吗? 我认为是这种情况,但创建了一个具有这些规范的 Keras 模型,当输入形状为 (17910,1)
我有一个零散布的一维数组。想创建第二个数组,其中包含最后一个零的位置,如下所示: >>> a = np.array([1, 0, 3, 2, 0, 3, 5, 8, 0, 7, 12]) >>> fo
我试着去理解卡尔曼滤波器是如何工作的,因为多维变量太混乱了,一开始我从一维的例子开始。 我发现有3个不同的来源解释温度计的情况,但所有这些情况实现的方程略有不同,我没有得到重点。 我实现了解决方案2,
我有一个二维数组,我需要将它转换为一个列表(同一对象)。我不想使用 for 或 foreach 循环来执行此操作,它们将获取每个元素并将其添加到列表中。还有其他方法吗? 最佳答案 好吧,你可以让它使用
我正在使用 Keras 构建一个 CNN,将以下 Conv1D 作为我的第一层: cnn.add(Conv1D( filters=512, kernel_size=3, str
在 Python 中使用 TensorFlow,我正在制作一个以一维数组作为输入的神经网络。我想在网络中添加一个卷积层,但似乎无法让它工作。 我的训练数据如下所示: n_samples = 20 le
我有一个简单的一维数组,但我想使用 jQuery 将长列表分成两列。我怎样才能实现这个目标? var articles = ['article10','article9','article8','ar
我有一个刚从文件中读入的 float 的一维 vector 。 std::vector result(s.size() / sizeof(float)); 我想像这样使用这些数据 myTable[rl
使用 numpy 将 data reshape 为 fencepost 的最有效方法是什么? data = np.array([1, 2, 3, 4, 5])
我正在尝试通过删除 for 循环并仅在处理大型数据集时使用 numpy 数组来优化一些代码。 我想采用一维 numpy 数组,例如: a = [1, 2, 3, 4, 5] 并生成一个 2D nump
我正在尝试为两个数组 Pages 和 Price 赋值。 #include int main() { static int pages[3]; static int price[3];
我是深度学习、keras API 和卷积网络的新手,如果这些错误是幼稚的,请事先致歉。我正在尝试构建一个用于分类的简单卷积神经网络。输入数据 X 有 286 个样本,每个样本有 500 个时间点,4
假设我有 Numpy 数组 p 和一个 Scipy 稀疏矩阵 q 这样 >>> p.shape (10,) >>> q.shape (10,100) 我想做 p 和 q 的点积。当我尝试使用 nump
我需要一些行为类似于 std::vector 的东西(界面/功能/等)但我需要它是平坦的,即它不能动态分配缓冲区。显然,这通常不起作用,因为可用大小必须在编译时确定。但我希望类型能够处理N没有额外分配
作为我正在运行的一些模拟的一部分,我需要最终对一些非常长的(实数)数字序列执行以下操作。这是要点: 给定一个长的一维 NumPy 数组,对于数组中的每个位置,我想对该位置前后的值进行平均,取平均值之间
这个问题在这里已经有了答案: Concatenating two one-dimensional NumPy arrays (6 个答案) 关闭 5 年前。 我想将 numpy 数组存储到另一个 n
我是一名优秀的程序员,十分优秀!