如何在 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; }
}

您应该能够实现与您选择的库等效的东西。

如果您需要处理异常值或噪声,请使用某种移动中值或移动平均线而不是单点。