void ForceSensorVisualizerItem::updateForceSensorState(int index) { if(index < static_cast<int>(forceSensors.size())){ ForceSensor* sensor = forceSensors[index]; Vector3 v = sensor->link()->T() * sensor->T_local() * sensor->f(); forceSensorArrows[index]->setVector(v * visualRatio); } }
void ForceSensorVisualizerItem::updateSensorPositions() { for(size_t i=0; i < forceSensors.size(); ++i){ ForceSensor* sensor = forceSensors[i]; Vector3 p = sensor->link()->T() * sensor->localTranslation(); forceSensorArrows[i]->setTranslation(p); } }
void ForwardDynamicsABM::updateForceSensors() { const DeviceList<ForceSensor>& sensors = sensorHelper.forceSensors(); for(size_t i=0; i < sensors.size(); ++i){ ForceSensor* sensor = sensors[i]; const DyLink* link = static_cast<DyLink*>(sensor->link()); // | f | = | Ivv trans(Iwv) | * | dvo | + | pf | // | tau | | Iwv Iww | | dw | | ptau | const Vector3 f = -(link->Ivv() * link->dvo() + link->Iwv().transpose() * link->dw() + link->pf()); const Vector3 tau = -(link->Iwv() * link->dvo() + link->Iww() * link->dw() + link->ptau()); const Matrix3 R = link->R() * sensor->R_local(); const Vector3 p = link->p() + link->R() * sensor->p_local(); sensor->f().noalias() = R.transpose() * f; sensor->tau().noalias() = R.transpose() * (tau - p.cross(f)); sensor->notifyStateChange(); } }
void ODEBody::updateForceSensors(bool flipYZ) { const DeviceList<ForceSensor>& forceSensors = sensorHelper.forceSensors(); for(int i=0; i < forceSensors.size(); ++i){ ForceSensor* sensor = forceSensors.get(i); const Link* link = sensor->link(); const dJointFeedback& fb = forceSensorFeedbacks[i]; Vector3 f, tau; if(!flipYZ){ f << fb.f2[0], fb.f2[1], fb.f2[2]; tau << fb.t2[0], fb.t2[1], fb.t2[2]; } else { f << fb.f2[0], -fb.f2[2], fb.f2[1]; tau << fb.t2[0], -fb.t2[2], fb.t2[1]; } const Matrix3 R = link->R() * sensor->R_local(); const Vector3 p = link->R() * sensor->p_local(); sensor->f() = R.transpose() * f; sensor->tau() = R.transpose() * (tau - p.cross(f)); sensor->notifyStateChange(); } }