if(not app_type) { for (int i = 0; i < WORKSPACE_DIM; i++) { integral_err_wrench[i] += err_wrench[i] * DT; diff_err_wrench[i] = (err_wrench[i] - last_err_wrench[i]) / DT; err_wrench[i] = Kp[i] * err_wrench[i] + Ki[i] * integral_err_wrench[i] + Kd[i] * diff_err_wrench[i]; } last_err_wrench = err_wrench; }
时间: 2024-04-11 17:32:26 浏览: 8
这段代码是一个条件语句,判断`app_type`是否为假。如果是,则进入条件语句的代码块。
在代码块中,使用一个循环来遍历长度为`WORKSPACE_DIM`的数组。在每次迭代中,计算积分误差`integral_err_wrench`、差分误差`diff_err_wrench`和总误差`err_wrench`。具体计算方式为:
1. 将当前误差`err_wrench`乘以时间间隔`DT`并累加到积分误差`integral_err_wrench`中。
2. 计算差分误差`diff_err_wrench`,即当前误差与上一次误差之差除以时间间隔`DT`。
3. 计算总误差`err_wrench`,即比例项`Kp[i]`乘以当前误差,积分项`Ki[i]`乘以积分误差,和微分项`Kd[i]`乘以差分误差的和。
最后,将当前误差`err_wrench`赋值给上一次误差`last_err_wrench`。
注意:这段代码中的变量`Kp[i]`、`Ki[i]`和`Kd[i]`表示比例、积分和微分系数,需要在代码中提前定义和初始化。另外,变量`err_wrench`、`integral_err_wrench`和`diff_err_wrench`也需要在代码中声明和初始化。
相关问题
if (frame_task) // 关节空间 { double jac[ARAL_ROBOT_DOF * 6]; if (first_time) { aral->kdCalJacobian(toArray(q), true, jac); first_time = false; } else { aral->kdCalJacobian(q_cmd, true, jac); } for (int i = 0; i < ARAL_ROBOT_DOF; i++) { in_torq[i] = 0; for (int j = 0; j < 6; j++) in_torq[i] += jac[i + j * 6] * in_wrench[j]; // 传感器数据由基坐标系转换到关节空间 } for (int i = 0; i < WORKSPACE_DIM; i++) F[i] = in_torq[i]; } else { for (int i = 0; i < WORKSPACE_DIM; i++) F[i] = in_wrench[i]; } for (int i = 0; i < WORKSPACE_DIM; i++) { if (fc_enable[i] == true) { err_wrench[i] = F_d[i] - F[i]; } else { err_wrench[i] = 0; } }
这段代码首先检查 `frame_task` 变量,如果为真,则表示执行关节空间的任务。在这种情况下,代码会计算雅可比矩阵,并将其保存在 `jac` 数组中。如果是第一次执行,会使用当前的关节位置 `q` 调用 `kdCalJacobian()` 函数进行计算,并将 `first_time` 标志设置为假。否则,将使用 `q_cmd`(命令的关节位置)调用 `kdCalJacobian()` 函数进行计算。
然后,使用计算得到的雅可比矩阵将输入的力和力矩转换为关节空间中的力矩。这是通过一个嵌套的循环实现的,首先使用内部循环遍历 `jac` 数组的列,然后使用外部循环遍历 `in_torq` 数组的行,在每次迭代中,将雅可比矩阵元素与输入力和力矩相乘,并累加到 `in_torq` 数组中。
接下来,根据 `frame_task` 的值,将结果存储在 `F` 数组中。如果 `frame_task` 为真,则使用 `in_torq` 数组中的值。否则,直接使用输入的力和力矩数据。
最后,通过一个循环,根据 `fc_enable` 数组的值计算错误力和力矩。如果 `fc_enable[i]` 为真,则将期望力 `F_d[i]` 与实际力 `F[i]` 相减,并将结果存储在 `err_wrench` 数组中。如果 `fc_enable[i]` 为假,则将 `err_wrench[i]` 设置为零。
std::vector<std::vector<double>> temp_point(point_sz); for (unsigned int i = 0; i < point_sz; i++) temp_point[i] = point[i]; if (not app_type) { memcpy(q_init.data(), point[0].data(), sizeof(double) * ROBOT_DOF); aral->kdCalForwardPosition(toArray(q_init), false, true, pose_init); if (point_sz == 1) { for (int i = 0; i < WORKSPACE_DIM; i++) { pose_start[i] = pose_init[i] + rot_error[i]; pose_end[i] = pose_start[i] + trans_error[i]; }
这段代码是一个简单的C++代码片段,主要涉及了对std::vector<std::vector<double>>类型的数据进行处理。首先,创建了一个名为temp_point的二维向量,其大小为point_sz。然后,通过循环将原始二维向量point中的每个子向量赋值给temp_point中对应的子向量。
接下来,根据app_type的值判断条件,对q_init、pose_init、pose_start和pose_end进行赋值操作。其中,q_init是一个存储double类型数据的一维数组,根据point中第一个子向量的数据进行赋值。aral->kdCalForwardPosition是一个函数调用,根据q_init计算出pose_init。
如果point_sz等于1,则通过循环对pose_start和pose_end进行赋值操作。具体的赋值逻辑是将pose_init与rot_error相加得到pose_start,再将pose_start与trans_error相加得到pose_end。