如何在三维空间中找到方向的变化

时间:2017-10-02 16:56:22

标签: math vector coordinates physics robotics

我正在从一个从移动传感器获取数据的项目中工作。我们已经在3d坐标中转换了传感器数据。其中一个传感器放在物体的手上 问题:当物体向后移动手然后向前移动时。所以我正在寻找物体指针向后移动的帧数。

为了解决这个问题,这种点可以来自3D这里的示例图像数据:

img

最初我使用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轴(主要)方向上移动传感器数据中找到角点。任何人都可以帮我解决这个问题。

感谢。

1 个答案:

答案 0 :(得分:0)

假设你有entiry点轨迹,我只是寻找与连接起点和终点的线的距离最大的点。我不知道您正在使用的矢量库,但使用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; }
}

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

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