diff --git a/source/RobotAPI/components/units/InertialMeasurementUnitObserver.cpp b/source/RobotAPI/components/units/InertialMeasurementUnitObserver.cpp index 388f3939f916e4c7cf55cdb9917fdf8df6b9f911..3f387568df7d54c2b6c93ea27852269ff39ba562 100644 --- a/source/RobotAPI/components/units/InertialMeasurementUnitObserver.cpp +++ b/source/RobotAPI/components/units/InertialMeasurementUnitObserver.cpp @@ -72,10 +72,6 @@ void InertialMeasurementUnitObserver::reportSensorValues(const std::string& devi TimestampVariantPtr timestampPtr = TimestampVariantPtr::dynamicCast(timestamp); - Vector3Ptr acceleration = new Vector3(values.acceleration.at(0), values.acceleration.at(1), values.acceleration.at(2)); - Vector3Ptr gyroscopeRotation = new Vector3(values.gyroscopeRotation.at(0), values.gyroscopeRotation.at(1), values.gyroscopeRotation.at(2)); - Vector3Ptr magneticRotation = new Vector3(values.magneticRotation.at(0), values.magneticRotation.at(1), values.magneticRotation.at(2)); - QuaternionPtr orientationQuaternion = new Quaternion(values.orientationQuaternion.at(0), values.orientationQuaternion.at(1), values.orientationQuaternion.at(2), values.orientationQuaternion.at(3)); if (!existsChannel(device)) { @@ -83,29 +79,52 @@ void InertialMeasurementUnitObserver::reportSensorValues(const std::string& devi } offerOrUpdateDataField(device, "name", Variant(name), "Name of the IMU sensor"); - offerValue(device, "acceleration", acceleration); - offerValue(device, "gyroscopeRotation", gyroscopeRotation); - offerValue(device, "magneticRotation", magneticRotation); - offerValue(device, "acceleration", acceleration); - offerOrUpdateDataField(device, "orientationQuaternion", orientationQuaternion, "orientation quaternion values"); + Vector3Ptr acceleration; + QuaternionPtr orientationQuaternion; + if (values.acceleration.size() > 0) + { + ARMARX_CHECK_EXPRESSION(values.acceleration.size() == 3); + acceleration = new Vector3(values.acceleration.at(0), values.acceleration.at(1), values.acceleration.at(2)); + offerValue(device, "acceleration", acceleration); + } + if (values.gyroscopeRotation.size() > 0) + { + ARMARX_CHECK_EXPRESSION(values.gyroscopeRotation.size() == 3); + Vector3Ptr gyroscopeRotation = new Vector3(values.gyroscopeRotation.at(0), values.gyroscopeRotation.at(1), values.gyroscopeRotation.at(2)); + offerValue(device, "gyroscopeRotation", gyroscopeRotation); + } + if (values.magneticRotation.size() > 0) + { + ARMARX_CHECK_EXPRESSION(values.magneticRotation.size() == 3); + Vector3Ptr magneticRotation = new Vector3(values.magneticRotation.at(0), values.magneticRotation.at(1), values.magneticRotation.at(2)); + offerValue(device, "magneticRotation", magneticRotation); + } + if (values.orientationQuaternion.size() > 0) + { + ARMARX_CHECK_EXPRESSION(values.orientationQuaternion.size() == 4); + orientationQuaternion = new Quaternion(values.orientationQuaternion.at(0), values.orientationQuaternion.at(1), values.orientationQuaternion.at(2), values.orientationQuaternion.at(3)); + offerOrUpdateDataField(device, "orientationQuaternion", orientationQuaternion, "orientation quaternion values"); + } offerOrUpdateDataField(device, "timestamp", timestampPtr, "Timestamp"); updateChannel(device); - Eigen::Vector3f zero; - zero.setZero(); - - DrawColor color; - color.r = 1; - color.g = 1; - color.b = 0; - color.a = 0.5; - Eigen::Vector3f ac = acceleration->toEigen(); - ac *= 10; - if (getProperty<bool>("EnableVisualization").getValue()) + if (orientationQuaternion && acceleration && getProperty<bool>("EnableVisualization").getValue()) { + Eigen::Vector3f zero; + zero.setZero(); + + DrawColor color; + color.r = 1; + color.g = 1; + color.b = 0; + color.a = 0.5; + + Eigen::Vector3f ac = acceleration->toEigen(); + ac *= 10; + debugDrawerPrx->setLineVisu("IMU", "acceleration", new Vector3(), new Vector3(ac), 2.0f, color); PosePtr posePtr = new Pose(orientationQuaternion->toEigen(), zero);