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 12:29:46 浏览: 120
这段代码使用一个循环来遍历 `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 (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]` 设置为零。
if (ft_sensor_KunWei != nullptr) { sensor_data = ft_sensor_KunWei->getFTSensorData(); for (int i = 0; i < WORKSPACE_DIM; i++) { sensor_data[i] *= GRAVITY; } } else if (ft_sensor_ATI != nullptr) sensor_data = ft_sensor_ATI->getFTSensorData(); for (int i = 0; i < WORKSPACE_DIM; i++) { sensor_wrench[i] = sensor_data[i] - sensor_offset[i]; } RLJntArray jnt_zero = { 0.0 }; tcp_wrench = aral->kdCalTCPWrenchFromEndSensor(sensor_wrench, toArray(q), jnt_zero, jnt_zero); // 只补偿重力项 in_wrench = aral->kdChangeWrenchBase(tcp_wrench, X_cur); // 转换到基坐标系描述 if(not app_type && point_sz != 1) memcpy(in_wrench.data(), tcp_wrench.data(), sizeof(double) * ROBOT_DOF);
这段代码首先判断是否存在 KunWei 或 ATI 的力/力矩传感器对象。如果存在 KunWei 传感器,则通过 `getFTSensorData()` 函数获取传感器数据,并将其乘以重力常数 `GRAVITY`。如果存在 ATI 传感器,则直接获取传感器数据。
接下来,对传感器数据进行处理,将其减去传感器偏移量,得到传感器力和力矩。
然后,定义了一个全零的 `RLJntArray` 变量 `jnt_zero`,并调用 `kdCalTCPWrenchFromEndSensor()` 函数将传感器力和力矩转换为末端工具的力和力矩(仅补偿重力项)。然后,通过调用 `kdChangeWrenchBase()` 函数将工具端的力和力矩转换到基坐标系描述。
最后,如果 `app_type` 为假且 `point_sz` 不等于1,则将 TCP 的力和力矩复制到输入的力和力矩变量中。
阅读全文