for (int i = 0; i < WORKSPACE_DIM; i++) { int sign_wrench_tool = (in_wrench[i] > 0) - (in_wrench[i] < 0); if (fabs(in_wrench[i]) < force_threshold[i]) { in_wrench[i] = 0; } else if (fabs(in_wrench[i]) > force_limit[i]) { in_wrench[i] = sign_wrench_tool * force_limit[i]; std::cout << "传感器受力超出限制!" << std::endl; return -1; } }
时间: 2024-04-19 15:29:46 浏览: 31
这段代码使用一个循环来遍历 `in_wrench` 数组中的元素。对于每个元素,首先计算出符号值 `sign_wrench_tool`,即大于0的元素为1,小于0的元素为-1。然后,通过比较 `in_wrench[i]` 的绝对值和 `force_threshold[i]` 的大小,如果小于阈值,则将其置为0。如果大于力限制 `force_limit[i]`,则将其置为 `sign_wrench_tool * force_limit[i]`,并输出一条错误消息 "传感器受力超出限制!"。最后,返回-1表示出现了超出限制的情况。
相关问题
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; }
这段代码是一个条件语句,判断`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]` 设置为零。
相关推荐
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)