如何在 3d 中找到方向变化 space
How to find change of direction in 3d space
我正在从事一个从移动传感器获取数据的项目。我们已经在 3d 坐标中转换了传感器数据。其中一个传感器安装在物体的手上。
问题:当对象向后移动他的手然后向前移动时。所以我正在寻找对象手结束向后移动的帧号。
只是为了解决问题,这种点可以在 3D 中出现这里示例图像数据:
最初我是通过改变 y 轴实现的。有了一些阈值,它的结果是好的。但只有当物体的手向后移动并随着 y 轴的值减小而向前移动时。但在理想情况下(图像)手可以以任何方式出现,即增加 y 的值或减少 y 的值。但我确信,当手向后移动时,它总是会增加(除了一些噪声帧或异常值)。使用这个我实现了这个。 `
std::pair<std::pair<int, int>, bool> calculateBacklift(std::vector<glm::vec3> points)
{
std::pair<std::pair<int, int>, bool> backlift;
backlift.second = false;
std::vector<glm::vec3> distanceVec;
for (int i = 0; i < points.size() - 1; ++i)
{
// vector
glm::vec3 distance;
distance.x = points[i + 1].x - points[i].x;
distance.y = points[i + 1].y - points[i].y;
distance.z = points[i + 1].z - points[i].z;
distanceVec.push_back(distance);
}
writeTodisk("distanceVector.csv", distanceVec);
for (int i = 0; i < distanceVec.size(); ++i)
{
// y is major axis and if any of x or z hand changed then i am assuming there can be direction change. this comes from experiment.
if (distanceVec[i].y <= -0.09 && (distanceVec[i].x <= -0.1 || distanceVec[i].z >= 0.9))
{
backlift.first = std::make_pair(1, i + 1);
backlift.second = true;
break;
}
}
return backlift;
}`
但是当手向上伸时,它不起作用。因为y轴的变化是正的。
然后我想到用点积求方向的变化。还有cos值。但它也检测轴(X,Z)上的方向变化。或者以简单的方式我可以说我想在 y 轴(主要)方向上移动传感器数据中找到角点。谁能帮我解决这个问题。
谢谢。
假设你有完整的点轨迹,我只是寻找与连接起点和终点的直线距离最大的点。我不知道你正在使用的矢量库,但使用 Eigen-library 这将是这样的:
std::vector<Eigen::Vector3f> points; // input set of points
typedef Eigen::ParametrizedLine<float, 3> Line3;
// Calculate line through first and last point of points:
Line3 start_to_end = Line3::Through(points[0], points.back());
float max_dist_squared=0.0f;
size_t max_idx=0;
for(size_t i=0; i<points.size(); ++i) {
// calculate squared (perpendicular) distance from points[i] to the line
float dist2 = start_to_end.squaredDistance(points[i]);
// check if distance is bigger than previous maximum:
if(dist2 > max_dist_squared) { max_dist_squared = dist2; max_idx = i; }
}
您应该能够实现与您选择的库等效的东西。
如果您需要处理异常值或噪声,请使用某种移动中值或移动平均线而不是单点。
我正在从事一个从移动传感器获取数据的项目。我们已经在 3d 坐标中转换了传感器数据。其中一个传感器安装在物体的手上。
问题:当对象向后移动他的手然后向前移动时。所以我正在寻找对象手结束向后移动的帧号。
只是为了解决问题,这种点可以在 3D 中出现这里示例图像数据:
最初我是通过改变 y 轴实现的。有了一些阈值,它的结果是好的。但只有当物体的手向后移动并随着 y 轴的值减小而向前移动时。但在理想情况下(图像)手可以以任何方式出现,即增加 y 的值或减少 y 的值。但我确信,当手向后移动时,它总是会增加(除了一些噪声帧或异常值)。使用这个我实现了这个。 `
std::pair<std::pair<int, int>, bool> calculateBacklift(std::vector<glm::vec3> points)
{
std::pair<std::pair<int, int>, bool> backlift;
backlift.second = false;
std::vector<glm::vec3> distanceVec;
for (int i = 0; i < points.size() - 1; ++i)
{
// vector
glm::vec3 distance;
distance.x = points[i + 1].x - points[i].x;
distance.y = points[i + 1].y - points[i].y;
distance.z = points[i + 1].z - points[i].z;
distanceVec.push_back(distance);
}
writeTodisk("distanceVector.csv", distanceVec);
for (int i = 0; i < distanceVec.size(); ++i)
{
// y is major axis and if any of x or z hand changed then i am assuming there can be direction change. this comes from experiment.
if (distanceVec[i].y <= -0.09 && (distanceVec[i].x <= -0.1 || distanceVec[i].z >= 0.9))
{
backlift.first = std::make_pair(1, i + 1);
backlift.second = true;
break;
}
}
return backlift;
}`
但是当手向上伸时,它不起作用。因为y轴的变化是正的。
然后我想到用点积求方向的变化。还有cos值。但它也检测轴(X,Z)上的方向变化。或者以简单的方式我可以说我想在 y 轴(主要)方向上移动传感器数据中找到角点。谁能帮我解决这个问题。
谢谢。
假设你有完整的点轨迹,我只是寻找与连接起点和终点的直线距离最大的点。我不知道你正在使用的矢量库,但使用 Eigen-library 这将是这样的:
std::vector<Eigen::Vector3f> points; // input set of points
typedef Eigen::ParametrizedLine<float, 3> Line3;
// Calculate line through first and last point of points:
Line3 start_to_end = Line3::Through(points[0], points.back());
float max_dist_squared=0.0f;
size_t max_idx=0;
for(size_t i=0; i<points.size(); ++i) {
// calculate squared (perpendicular) distance from points[i] to the line
float dist2 = start_to_end.squaredDistance(points[i]);
// check if distance is bigger than previous maximum:
if(dist2 > max_dist_squared) { max_dist_squared = dist2; max_idx = i; }
}
您应该能够实现与您选择的库等效的东西。
如果您需要处理异常值或噪声,请使用某种移动中值或移动平均线而不是单点。