使用3d圆的参数方程旋转矢量

时间:2016-07-16 15:52:53

标签: c++ vector parametric-equations

我在下面的代码中没有得到所需的输出,即x2,y2,z2。这里角度t是度,(x2,y2,z2)是旋转后矢量面的品脱,(a2,b2,c2)是旋转矢量的方向余弦。我使用rviz来显示旋转矢量但是它没有像思想一样,即它不会旋转。

  double xgp[ipgp] = 23, ygp[ipgp] = 45, zgp[ipgp] = 345; int ipgp = 0;
       double a2, b2 , c2, a1, b1, c1 = ...
       double la = 0.0032;
       for(double t=0;t<360;t+=la)
        {
            double x2 = xgp[ipgp]+a2*cos(t)+a1*sin(t);
            double y2 = ygp[ipgp]+b2*cos(t)+b1*sin(t);
            double z2 = zgp[ipgp]+c2*cos(t)+c1*sin(t);
            a2 = x2-xgp[ipgp];  // vector (xgp,ygp,zgp)->(x2,y2,z2)
            b2 = y2-ygp[ipgp];
            c2 = z2-zgp[ipgp];
            int i = round(sqrt(pow(a2,2)+pow(b2,2)+pow(c2,2)));
            std::cout<<i<<std::endl;
    }

1 个答案:

答案 0 :(得分:0)

您发布的代码有两个问题:

  1. 您未指定(a1,b1,c1)(a2,b2,c2)的设置方式。这些必须是:
    • (xgp,ygp,zgp)
    • 正交
    • 彼此正交
    • 单位向量
  2. 在循环中,您将(a2,b2,c2)重置为旋转的单位矢量。对于循环的下一步,您不能这样做并且仍然保持(a1,b1,c1)(a2,b2,c2)之间的正交性。这可能是您打印i不是全部1的主要原因
  3. 以下代码执行您的意图

    #include <iostream>
    #include <math.h>
    
    int main() {
      double xgp = 23., ygp = 45., zgp = 345.;
      // setting (a2,b2,c2) to be orthogonal to (xgp,ygp,zgp) with unit magnitude
      double a2 = -45./sqrt(23.*23. + 45.*45.);
      double b2  = 23./sqrt(23.*23. + 45.*45.);
      double c2  = 0.;
      // setting (a1,b1,c1) to be orthogonal to both (a2,b2,c2) and (xgp,ygp,zgp)
      // using cross product (xgp,ygp,zgp) X (a2,b2,c2) with unit magnitude
      double a1 = -23.*345./sqrt(23.*345.*23.*345. + 45.*345.*45.*345. + (23.*23. + 45.*45.)*(23.*23. + 45.*45.));
      double b1 = -45.*345./sqrt(23.*345.*23.*345. + 45.*345.*45.*345. + (23.*23. + 45.*45.)*(23.*23. + 45.*45.));
      double c1 = (23.*23. + 45.*45.)/sqrt(23.*345.*23.*345. + 45.*345.*45.*345. + (23.*23. + 45.*45.)*(23.*23. + 45.*45.));
    
      double la = 0.0032;
      for(double t=0;t<360;t+=la) {
        double x2 = xgp+a2*cos(t)+a1*sin(t);
        double y2 = ygp+b2*cos(t)+b1*sin(t);
        double z2 = zgp+c2*cos(t)+c1*sin(t);
        // cannot overwrite a2, b2, c2; otherwise (a2,b2,c2) is no longer orthogonal to (a1,b1,c1)!
        double a3 = x2-xgp;  // vector (xgp,ygp,zgp)->(x2,y2,z2)
        double b3 = y2-ygp;
        double c3 = z2-zgp;
        // (a3,b3,c3) is a unit vector!
        int i = round(sqrt(pow(a3,2)+pow(b3,2)+pow(c3,2)));
        std::cout<<i<<std::endl;
      }
      return(0)
    }
    

    请注意,以度数或弧度为单位的旋转与您的问题无关。但是,您应该遵循@Bob的建议并确保您了解自己想要的单位。

    希望这会有所帮助。