TCPdsfsdfd

void RunDefination::TcpCalibration(float DH[6], vector Point, double T_tool[NUM_TRAJECTORY_ARRARY], double Error[3]){
vector Pointtemp;
int pointNum = Point.size() / 6;
int Comb_no = 0;
int Comb_num = 0;
Comb_num =Combination(pointNum, 4);
int Comb_array[Comb_num][4] = {{0}};
double Comb_error[Comb_num] = {0.0};
int Comb_error_min_no = 0;
double Comb_error_min = 100000000000;
// 从点集中抽出四个点
for (int i = 0; i < pointNum - 3; i++)
{
for (int j = i + 1; j < pointNum - 2; j++)
{
for (int k = j + 1; k < pointNum - 1; k++)
{
for (int l = k + 1; l < pointNum; l++)
{
Comb_array[Comb_no][0] = i;
Comb_array[Comb_no][1] = j;
Comb_array[Comb_no][2] = k;
Comb_array[Comb_no][3] = l;
Pointtemp.insert(Pointtemp.begin(), Point.begin() + 6 * i, Point.begin() + 6 * (i + 1));
Pointtemp.insert(Pointtemp.begin(), Point.begin() + 6 * j, Point.begin() + 6 * (j + 1));
Pointtemp.insert(Pointtemp.begin(), Point.begin() + 6 * k, Point.begin() + 6 * (k + 1));
Pointtemp.insert(Pointtemp.begin(), Point.begin() + 6 * l, Point.begin() + 6 * (l + 1));

                TcpCalibration_1(DH, Pointtemp, T_tool, Error);
                Comb_error[Comb_no] = Error[0];
                qDebug()<<i<<" "<<j<<" "<<k<<" "<<l<<" "<<Error[0]<<" "<<Error[1]<<" "<<Error[2];
                if (Comb_error[Comb_no] < Comb_error_min)
                {
                    Comb_error_min = Comb_error[Comb_no];
                    Comb_error_min_no = Comb_no;
                }
                Comb_no++;
                Pointtemp.clear();
            }
        }
    }
}
// 给出误差较小的标定点
Comb_no = Comb_error_min_no;
Pointtemp.insert(Pointtemp.begin(), Point.begin() + 6 * Comb_array[Comb_no][0], Point.begin() + 6 * (Comb_array[Comb_no][0] + 1));
Pointtemp.insert(Pointtemp.begin(), Point.begin() + 6 * Comb_array[Comb_no][1], Point.begin() + 6 * (Comb_array[Comb_no][1] + 1));
Pointtemp.insert(Pointtemp.begin(), Point.begin() + 6 * Comb_array[Comb_no][2], Point.begin() + 6 * (Comb_array[Comb_no][2] + 1));
Pointtemp.insert(Pointtemp.begin(), Point.begin() + 6 * Comb_array[Comb_no][3], Point.begin() + 6 * (Comb_array[Comb_no][3] + 1));
TcpCalibration_1(DH, Pointtemp, T_tool, Error);

}

void RunDefination::TcpCalibration_1(float DH[6], vector Point, double T_tool[NUM_TRAJECTORY_ARRARY], double Error[3])
{
#if 1
int SizeOfVector = Point.size();
int pointNum = 0;
int Dimension = 0;
pointNum = SizeOfVector/6; //标定点数量
Dimension = 3*(pointNum-1); //方程数量
double PointAngle[pointNum][6] = {0};
double Tx[pointNum][16] = {0};
Eigen::MatrixXd CoefficientMatrix(Dimension,3); //系数矩阵
Eigen::VectorXd B(Dimension); //余项
Eigen::MatrixXd GeneralizedInverseOfCoefficientMatrix(3,Dimension); //系数矩阵的广义逆
Eigen::Matrix3d RotationMatrix; //旋转矩阵
Eigen::Matrix3d RotationMatrix1;
Eigen::Matrix3d RotationMatrix2;
Eigen::Vector3d PositionVector; //位置矢量
Eigen::Vector3d PositionVector1;
Eigen::Vector3d PositionVector2;
Eigen::Vector3d TcpVector; //TCP
Eigen::Matrix3d Temp;
for(int i=0;i<pointNum;i++)
{
for(int j=0;j<6;j++)
{
PointAngle[i][j] = Point[i6+j];
}
forward(DH,PointAngle[i],Tx[i]);
}
for(int i=0;i<pointNum-1;i++)
{
for(int m=0;m<3;m++)
{
for(int n=0;n<3;n++)
{
RotationMatrix1(m,n) = Tx[i][m
4+n];
RotationMatrix2(m,n) = Tx[i+1][m4+n];
}
PositionVector1[m] = Tx[i][m
4+3];
PositionVector2[m] = Tx[i+1][m4+3];
B[i
3+m] = PositionVector2[m] - PositionVector1[m];
}
RotationMatrix = RotationMatrix1 - RotationMatrix2;
CoefficientMatrix.block(i3,0,3,3) = RotationMatrix;
PositionVector = PositionVector2 - PositionVector1;
// B.block(i
3,(i+1)*3-1) = PositionVector;
}
Temp = CoefficientMatrix.transpose() * CoefficientMatrix;
GeneralizedInverseOfCoefficientMatrix = Temp.inverse() * CoefficientMatrix.transpose();
TcpVector = GeneralizedInverseOfCoefficientMatrix * B;
// TcpVector = Temp.inverse() * CoefficientMatrix.transpose() * B;

T_tool[3]   =   static_cast<float>(TcpVector[0]);
T_tool[7]   =   static_cast<float>(TcpVector[1]);
T_tool[11]  =   static_cast<float>(TcpVector[2]);
Eigen::VectorXd CalibrationError(Dimension);
Eigen::VectorXd CalibrationErrorSum(pointNum-1);
CalibrationError   =   CoefficientMatrix   *   TcpVector   -   B;
double  MaxError    =   0;
double  MinError    =   100;
double  AveError    =   0;
double  SumError    =   0;
for(int i=0;i<pointNum-1;i++)
{
    CalibrationErrorSum[i]  =   sqrt(pow(CalibrationError[i*3],2)+pow(CalibrationError[i*3+1],2)+pow(CalibrationError[i*3+2],2));
    if(CalibrationErrorSum[i]>=MaxError)
        MaxError    =   CalibrationErrorSum[i];
    if(CalibrationErrorSum[i]<=MinError)
        MinError    =   CalibrationErrorSum[i];
    SumError        +=  CalibrationErrorSum[i];
}
AveError    =   SumError/pointNum;
Error[0]    =   MaxError;
Error[1]    =   MinError;
Error[2]    =   AveError;

#endif

// for(int i=0;i<16;i++)
// {
// if(i%5==0)
// T_tool[i] = 1;
// else
// T_tool[i] = 0;
// }
// double Tx[4][16] = {0};
// double temp[6] = {0};
// for (int i=0;i<4;i++)
// {
// for(int j=0;j<6;j++)
// {
// temp[j] = cal_pos[i][j];
// }
// forward(DH,temp,Tx[i]);
// }
// int CaliNum = 4;
// float Ptcp[3] = {0};
// float Tx_float[4][16] = {0};
// for(int i = 0;i<4;i++)
// {
// for(int j = 0;j<16;j++)
// {
// Tx_float[i][j] = static_cast(Tx[i][j]);
// }
// }
// TCP(Tx_float[0],Tx_float[1],Tx_float[2],Tx_float[3],CaliNum,Ptcp);
// T_tool[3] = Ptcp[0];
// T_tool[7] = Ptcp[1];
// T_tool[11] = Ptcp[2];
// qDebug()<<“NEWW”<<Ptcp[0]<<Ptcp[1]<<Ptcp[2];
}

  • 22
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值