From 864e22d3f32456485c712328ace7153c4b9732f2 Mon Sep 17 00:00:00 2001 From: Silvio Traversaro Date: Wed, 10 Jul 2024 16:51:01 +0200 Subject: [PATCH 1/4] Cleanup code that configure FT sensors --- devices/wholeBodyDynamics/README.md | 21 +- .../WholeBodyDynamicsDevice.cpp | 385 +++++------- .../WholeBodyDynamicsDevice.h | 8 +- .../ergocub_simulated_wholebodydynamics.xml | 1 + ...ndOffsetCompensationInWholeBodyDynamics.md | 46 -- pixi.lock | 572 +++++++++++++++++- pixi.toml | 2 + pixi_source_deps_options.meta | 2 + 8 files changed, 764 insertions(+), 273 deletions(-) delete mode 100644 doc/howto/useTemperatureCoefficientsAndOffsetCompensationInWholeBodyDynamics.md diff --git a/devices/wholeBodyDynamics/README.md b/devices/wholeBodyDynamics/README.md index ae32f54..5658469 100644 --- a/devices/wholeBodyDynamics/README.md +++ b/devices/wholeBodyDynamics/README.md @@ -61,6 +61,26 @@ For an overview on `wholeBodyDynamics` and to understand how to run the device, The axes contained in the `axesNames` parameter are then mapped to the wrapped `controlboard` in the `attachAll` method, using `controlBoardRemapper` class. Furthermore are also used to match the yarp axes to the joint names found in the passed URDF file. +#### Specifying the Force Torque Sensors to use + +By default, the `wholebodydynamics` device takes the list of forcetorque sensors from the `multipleAnalogSensorsNames` group that signals which FT sensors are used. + +In particular, the `SixAxisForceTorqueSensorsNames` parameter from the `multipleAnalogSensorsNames` group specify the sensor names that are used. + +Example: +``` + + (l_leg_ft,r_leg_ft,l_foot_ft,r_foot_ft) + +``` + +The sensors specified in this way need to be: +* Available in the URDF sensor used for the robot, using the format supported by iDynTree to specify FT sensors (see https://github.com/robotology/idyntree/blob/master/doc/model_loading.md#force_torque) +* Exposed as YARP devices that expose the [`yarp::dev::ISixAxisForceTorqueSensors`](https://www.yarp.it/latest/classyarp_1_1dev_1_1ISixAxisForceTorqueSensors.html) YARP interface in one of the devices passed to the device via the `attach` xml list or the `attachAll` C++ method. + +If the `FT_TEMPERATURE_COEFFICIENTS` parameter is specified, then it is assumed that for each FT sensors there is a temperature sensor with the same name the measure of which is available via the [`yarp::dev::ITemperatureSensors`](https://www.yarp.it/latest/classyarp_1_1dev_1_1ITemperatureSensors.html) interface. If that is not the case, an error is raised. To use the temperature compensation, all used FT sensors must support the temperature compensation. + + #### Gravity Compensation This device also provides gravity compensation torques (using the `IImpedanceControl::setImpedanceOffset` method) for axis that are in compliant interaction mode and in position/position direct/velocity control mode. @@ -149,7 +169,6 @@ Typically this estimates are provided only for the upper joints (arms and torso) ``` -For a detailed explanation on their usage, please see the document [Using temperature coefficients and pre-estimated FT offsets](../../doc/howto/useTemperatureCoefficientsAndOffsetCompensationInWholeBodyDynamics.md). #### Filters diff --git a/devices/wholeBodyDynamics/WholeBodyDynamicsDevice.cpp b/devices/wholeBodyDynamics/WholeBodyDynamicsDevice.cpp index be973b7..29935d8 100644 --- a/devices/wholeBodyDynamics/WholeBodyDynamicsDevice.cpp +++ b/devices/wholeBodyDynamics/WholeBodyDynamicsDevice.cpp @@ -55,7 +55,6 @@ WholeBodyDynamicsDevice::WholeBodyDynamicsDevice(): yarp::os::PeriodicThread(def calibrationBuffers.nrOfSamplesUsedUntilNowForCalibration = 0; // temperature measuremnts vector tempMeasurements.resize(0); - ftTempMapping.resize(0); prevFTTempTimeStamp=0; } @@ -350,15 +349,18 @@ bool WholeBodyDynamicsDevice::openRemapperVirtualSensors(os::Searchable& config) return true; } -void getFTJointNames(const iDynTree::Model& model, - std::vector& ftJointNames) +void getFTInfoFromiDynTreeModel(const iDynTree::Model& model, + std::vector& ftJointNames, + std::vector& ftSensorNames) { ftJointNames.resize(0); + ftSensorNames.resize(0); for(size_t sens=0; sens < model.sensors().getNrOfSensors(iDynTree::SIX_AXIS_FORCE_TORQUE); sens++) { iDynTree::SixAxisForceTorqueSensor* pSens = static_cast(model.sensors().getSensor(iDynTree::SIX_AXIS_FORCE_TORQUE,sens)); ftJointNames.push_back(pSens->getParentJoint()); + ftSensorNames.push_back(pSens->getName()); } return; @@ -410,23 +412,54 @@ bool WholeBodyDynamicsDevice::openEstimator(os::Searchable& config) return false; } - // Add FT joints (if they are not already in the consideredDOFs list - std::vector< std::string > ftJointNames; - getFTJointNames(fullModelLoader.model(),ftJointNames); + // Add FT joints (if they are not already in the consideredDOFs list_ + std::vector ftJointNamesiDynTreeModel; + std::vector ftSensorNamesiDynTreeModel; + getFTInfoFromiDynTreeModel(fullModelLoader.model(), ftJointNamesiDynTreeModel, ftSensorNamesiDynTreeModel); - for (size_t i = 0; i < ftJointNames.size(); i++) + for (size_t i = 0; i < ftJointNamesiDynTreeModel.size(); i++) { // Only add an F/T sensor joint if it is not already in consideredDOFs - if (std::find(estimationJointNames.begin(), estimationJointNames.end(), ftJointNames[i]) == estimationJointNames.end()) + if (std::find(estimationJointNames.begin(), estimationJointNames.end(), ftJointNamesiDynTreeModel[i]) == estimationJointNames.end()) { - estimationJointNames.push_back(ftJointNames[i]); + estimationJointNames.push_back(ftJointNamesiDynTreeModel[i]); } } iDynTree::ModelLoader mdlLoader; mdlLoader.loadReducedModelFromFile(modelFileFullPath, estimationJointNames, removedJointPositions); - ok = estimator.setModel(mdlLoader.model()); + // Raise an error if the specified ft sensor is not present in the model + for(size_t i=0; i < ftSensorNames.size(); i++) + { + if (std::find(ftSensorNamesiDynTreeModel.begin(), ftSensorNamesiDynTreeModel.end(), ftSensorNames[i]) == ftSensorNamesiDynTreeModel.end()) + { + yError() << "wholeBodyDynamics: sensor named " << ftSensorNames[i] << " not found in the URDF model, are you sure the URDF contains the required tags?"; + return false; + } + } + + // In the estimation we want just to use the FT sensors that are specified in the configuration file, so at this point + // we modify the SensorsList infrastructure to remove the FT sensors that we do not want + // Note that in some case we still want the fixed joints corresponding to the FT sensors even if we do not want to + // consider the FT sensors, see https://github.com/robotology/idyntree/issues/829 + iDynTree::Model newModel = mdlLoader.model(); + iDynTree::SensorsList oldSensorsList = newModel.sensors(); + iDynTree::SensorsList newSensorsList = newModel.sensors(); + + // First of all, we remove from the newSensorsList all the FT sensors + newSensorsList.removeAllSensorsOfType(iDynTree::SIX_AXIS_FORCE_TORQUE); + + // Then, add back only the sensors we want (in the order we want) + for(size_t i=0; i < ftSensorNames.size(); i++) + { + std::ptrdiff_t oldSensorsListSensorIndex = oldSensorsList.getSensorIndex(iDynTree::SIX_AXIS_FORCE_TORQUE, ftSensorNames[i]); + newSensorsList.addSensor(*(oldSensorsList.getSensor(iDynTree::SIX_AXIS_FORCE_TORQUE, oldSensorsListSensorIndex))); + } + + newModel.sensors() = newSensorsList; + + ok = estimator.setModel(newModel); if( !ok ) { yInfo() << "wholeBodyDynamics : impossible to create ExtWrenchesAndJointTorquesEstimator from file " @@ -864,30 +897,43 @@ bool WholeBodyDynamicsDevice::openMultipleAnalogSensorRemapper(os::Searchable &c yarp::os::Property prop; prop.fromString(config.toString().c_str()); yarp::os::Property propMASRemapper; - yarp::os::Bottle & propMasNames=prop.findGroup("multipleAnalogSensorsNames"); + propMASRemapper.put("device","multipleanalogsensorsremapper"); - bool ok=false; - for (auto types=1u;typessize() != 2 || mas_type->get(1).asList() == nullptr ) - { - yError() << "wholeBodyDynamics: multipleAnalogSensorsNames group is malformed (" << mas_type->toString() << "). "; - return false; - } - else { - ok=true; - } - propMASRemapper.addGroup(mas_type->get(0).asString()); - yarp::os::Bottle MASnames; - yarp::os::Bottle & MASnamesList= MASnames.addList(); - for(auto i=0u; i < mas_type->get(1).asList()->size(); i++) - { - MASnamesList.addString(mas_type->get(1).asList()->get(i).asString()); - } - propMASRemapper.put(mas_type->get(0).asString(),MASnames.get(0)); + // We get the multipleAnalogSensorsNames group, but from it we just use the multipleAnalogSensorsNames parameter + if (!prop.check("multipleAnalogSensorsNames")) + { + yError() << "wholeBodyDynamics :Impossible to find requied group multipleAnalogSensorsNames"; + return false; + } + + yarp::os::Searchable& multipleAnalogSensorsNames = prop.findGroup("multipleAnalogSensorsNames"); + + bool required = true; + bool ok = getConfigParamsAsList(multipleAnalogSensorsNames, "SixAxisForceTorqueSensorsNames", this->ftSensorNames, required); + if (!ok) + { + yError() << "wholeBodyDynamics :Impossible to find required variable SixAxisForceTorqueSensorsNames in group multipleAnalogSensorsNames"; + return false; + } + if (multipleAnalogSensorsNames.find("TemperatureSensorsNames").isList()) + { + yWarning() << "wholeBodyDynamics : TemperatureSensorsNames parameter is not used anymore, the names in SixAxisForceTorqueSensorsNames are used, please remove TemperatureSensorsNames parameter to avoid confusion"; } + + addVectorOfStringToProperty(propMASRemapper, "SixAxisForceTorqueSensorsNames", this->ftSensorNames); + + if (this->m_temperatureCompensationEnabled) + { + // If temperature compensation is required, also pass the sensor names as temperature sensors, if the load of the remapper will fail that will mean that + // the required FT sensors are not available + addVectorOfStringToProperty(propMASRemapper, "TemperatureSensorsNames", this->ftSensorNames); + } + + + + // Try to load the required sensors ok = multipleAnalogRemappedDevice.open(propMASRemapper); if( !ok ) { @@ -897,6 +943,7 @@ bool WholeBodyDynamicsDevice::openMultipleAnalogSensorRemapper(os::Searchable &c ok = ok && multipleAnalogRemappedDevice.view(remappedMASInterfaces.temperatureSensors); ok = ok && multipleAnalogRemappedDevice.view(remappedMASInterfaces.ftMultiSensors); ok = ok && multipleAnalogRemappedDevice.view(remappedMASInterfaces.multwrap); + if( !ok ) { yError() << "wholeBodyDynamics : openMultipleAnalogSensorRemapper : error while opening the necessary interfaces in multipleAnalogRemappedDevice"; @@ -970,7 +1017,6 @@ void WholeBodyDynamicsDevice::resizeBuffers() // Resize temperature sensor inside F/T sensors this->tempMeasurements.resize(nrOfFTSensors,0.0); - this->ftTempMapping.resize(nrOfFTSensors,-1); // Resize filters filters.init(nrOfFTSensors, @@ -1137,8 +1183,8 @@ bool WholeBodyDynamicsDevice::loadSettingsFromConfig(os::Searchable& config) std::string estimateJointVelocityAccelerationOptionName = "estimateJointVelocityAcceleration"; if( !(prop.check(estimateJointVelocityAccelerationOptionName.c_str()) && prop.find(estimateJointVelocityAccelerationOptionName.c_str()).isBool()) ) { - yWarning() << "wholeBodyDynamics: estimateVelocityAccelerationOptionName bool parameter missing, please specify it."; - yWarning() << "wholeBodyDynamics: setting estimateVelocityAccelerationOptionName to the default value of true, but this is a deprecated behaviour that will be removed in the future."; + yWarning() << "wholeBodyDynamics: estimateJointVelocityAcceleration bool parameter missing, please specify it."; + yWarning() << "wholeBodyDynamics: setting estimateJointVelocityAcceleration to the default value of true, but this is a deprecated behaviour that will be removed in the future."; settings.estimateJointVelocityAcceleration = false; } else @@ -1319,6 +1365,25 @@ bool WholeBodyDynamicsDevice::loadSecondaryCalibrationSettingsFromConfig(os::Sea } +bool WholeBodyDynamicsDevice::checkIfTemperatureCompensationIsSetFromConfig(os::Searchable& config) +{ + bool ret; + yarp::os::Property propAll; + propAll.fromString(config.toString().c_str()); + + if( propAll.check("FT_TEMPERATURE_COEFFICIENTS") ) + { + this->m_temperatureCompensationEnabled = true; + } + else + { + this->m_temperatureCompensationEnabled = false; + } + + return true; +} + + bool WholeBodyDynamicsDevice::loadTemperatureCoefficientsSettingsFromConfig(os::Searchable& config) { bool ret; @@ -1530,10 +1595,25 @@ bool WholeBodyDynamicsDevice::open(os::Searchable& config) { std::lock_guard guard(this->deviceMutex); - yDebug() << "wholeBodyDynamics Statistics: Opening estimator."; + // As first step, check if temperature compensation is enabled, as this influence the rest of the parsing + this->checkIfTemperatureCompensationIsSetFromConfig(config); + + yDebug() << "wholeBodyDynamics Statistics: Opening multiple analog sensors remapper."; double tick = yarp::os::Time::now(); - bool ok; + // Open the multiple analog sensor remapper + bool ok = this->openMultipleAnalogSensorRemapper(config); + if( !ok ) + { + yError() << "wholeBodyDynamics: Problem in opening multiple analog sensor remapper."; + return false; + } + + yDebug() << "wholeBodyDynamics Statistics: Multiple analog sensors remapper opened in " << yarp::os::Time::now() - tick << "s."; + + yDebug() << "wholeBodyDynamics Statistics: Opening estimator."; + tick = yarp::os::Time::now(); + // Create the estimator ok = this->openEstimator(config); if( !ok ) @@ -1586,14 +1666,6 @@ bool WholeBodyDynamicsDevice::open(os::Searchable& config) return false; } - // Open settings related to gravity compensation (we need the estimator to be open) - ok = this->loadTemperatureCoefficientsSettingsFromConfig(config); - if( !ok ) - { - yError() << "wholeBodyDynamics: Problem in loading temperature coefficients matrix settings."; - return false; - } - // Open settings related to gravity compensation (we need the estimator to be open) ok = this->loadFTSensorOffsetFromConfig(config); if( !ok ) @@ -1697,19 +1769,6 @@ bool WholeBodyDynamicsDevice::open(os::Searchable& config) yDebug() << "wholeBodyDynamics Statistics: External port wrenches opened in " << yarp::os::Time::now() - tick << "s."; - yDebug() << "wholeBodyDynamics Statistics: Opening multiple analog sensors remapper."; - tick = yarp::os::Time::now(); - - // Open the multiple analog sensor remapper - ok = this->openMultipleAnalogSensorRemapper(config); - if( !ok ) - { - yError() << "wholeBodyDynamics: Problem in opening multiple analog sensor remapper."; - return false; - } - - yDebug() << "wholeBodyDynamics Statistics: Multiple analog sensors remapper opened in " << yarp::os::Time::now() - tick << "s."; - // Open the ports related to publishing filtered ft wrenches if (streamFilteredFT){ yDebug() << "wholeBodyDynamics Statistics: Opening filtered FT ports."; @@ -1769,140 +1828,30 @@ bool WholeBodyDynamicsDevice::attachAllVirtualAnalogSensor(const PolyDriverList& bool WholeBodyDynamicsDevice::attachAllFTs(const PolyDriverList& p) { - yInfo()<<"Starting attach MAS and analog ft"; - PolyDriverList ftSensorList; - PolyDriverList tempSensorList; - std::vector ftDeviceNames; - - std::size_t nrMASFTSensors{0}; - for(auto devIdx = 0; devIdx poly->view(fts) ) - { - auto nrFTsinThisDevice = fts->getNrOfSixAxisForceTorqueSensors(); - if(nrFTsinThisDevice > 0) - { - ftSensorList.push(const_cast(*p[devIdx])); - ftDeviceNames.push_back(p[devIdx]->key); - } - nrMASFTSensors += nrFTsinThisDevice; - for (auto ftDx = 0; ftDx < nrFTsinThisDevice; ftDx++) - { - std::string ftName; - fts->getSixAxisForceTorqueSensorName(ftDx, ftName); - ftMultipleAnalogSensorNames.emplace_back(ftName); - } - } - if( p[devIdx]->poly->view(tempS) ) - { - tempSensorList.push(const_cast(*p[devIdx])); - } - } - yDebug()<<"wholeBodyDynamicsDevice :: number of devices that could contain FT sensors found "<attachAll(ftSensorList); - ok = ok & remappedMASInterfaces.multwrap->attachAll(tempSensorList); - + bool ok = remappedMASInterfaces.multwrap->attachAll(p); if( !ok ) { yError() << " WholeBodyDynamicsDevice::attachAll in attachAll of the remappedMASInterfaces"; return false; } + yInfo()<<"wholeBodyEstimators: Ended of attach MAS and analog ft"; - ftMultipleAnalogSensorIdxMapping.resize(ftMultipleAnalogSensorNames.size()); - for (auto ftDx = 0; ftDx < nrMASFTSensors; ftDx++) - { - std::string sensorName; - remappedMASInterfaces.ftMultiSensors->getSixAxisForceTorqueSensorName(ftDx, sensorName); - auto ftIter = std::find(ftMultipleAnalogSensorNames.begin(), ftMultipleAnalogSensorNames.end(), sensorName); - if (ftIter != ftMultipleAnalogSensorNames.end()) - { - auto ftMapIdx = std::distance(ftMultipleAnalogSensorNames.begin(), ftIter); - ftMultipleAnalogSensorIdxMapping[ftMapIdx] = ftDx; - } - } - - // Check if the MASremapper and the estimator have a consistent number of ft sensors - int tempSensors = 0; - tempSensors=static_cast( remappedMASInterfaces.temperatureSensors->getNrOfTemperatureSensors()); - if( tempSensors > static_cast( estimator.model().sensors().getNrOfSensors(iDynTree::SIX_AXIS_FORCE_TORQUE)) ) - { - yError() << "wholeBodyDynamics : The multipleAnalogRemappedDevice has more sensors than those in the open estimator ft sensors list"; - return false; - } - - int checkCounter=0; - std::string ftName; - std::string tempName; - int ftMap=-1; - for (int tSensor=0;tSensorgetTemperatureSensorName(tSensor,tempName); - int individualCheck=0; - for (int ft=0;ft( estimator.model().sensors().getNrOfSensors(iDynTree::SIX_AXIS_FORCE_TORQUE)); ft++){ - ftName=estimator.model().sensors().getSensor(iDynTree::SIX_AXIS_FORCE_TORQUE,ft)->getName(); - if (tempName==ftName){ - individualCheck++; - ftMap=ft; - } - } - if (individualCheck!=1){ - yWarning()<< "wholeBodyDynamics : A temperature sensor name in multipleAnalogRemappedDevice do not match the name of the ft sensors"; - yDebug()<<"wholeBodyDynamics : Could not find or found multiple times sensor "<(ftMap)]=tSensor; - yInfo()<< "wholeBodyDynamics: ftTempMapping "<< ftMap << " is ft position in model "<< tSensor <<"="<getName(); - - bool ftInAnalog = (std::find(ftAnalogSensorNames.begin(), ftAnalogSensorNames.end(), sensorName) != ftAnalogSensorNames.end()); - bool ftInMAS = (std::find(ftMultipleAnalogSensorNames.begin(), ftMultipleAnalogSensorNames.end(), sensorName) != ftMultipleAnalogSensorNames.end()); - - if (!ftInAnalog && !ftInMAS) - { - yError() << "WholeBodyDynamicsDevice was expecting a sensor named " << sensorName << " but it did not find one in the attached devices"; - return false; - } - } + size_t nrOfFTSensorsInConfigFile = ftSensorNames.size(); if (!settings.disableSensorReadCheckAtStartup) { // We try to read for a brief moment the sensors for two reasons: // so we can make sure that they actually work, and to make sure that the buffers are correctly initialized bool verbose = false; - double tic = yarp::os::Time::now(); - bool timeSpentTryngToReadSensors = 0.0; + double timeSpentTryngToReadSensors = 0.0; bool readSuccessfull = false; + double tic = yarp::os::Time::now(); while( (timeSpentTryngToReadSensors < wholeBodyDynamics_sensorTimeoutInSeconds) && !readSuccessfull ) { readSuccessfull = readFTSensors(verbose); timeSpentTryngToReadSensors = (yarp::os::Time::now() - tic); + yarp::os::Time::delay(0.001); } if( !readSuccessfull ) @@ -2079,64 +2028,51 @@ void convertVectorFromDegreesToRadians(iDynTree::VectorDynSize & vector) bool WholeBodyDynamicsDevice::readFTSensors(bool verbose) { - bool FTSensorsReadCorrectly = true; - bool TempSensorReadCorrectly = true; + bool allReadSuccessful = true; double timeFTStamp=yarp::os::Time::now(); bool readTemperatureSensorThisTime=false; yarp::dev::MAS_status sensorStatus; ftMeasurement.resize(6); - for(size_t ft=0; ft < estimator.model().sensors().getNrOfSensors(iDynTree::SIX_AXIS_FORCE_TORQUE); ft++ ) + for(size_t sensorIndex=0; sensorIndex < estimator.model().sensors().getNrOfSensors(iDynTree::SIX_AXIS_FORCE_TORQUE); sensorIndex++ ) { - std::string sensorName = estimator.model().sensors().getSensor(iDynTree::SIX_AXIS_FORCE_TORQUE,ft)->getName(); + std::string sensorName = estimator.model().sensors().getSensor(iDynTree::SIX_AXIS_FORCE_TORQUE, sensorIndex)->getName(); + double timestamp; + bool singleFTReadCorrectly = remappedMASInterfaces.ftMultiSensors->getSixAxisForceTorqueSensorMeasure(sensorIndex, ftMeasurement, timestamp); - bool ok; - auto ftMasITer = (std::find(ftMultipleAnalogSensorNames.begin(), ftMultipleAnalogSensorNames.end(), sensorName)); - if (ftMasITer != ftMultipleAnalogSensorNames.end()) + if (this->m_temperatureCompensationEnabled) { - auto ftID = std::distance(ftMultipleAnalogSensorNames.begin(), ftMasITer); - auto sensorId = ftMultipleAnalogSensorIdxMapping[ftID]; - double timestamp; - remappedMASInterfaces.ftMultiSensors->getSixAxisForceTorqueSensorMeasure(sensorId, ftMeasurement, timestamp); - - ok = true; - } - - iDynTree::Wrench bufWrench; - if (timeFTStamp-prevFTTempTimeStamp>checkTemperatureEvery_seconds){ - if (ftTempMapping[ft]!=-1){ - sensorStatus=remappedMASInterfaces.temperatureSensors->getTemperatureSensorStatus(ftTempMapping[ft]); - std::string nameOfSensor; - remappedMASInterfaces.temperatureSensors->getTemperatureSensorName(ftTempMapping[ft],nameOfSensor); - + bool singleTempReadCorrectly = false; + if (timeFTStamp-prevFTTempTimeStamp>checkTemperatureEvery_seconds) + { + sensorStatus=remappedMASInterfaces.temperatureSensors->getTemperatureSensorStatus(sensorIndex); - if (sensorStatus==MAS_OK ){ - TempSensorReadCorrectly=remappedMASInterfaces.temperatureSensors->getTemperatureSensorMeasure(ftTempMapping[ft],tempMeasurements[ft],timeFTStamp); - remappedMASInterfaces.temperatureSensors->getTemperatureSensorStatus(ftTempMapping[ft]); - } - else - { //should be yError() but lets leave it like this for now - yInfo()<<"wholeBodyDynamics : Temp sensor "<< nameOfSensor << " return status "<< sensorStatus; - } - readTemperatureSensorThisTime=true; + if (sensorStatus==MAS_OK) + { + singleTempReadCorrectly=remappedMASInterfaces.temperatureSensors->getTemperatureSensorMeasure(sensorIndex, tempMeasurements[sensorIndex], timeFTStamp); + } + else + { //should be yError() but lets leave it like this for now + yInfo()<<"wholeBodyDynamics : Temp sensor "<< sensorName << " return status "<< sensorStatus; + } + readTemperatureSensorThisTime=true; } - else { - tempMeasurements[ft]=0; + + if (readTemperatureSensorThisTime) { + prevFTTempTimeStamp=timeFTStamp; } - } - FTSensorsReadCorrectly = FTSensorsReadCorrectly && ok && TempSensorReadCorrectly; + } - if( !ok && verbose ) + if (!singleFTReadCorrectly) { - std::string sensorName = estimator.model().sensors().getSensor(iDynTree::SIX_AXIS_FORCE_TORQUE,ft)->getName(); yWarning() << "wholeBodyDynamics warning : FT sensor " << sensorName << " was not readed correctly, using old measurement"; } bool isNaN = false; for (size_t i = 0; i < ftMeasurement.size(); i++) { - if( std::isnan(ftMeasurement[i]) || std::isnan(tempMeasurements[ft])) + if( std::isnan(ftMeasurement[i]) || std::isnan(tempMeasurements[sensorIndex])) { isNaN = true; break; @@ -2144,23 +2080,22 @@ bool WholeBodyDynamicsDevice::readFTSensors(bool verbose) } if( isNaN ) { - std::string sensorName = estimator.model().sensors().getSensor(iDynTree::SIX_AXIS_FORCE_TORQUE,ft)->getName(); yError() << "wholeBodyDynamics : FT sensor " << sensorName << " contains nan: " << ftMeasurement.toString() << ", returning error."; return false; } - if( ok ) + if (singleFTReadCorrectly) { // Format of F/T measurement in YARP/iDynTree is consistent: linear/angular + iDynTree::Wrench bufWrench; iDynTree::toiDynTree(ftMeasurement,bufWrench); - - rawSensorsMeasurements.setMeasurement(iDynTree::SIX_AXIS_FORCE_TORQUE,ft,bufWrench); + rawSensorsMeasurements.setMeasurement(iDynTree::SIX_AXIS_FORCE_TORQUE,sensorIndex,bufWrench); } + + allReadSuccessful = allReadSuccessful && singleFTReadCorrectly; } - if (readTemperatureSensorThisTime) { - prevFTTempTimeStamp=timeFTStamp; - } - return FTSensorsReadCorrectly; + + return allReadSuccessful; } bool WholeBodyDynamicsDevice::readIMUSensors(bool verbose) @@ -2265,10 +2200,18 @@ void WholeBodyDynamicsDevice::filterSensorsAndRemoveSensorOffsets() iDynTree::Wrench rawFTMeasure; rawSensorsMeasurements.getMeasurement(iDynTree::SIX_AXIS_FORCE_TORQUE,ft,rawFTMeasure); - iDynTree::Wrench rawFTMeasureWithOffsetRemoved = ftProcessors[ft].filt(rawFTMeasure,tempMeasurements[ft]); + iDynTree::Wrench rawFTMeasureWithOffsetRemoved; + + if (this->m_temperatureCompensationEnabled) + { + rawFTMeasureWithOffsetRemoved = ftProcessors[ft].filt(rawFTMeasure,tempMeasurements[ft]); + } else + { + rawFTMeasureWithOffsetRemoved = ftProcessors[ft].filt(rawFTMeasure); + } // Filter the data - iDynTree::toYarp(rawFTMeasureWithOffsetRemoved,filters.bufferYarp6); + iDynTree::toYarp(rawFTMeasureWithOffsetRemoved, filters.bufferYarp6); // Run the filter const yarp::sig::Vector & outputFt = filters.forcetorqueFilters[ft]->filt(filters.bufferYarp6); diff --git a/devices/wholeBodyDynamics/WholeBodyDynamicsDevice.h b/devices/wholeBodyDynamics/WholeBodyDynamicsDevice.h index 1c8baf2..88f8b81 100644 --- a/devices/wholeBodyDynamics/WholeBodyDynamicsDevice.h +++ b/devices/wholeBodyDynamics/WholeBodyDynamicsDevice.h @@ -366,6 +366,8 @@ class WholeBodyDynamicsDevice : public yarp::dev::DeviceDriver, bool loadSettingsFromConfig(yarp::os::Searchable& config); bool loadSecondaryCalibrationSettingsFromConfig(yarp::os::Searchable& config); bool loadGravityCompensationSettingsFromConfig(yarp::os::Searchable & config); + bool m_temperatureCompensationEnabled{false}; + bool checkIfTemperatureCompensationIsSetFromConfig(yarp::os::Searchable & config); bool loadTemperatureCoefficientsSettingsFromConfig(yarp::os::Searchable& config); bool loadFTSensorOffsetFromConfig(yarp::os::Searchable& config); bool applyLPFSettingsFromConfig(const yarp::os::Property& config, const std::string& setting_name); @@ -446,11 +448,9 @@ class WholeBodyDynamicsDevice : public yarp::dev::DeviceDriver, std::vector ftProcessors; /** - * Vector of Analog FT Sensor names + * Vector of FT Sensor names considered for estimation */ - std::vector ftAnalogSensorNames; - std::vector ftMultipleAnalogSensorNames; - std::vector ftMultipleAnalogSensorIdxMapping; + std::vector ftSensorNames; /*** * RPC Calibration related methods diff --git a/devices/wholeBodyDynamics/test/ergocub_simulated_wholebodydynamics.xml b/devices/wholeBodyDynamics/test/ergocub_simulated_wholebodydynamics.xml index bc83645..99d18da 100644 --- a/devices/wholeBodyDynamics/test/ergocub_simulated_wholebodydynamics.xml +++ b/devices/wholeBodyDynamics/test/ergocub_simulated_wholebodydynamics.xml @@ -13,6 +13,7 @@ 2 true false + false true 3.0 3.0 diff --git a/doc/howto/useTemperatureCoefficientsAndOffsetCompensationInWholeBodyDynamics.md b/doc/howto/useTemperatureCoefficientsAndOffsetCompensationInWholeBodyDynamics.md deleted file mode 100644 index c3b67e0..0000000 --- a/doc/howto/useTemperatureCoefficientsAndOffsetCompensationInWholeBodyDynamics.md +++ /dev/null @@ -1,46 +0,0 @@ -# Using Temperature Compensation for FT Sensor Calibration and Pre-estimated offsets in WholeBodyDynamics - -To enable the use of temperature compensation and constant offset features in wholebodydynamics device, it is required to add some variables in the config file. The variables can be grouped into three: - -- Indicate which sensors belong to the multiple analog sensor category -- Add the temperature coefficients -- Add the offline offset -## Indicating which sensors have multiple analog sensor functionalities - -`multipleAnalogSensorsNames` : it is a group that signals which sensors are multipleAnalogSensors ( MAS ). - -`SixAxisForceTorqueSensorsNames` : it is a parameter from the multipleAnalogSensorsNames group, that signals which sensors function as six axis force torque sensors. - -`TemperatureSensorsNames` : it is a parameter from the multipleAnalogSensorsNames group, that signals which sensors function as temperature sensors. - -Example: -``` - - (l_leg_ft,r_leg_ft,l_foot_ft,r_foot_ft) - (l_leg_ft,r_leg_ft,l_foot_ft,r_foot_ft) -` -``` -## Add the temperature coefficients -`FT_TEMPERATURE_COEFFICIENTS` : group indicating that the coefficients are to be used for temperature compensation -Inside the group the name of the sensors followed by its coefficients should be indicated as a parameter with the name of the sensor. - -Example: - -``` - - (-0.0933 , 0.2048 , 1.3342 , -0.0155 , 0.0027 , 0.0039 , 30.4064) - -``` - -## Add the offline offset -`FT_OFFSET` : group indicating that the offset are to be used when using the `usePreEstimatedOffset` rpc command. -Inside the group the name of the sensors followed by its coefficients should be indicated as a parameter with the name of the sensor. - -Example: -``` - - (24.8009 , -6.2369 , -62.0044 , -0.0588 , -0.2425 , 0.1253) - - -``` - diff --git a/pixi.lock b/pixi.lock index 25cf265..20cb855 100644 --- a/pixi.lock +++ b/pixi.lock @@ -1,4 +1,4 @@ -version: 4 +version: 5 environments: default: channels: @@ -17,10 +17,12 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/binutils_impl_linux-64-2.40-hf600244_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/binutils_linux-64-2.40-hdade7a5_3.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hd590300_5.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.28.1-hd590300_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/c-compiler-1.7.0-hd590300_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2024.2.2-hbcca054_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/catch2-3.5.4-h00ab1b0_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/catkin_pkg-1.0.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cmake-3.29.2-hcfe8598_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/colcon-argcomplete-0.3.3-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/colcon-bash-0.5.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/colcon-cd-0.1.1-pyhd8ed1ab_0.tar.bz2 @@ -70,6 +72,8 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/ipopt-3.14.16-hf967516_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/irrlicht-1.8.5-h2a6caf8_4.conda - conda: https://conda.anaconda.org/conda-forge/noarch/kernel-headers_linux-64-2.6.32-he073ed8_17.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.1-h166bdaf_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.2-h659d440_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/lame-3.100-h166bdaf_1003.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.40-h41732ed_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libasprintf-0.22.5-h661eb56_2.conda @@ -78,7 +82,9 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/libboost-1.84.0-h8013b2b_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libcap-2.69-h0f662aa_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-22_linux64_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.7.1-hca28451_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20191231-he28a2e2_2.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-hd590300_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.6.2-h59595ed_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.2-h7f98852_5.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/linux-64/libflac-1.4.3-h59595ed_0.conda @@ -97,6 +103,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.17-hd590300_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.0.0-hd590300_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-22_linux64_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.58.0-h47da74e_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hd590300_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libogg-1.3.4-h7f98852_1.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.27-pthreads_h413a1c8_0.conda @@ -109,10 +116,12 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/libsndfile-1.2.2-hc60ed4a_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libspral-2024.01.18-h6aa6db2_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.45.2-h2797004_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.0-h0841786_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/libstdcxx-devel_linux-64-12.3.0-h8bca6fd_105.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-13.2.0-h7e041cc_5.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libsystemd0-255-h3516f8a_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.38.1-h0b41bf4_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libuv-1.48.0-hd590300_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libvorbis-1.3.7-h9c3ff4c_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.15-h0b41bf4_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda @@ -120,6 +129,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.12.6-h232c23b_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.2.13-hd590300_5.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.9.4-hcb278e6_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/make-4.3-hd18ef5c_1.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/linux-64/metis-5.1.0-h59595ed_1007.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/mpg123-1.32.6-h59595ed_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/mumps-include-5.6.2-ha770c72_4.conda @@ -145,6 +155,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.11-4_cp311.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.1-py311h459d7ec_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8228510_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/rhash-1.4.4-hd590300_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/scotch-7.0.4-h23d43cc_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/sdl-1.2.68-h293081c_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/sdl2-2.30.2-hdbcbe63_0.conda @@ -180,6 +191,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/argcomplete-3.2.3-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/assimp-5.3.1-h3e74f17_3.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/bzip2-1.0.8-h10d778d_5.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/c-ares-1.28.1-h10d778d_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/c-compiler-1.7.0-h282daa2_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/ca-certificates-2024.2.2-h8857fd0_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/catch2-3.5.4-h7728843_0.conda @@ -193,6 +205,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-64/clangxx-16.0.6-default_h7151d67_6.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/clangxx_impl_osx-64-16.0.6-h6d92fbe_11.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/clangxx_osx-64-16.0.6-hb91bd55_11.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/cmake-3.29.2-h7c85d92_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/colcon-argcomplete-0.3.3-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/colcon-bash-0.5.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/colcon-cd-0.1.1-pyhd8ed1ab_0.tar.bz2 @@ -233,14 +246,17 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/ipopt-3.14.16-h37bbb85_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/irrlicht-1.8.5-h5bfa9a0_4.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/krb5-1.21.2-hb884880_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/ld64-711-ha02d983_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/ld64_osx-64-711-ha20a434_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libblas-3.9.0-22_osx64_openblas.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libboost-1.84.0-h6ebd1c4_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libcblas-3.9.0-22_osx64_openblas.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libclang-cpp16-16.0.6-default_h7151d67_6.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libcurl-8.7.1-h726d00d_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libcxx-16.0.6-hd57cbcb_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libedit-3.1.20191231-h0678c8f_2.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/osx-64/libev-4.33-h10d778d_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libexpat-2.6.2-h73e2aa4_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libffi-3.4.2-h0d85af4_5.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/osx-64/libgfortran-5.0.0-13_2_0_h97931a8_3.conda @@ -249,17 +265,21 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-64/libjpeg-turbo-3.0.0-h0dc2134_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/liblapack-3.9.0-22_osx64_openblas.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libllvm16-16.0.6-hbedff68_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libnghttp2-1.58.0-h64cf6d3_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libopenblas-0.3.27-openmp_hfef2a42_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libosqp-0.6.3-he965462_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libpng-1.6.43-h92b6c6a_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libqdldl-0.1.5-hf0c8a7f_1.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/osx-64/libscotch-7.0.4-hc2ac6e5_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libsqlite-3.45.2-h92b6c6a_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libssh2-1.11.0-hd019ec5_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libuv-1.48.0-h67532ce_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libxcb-1.15-hb7f2c08_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libxml2-2.12.6-hc0ae0f7_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libzlib-1.2.13-h8a1eda9_5.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/llvm-openmp-18.1.3-hb6ac08f_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/llvm-tools-16.0.6-hbedff68_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/make-4.3-h22f3db7_1.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/osx-64/metis-5.1.0-he965462_1007.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/mumps-include-5.6.2-h694c41f_4.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/mumps-seq-5.6.2-he3629b0_4.conda @@ -282,6 +302,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-64/python_abi-3.11-4_cp311.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/pyyaml-6.0.1-py311h2725bcf_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/readline-8.2-h9e318b2_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/rhash-1.4.4-h0dc2134_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/scotch-7.0.4-h52a132a_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/sdl-1.2.68-hce1cd6f_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/sdl2-2.30.2-h73e2aa4_0.conda @@ -317,6 +338,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/win-64/ca-certificates-2024.2.2-h56e8100_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/catch2-3.5.4-h181d51b_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/catkin_pkg-1.0.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/cmake-3.29.2-hf0feee3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/colcon-cmake-0.2.28-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/colcon-common-extensions-0.3.0-py311h1ea47a8_1.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/colcon-core-0.16.0-pyhd8ed1ab_0.conda @@ -352,9 +374,11 @@ environments: - conda: https://conda.anaconda.org/conda-forge/win-64/intel-openmp-2024.1.0-h57928b3_965.conda - conda: https://conda.anaconda.org/conda-forge/win-64/ipopt-3.14.16-h394f428_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/irrlicht-1.8.5-h65f4d7e_4.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/krb5-1.21.2-heb0366b_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libblas-3.9.0-22_win64_mkl.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libboost-1.84.0-hcc118f5_2.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libcblas-3.9.0-22_win64_mkl.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libcurl-8.8.0-hd5e4a3a_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libexpat-2.6.2-h63175ca_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libffi-3.4.2-h8ffe710_5.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/win-64/libflang-5.0.0-h6538335_20180525.tar.bz2 @@ -368,11 +392,20 @@ environments: - conda: https://conda.anaconda.org/conda-forge/win-64/libpng-1.6.43-h19919ed_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libqdldl-0.1.5-h63175ca_1.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/win-64/libsqlite-3.45.2-hcfcfb64_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libssh2-1.11.0-h7dfc565_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libuv-1.48.0-hcfcfb64_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libxml2-2.12.6-hc3477c8_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libzlib-1.2.13-hcfcfb64_5.conda - conda: https://conda.anaconda.org/conda-forge/noarch/llvm-meta-5.0.0-0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/win-64/m2w64-gcc-libgfortran-5.3.0-6.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/win-64/m2w64-gcc-libs-5.3.0-7.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/win-64/m2w64-gcc-libs-core-5.3.0-7.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/win-64/m2w64-gmp-6.1.0-2.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/win-64/m2w64-libwinpthread-git-5.0.0.4634.697f757-2.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/win-64/make-4.3-h3d2af85_1.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/win-64/metis-5.1.0-h63175ca_1007.conda - conda: https://conda.anaconda.org/conda-forge/win-64/mkl-2024.1.0-h66d3029_692.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/msys2-conda-epoch-20160418-1.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/win-64/mumps-seq-5.6.2-h1f49738_4.conda - conda: https://conda.anaconda.org/conda-forge/win-64/ninja-1.11.1-h91493d7_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/numpy-1.26.4-py311h0b4df5a_0.conda @@ -705,6 +738,32 @@ packages: license_family: BSD size: 254228 timestamp: 1699279927352 +- kind: conda + name: c-ares + version: 1.28.1 + build: h10d778d_0 + subdir: osx-64 + url: https://conda.anaconda.org/conda-forge/osx-64/c-ares-1.28.1-h10d778d_0.conda + sha256: fccd7ad7e3dfa6b19352705b33eb738c4c55f79f398e106e6cf03bab9415595a + md5: d5eb7992227254c0e9a0ce71151f0079 + license: MIT + license_family: MIT + size: 152607 + timestamp: 1711819681694 +- kind: conda + name: c-ares + version: 1.28.1 + build: hd590300_0 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.28.1-hd590300_0.conda + sha256: cb25063f3342149c7924b21544109696197a9d774f1407567477d4f3026bf38a + md5: dcde58ff9a1f30b0037a2315d1846d1f + depends: + - libgcc-ng >=12 + license: MIT + license_family: MIT + size: 168875 + timestamp: 1711819445938 - kind: conda name: c-compiler version: 1.7.0 @@ -1002,6 +1061,75 @@ packages: license_family: BSD size: 19169 timestamp: 1711079704320 +- kind: conda + name: cmake + version: 3.29.2 + build: h7c85d92_0 + subdir: osx-64 + url: https://conda.anaconda.org/conda-forge/osx-64/cmake-3.29.2-h7c85d92_0.conda + sha256: edaa39e26ef7c7ebb6490a7582b912f261b667b37430be4408723927c94d70d4 + md5: 3275d174bef409a613c3b7fbcda4c298 + depends: + - bzip2 >=1.0.8,<2.0a0 + - libcurl >=8.7.1,<9.0a0 + - libcxx >=16 + - libexpat >=2.6.2,<3.0a0 + - libuv >=1.48.0,<2.0a0 + - libzlib >=1.2.13,<2.0.0a0 + - ncurses >=6.4.20240210,<7.0a0 + - rhash >=1.4.4,<2.0a0 + - xz >=5.2.6,<6.0a0 + - zstd >=1.5.5,<1.6.0a0 + license: BSD-3-Clause + license_family: BSD + size: 16875463 + timestamp: 1712875334643 +- kind: conda + name: cmake + version: 3.29.2 + build: hcfe8598_0 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/cmake-3.29.2-hcfe8598_0.conda + sha256: a5de599a96b090fdad9041aa0fdc8ef546b2e36200edb72324e349d4ae01365e + md5: 7b7ea31d312b491b814f4e7f67de7886 + depends: + - bzip2 >=1.0.8,<2.0a0 + - libcurl >=8.7.1,<9.0a0 + - libexpat >=2.6.2,<3.0a0 + - libgcc-ng >=12 + - libstdcxx-ng >=12 + - libuv >=1.48.0,<2.0a0 + - libzlib >=1.2.13,<2.0.0a0 + - ncurses >=6.4.20240210,<7.0a0 + - rhash >=1.4.4,<2.0a0 + - xz >=5.2.6,<6.0a0 + - zstd >=1.5.5,<1.6.0a0 + license: BSD-3-Clause + license_family: BSD + size: 18993196 + timestamp: 1712872720090 +- kind: conda + name: cmake + version: 3.29.2 + build: hf0feee3_0 + subdir: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/cmake-3.29.2-hf0feee3_0.conda + sha256: 0db2c09d86be20bbe4746582efb8b53b4f4cefb8effc11f90152f4ffd7c16d3a + md5: 6f314f81b0265c79e2c7effae0e42fa0 + depends: + - bzip2 >=1.0.8,<2.0a0 + - libcurl >=8.7.1,<9.0a0 + - libexpat >=2.6.2,<3.0a0 + - libuv >=1.48.0,<2.0a0 + - libzlib >=1.2.13,<2.0.0a0 + - ucrt >=10.0.20348.0 + - vc14_runtime >=14.29.30139 + - xz >=5.2.6,<6.0a0 + - zstd >=1.5.5,<1.6.0a0 + license: BSD-3-Clause + license_family: BSD + size: 14085009 + timestamp: 1712873626985 - kind: conda name: colcon-argcomplete version: 0.3.3 @@ -2268,6 +2396,72 @@ packages: license_family: GPL size: 710627 timestamp: 1708000830116 +- kind: conda + name: keyutils + version: 1.6.1 + build: h166bdaf_0 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.1-h166bdaf_0.tar.bz2 + sha256: 150c05a6e538610ca7c43beb3a40d65c90537497a4f6a5f4d15ec0451b6f5ebb + md5: 30186d27e2c9fa62b45fb1476b7200e3 + depends: + - libgcc-ng >=10.3.0 + license: LGPL-2.1-or-later + size: 117831 + timestamp: 1646151697040 +- kind: conda + name: krb5 + version: 1.21.2 + build: h659d440_0 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.2-h659d440_0.conda + sha256: 259bfaae731989b252b7d2228c1330ef91b641c9d68ff87dae02cbae682cb3e4 + md5: cd95826dbd331ed1be26bdf401432844 + depends: + - keyutils >=1.6.1,<2.0a0 + - libedit >=3.1.20191231,<3.2.0a0 + - libedit >=3.1.20191231,<4.0a0 + - libgcc-ng >=12 + - libstdcxx-ng >=12 + - openssl >=3.1.2,<4.0a0 + license: MIT + license_family: MIT + size: 1371181 + timestamp: 1692097755782 +- kind: conda + name: krb5 + version: 1.21.2 + build: hb884880_0 + subdir: osx-64 + url: https://conda.anaconda.org/conda-forge/osx-64/krb5-1.21.2-hb884880_0.conda + sha256: 081ae2008a21edf57c048f331a17c65d1ccb52d6ca2f87ee031a73eff4dc0fc6 + md5: 80505a68783f01dc8d7308c075261b2f + depends: + - libcxx >=15.0.7 + - libedit >=3.1.20191231,<3.2.0a0 + - libedit >=3.1.20191231,<4.0a0 + - openssl >=3.1.2,<4.0a0 + license: MIT + license_family: MIT + size: 1183568 + timestamp: 1692098004387 +- kind: conda + name: krb5 + version: 1.21.2 + build: heb0366b_0 + subdir: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/krb5-1.21.2-heb0366b_0.conda + sha256: 6002adff9e3dcfc9732b861730cb9e33d45fd76b2035b2cdb4e6daacb8262c0b + md5: 6e8b0f22b4eef3b3cb3849bb4c3d47f9 + depends: + - openssl >=3.1.2,<4.0a0 + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + license: MIT + license_family: MIT + size: 710894 + timestamp: 1692098129546 - kind: conda name: lame version: '3.100' @@ -2584,6 +2778,64 @@ packages: license_family: Apache size: 12714864 timestamp: 1711067666274 +- kind: conda + name: libcurl + version: 8.7.1 + build: h726d00d_0 + subdir: osx-64 + url: https://conda.anaconda.org/conda-forge/osx-64/libcurl-8.7.1-h726d00d_0.conda + sha256: 06cb1bd3bbaf905213777d6ade190ac4c7fb7a20dfe0cf901c977dbbc6cec265 + md5: fa58e5eaa12006bc3289a71357bef167 + depends: + - krb5 >=1.21.2,<1.22.0a0 + - libnghttp2 >=1.58.0,<2.0a0 + - libssh2 >=1.11.0,<2.0a0 + - libzlib >=1.2.13,<2.0.0a0 + - openssl >=3.2.1,<4.0a0 + - zstd >=1.5.5,<1.6.0a0 + license: curl + license_family: MIT + size: 378176 + timestamp: 1711548390530 +- kind: conda + name: libcurl + version: 8.7.1 + build: hca28451_0 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.7.1-hca28451_0.conda + sha256: 82a75e9a5d9ee5b2f487d850ec5d4edc18a56eb9527608a95a916c40baae3843 + md5: 755c7f876815003337d2c61ff5d047e5 + depends: + - krb5 >=1.21.2,<1.22.0a0 + - libgcc-ng >=12 + - libnghttp2 >=1.58.0,<2.0a0 + - libssh2 >=1.11.0,<2.0a0 + - libzlib >=1.2.13,<2.0.0a0 + - openssl >=3.2.1,<4.0a0 + - zstd >=1.5.5,<1.6.0a0 + license: curl + license_family: MIT + size: 398293 + timestamp: 1711548114077 +- kind: conda + name: libcurl + version: 8.8.0 + build: hd5e4a3a_0 + subdir: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/libcurl-8.8.0-hd5e4a3a_0.conda + sha256: 169fb0a11dd3a1f0adbb93b275f9752aa24b64e73d0c8e220aa10213c6ee74ff + md5: 4f86149dc6228f1e5617faa2cce90f94 + depends: + - krb5 >=1.21.2,<1.22.0a0 + - libssh2 >=1.11.0,<2.0a0 + - libzlib >=1.2.13,<2.0.0a0 + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + license: curl + license_family: MIT + size: 334903 + timestamp: 1716379079949 - kind: conda name: libcxx version: 16.0.6 @@ -2627,6 +2879,34 @@ packages: license_family: BSD size: 123878 timestamp: 1597616541093 +- kind: conda + name: libev + version: '4.33' + build: h10d778d_2 + build_number: 2 + subdir: osx-64 + url: https://conda.anaconda.org/conda-forge/osx-64/libev-4.33-h10d778d_2.conda + sha256: 0d238488564a7992942aa165ff994eca540f687753b4f0998b29b4e4d030ff43 + md5: 899db79329439820b7e8f8de41bca902 + license: BSD-2-Clause + license_family: BSD + size: 106663 + timestamp: 1702146352558 +- kind: conda + name: libev + version: '4.33' + build: hd590300_2 + build_number: 2 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-hd590300_2.conda + sha256: 1cd6048169fa0395af74ed5d8f1716e22c19a81a8a36f934c110ca3ad4dd27b4 + md5: 172bf1cd1ff8629f2b1179945ed45055 + depends: + - libgcc-ng >=12 + license: BSD-2-Clause + license_family: BSD + size: 112766 + timestamp: 1702146165126 - kind: conda name: libexpat version: 2.6.2 @@ -3202,6 +3482,48 @@ packages: license_family: Apache size: 25196932 timestamp: 1701379796962 +- kind: conda + name: libnghttp2 + version: 1.58.0 + build: h47da74e_1 + build_number: 1 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.58.0-h47da74e_1.conda + sha256: 1910c5306c6aa5bcbd623c3c930c440e9c77a5a019008e1487810e3c1d3716cb + md5: 700ac6ea6d53d5510591c4344d5c989a + depends: + - c-ares >=1.23.0,<2.0a0 + - libev >=4.33,<4.34.0a0 + - libev >=4.33,<5.0a0 + - libgcc-ng >=12 + - libstdcxx-ng >=12 + - libzlib >=1.2.13,<2.0.0a0 + - openssl >=3.2.0,<4.0a0 + license: MIT + license_family: MIT + size: 631936 + timestamp: 1702130036271 +- kind: conda + name: libnghttp2 + version: 1.58.0 + build: h64cf6d3_1 + build_number: 1 + subdir: osx-64 + url: https://conda.anaconda.org/conda-forge/osx-64/libnghttp2-1.58.0-h64cf6d3_1.conda + sha256: 412fd768e787e586602f8e9ea52bf089f3460fc630f6987f0cbd89b70e9a4380 + md5: faecc55c2a8155d9ff1c0ff9a0fef64f + depends: + - __osx >=10.9 + - c-ares >=1.23.0,<2.0a0 + - libcxx >=16.0.6 + - libev >=4.33,<4.34.0a0 + - libev >=4.33,<5.0a0 + - libzlib >=1.2.13,<2.0.0a0 + - openssl >=3.2.0,<4.0a0 + license: MIT + license_family: MIT + size: 599736 + timestamp: 1702130398536 - kind: conda name: libnsl version: 2.0.1 @@ -3564,6 +3886,55 @@ packages: license: Unlicense size: 869606 timestamp: 1710255095740 +- kind: conda + name: libssh2 + version: 1.11.0 + build: h0841786_0 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.0-h0841786_0.conda + sha256: 50e47fd9c4f7bf841a11647ae7486f65220cfc988ec422a4475fe8d5a823824d + md5: 1f5a58e686b13bcfde88b93f547d23fe + depends: + - libgcc-ng >=12 + - libzlib >=1.2.13,<2.0.0a0 + - openssl >=3.1.1,<4.0a0 + license: BSD-3-Clause + license_family: BSD + size: 271133 + timestamp: 1685837707056 +- kind: conda + name: libssh2 + version: 1.11.0 + build: h7dfc565_0 + subdir: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/libssh2-1.11.0-h7dfc565_0.conda + sha256: 813fd04eed2a2d5d9c36e53c554f9c1f08e9324e2922bd60c9c52dbbed2dbcec + md5: dc262d03aae04fe26825062879141a41 + depends: + - libzlib >=1.2.13,<2.0.0a0 + - openssl >=3.1.1,<4.0a0 + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + license: BSD-3-Clause + license_family: BSD + size: 266806 + timestamp: 1685838242099 +- kind: conda + name: libssh2 + version: 1.11.0 + build: hd019ec5_0 + subdir: osx-64 + url: https://conda.anaconda.org/conda-forge/osx-64/libssh2-1.11.0-hd019ec5_0.conda + sha256: f3886763b88f4b24265db6036535ef77b7b77ce91b1cbe588c0fbdd861eec515 + md5: ca3a72efba692c59a90d4b9fc0dfe774 + depends: + - libzlib >=1.2.13,<2.0.0a0 + - openssl >=3.1.1,<4.0a0 + license: BSD-3-Clause + license_family: BSD + size: 259556 + timestamp: 1685837820566 - kind: conda name: libstdcxx-devel_linux-64 version: 12.3.0 @@ -3625,6 +3996,48 @@ packages: license_family: BSD size: 33601 timestamp: 1680112270483 +- kind: conda + name: libuv + version: 1.48.0 + build: h67532ce_0 + subdir: osx-64 + url: https://conda.anaconda.org/conda-forge/osx-64/libuv-1.48.0-h67532ce_0.conda + sha256: fb87f7bfd464a3a841d23f418c86a206818da0c4346984392071d9342c9ea367 + md5: c8e7344c74f0d86584f7ecdc9f25c198 + license: MIT + license_family: MIT + size: 407040 + timestamp: 1709913680478 +- kind: conda + name: libuv + version: 1.48.0 + build: hcfcfb64_0 + subdir: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/libuv-1.48.0-hcfcfb64_0.conda + sha256: 6151c51857c2407139ce22fdc956022353e675b2bc96991a9201d51cceaa90b4 + md5: 485e49e1d500d996844df14cabf64d73 + depends: + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + license: MIT + license_family: MIT + size: 289753 + timestamp: 1709913743184 +- kind: conda + name: libuv + version: 1.48.0 + build: hd590300_0 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/libuv-1.48.0-hd590300_0.conda + sha256: b7c0e8a0c93c2621be7645b37123d4e8d27e8a974da26a3fba47a9c37711aa7f + md5: 7e8b914b1062dd4386e3de4d82a3ead6 + depends: + - libgcc-ng >=12 + license: MIT + license_family: MIT + size: 899979 + timestamp: 1709913354710 - kind: conda name: libvorbis version: 1.3.7 @@ -3878,6 +4291,126 @@ packages: license_family: BSD size: 143402 timestamp: 1674727076728 +- kind: conda + name: m2w64-gcc-libgfortran + version: 5.3.0 + build: '6' + build_number: 6 + subdir: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/m2w64-gcc-libgfortran-5.3.0-6.tar.bz2 + sha256: 9de95a7996d5366ae0808eef2acbc63f9b11b874aa42375f55379e6715845dc6 + md5: 066552ac6b907ec6d72c0ddab29050dc + depends: + - m2w64-gcc-libs-core + - msys2-conda-epoch ==20160418 + license: GPL, LGPL, FDL, custom + size: 350687 + timestamp: 1608163451316 +- kind: conda + name: m2w64-gcc-libs + version: 5.3.0 + build: '7' + build_number: 7 + subdir: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/m2w64-gcc-libs-5.3.0-7.tar.bz2 + sha256: 3bd1ab02b7c89a5b153a17be03b36d833f1517ff2a6a77ead7c4a808b88196aa + md5: fe759119b8b3bfa720b8762c6fdc35de + depends: + - m2w64-gcc-libgfortran + - m2w64-gcc-libs-core + - m2w64-gmp + - m2w64-libwinpthread-git + - msys2-conda-epoch ==20160418 + license: GPL3+, partial:GCCRLE, partial:LGPL2+ + size: 532390 + timestamp: 1608163512830 +- kind: conda + name: m2w64-gcc-libs-core + version: 5.3.0 + build: '7' + build_number: 7 + subdir: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/m2w64-gcc-libs-core-5.3.0-7.tar.bz2 + sha256: 58afdfe859ed2e9a9b1cc06bc408720cb2c3a6a132e59d4805b090d7574f4ee0 + md5: 4289d80fb4d272f1f3b56cfe87ac90bd + depends: + - m2w64-gmp + - m2w64-libwinpthread-git + - msys2-conda-epoch ==20160418 + license: GPL3+, partial:GCCRLE, partial:LGPL2+ + size: 219240 + timestamp: 1608163481341 +- kind: conda + name: m2w64-gmp + version: 6.1.0 + build: '2' + build_number: 2 + subdir: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/m2w64-gmp-6.1.0-2.tar.bz2 + sha256: 7e3cd95f554660de45f8323fca359e904e8d203efaf07a4d311e46d611481ed1 + md5: 53a1c73e1e3d185516d7e3af177596d9 + depends: + - msys2-conda-epoch ==20160418 + license: LGPL3 + size: 743501 + timestamp: 1608163782057 +- kind: conda + name: m2w64-libwinpthread-git + version: 5.0.0.4634.697f757 + build: '2' + build_number: 2 + subdir: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/m2w64-libwinpthread-git-5.0.0.4634.697f757-2.tar.bz2 + sha256: f63a09b2cae7defae0480f1740015d6235f1861afa6fe2e2d3e10bd0d1314ee0 + md5: 774130a326dee16f1ceb05cc687ee4f0 + depends: + - msys2-conda-epoch ==20160418 + license: MIT, BSD + size: 31928 + timestamp: 1608166099896 +- kind: conda + name: make + version: '4.3' + build: h22f3db7_1 + build_number: 1 + subdir: osx-64 + url: https://conda.anaconda.org/conda-forge/osx-64/make-4.3-h22f3db7_1.tar.bz2 + sha256: adef15126b518548b69ecaef24e22f88fa0a6358bd3c11e791af214f7344983b + md5: ac4a1dd58e6d821c518ae0011e8592b7 + license: GPL-3.0-or-later + license_family: GPL + size: 255465 + timestamp: 1602706542653 +- kind: conda + name: make + version: '4.3' + build: h3d2af85_1 + build_number: 1 + subdir: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/make-4.3-h3d2af85_1.tar.bz2 + sha256: f31b00c710df71f2f75c641272ecb1f9bd1e15a5a77510055120641215487fbb + md5: c3be283d3d278c379b50137a2a17f869 + depends: + - m2w64-gcc-libs + license: GPL-3.0-or-later + license_family: GPL + size: 6245358 + timestamp: 1602706995515 +- kind: conda + name: make + version: '4.3' + build: hd18ef5c_1 + build_number: 1 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/make-4.3-hd18ef5c_1.tar.bz2 + sha256: 4a5fe7c80bb0de0015328e2d3fc8db1736f528cb1fd53cd0d5527e24269a4f7c + md5: 4049ebfd3190b580dffe76daed26155a + depends: + - libgcc-ng >=7.5.0 + license: GPL-3.0-or-later + license_family: GPL + size: 518896 + timestamp: 1602706451788 - kind: conda name: metis version: 5.1.0 @@ -3954,6 +4487,17 @@ packages: license_family: LGPL size: 491811 timestamp: 1712327176955 +- kind: conda + name: msys2-conda-epoch + version: '20160418' + build: '1' + build_number: 1 + subdir: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/msys2-conda-epoch-20160418-1.tar.bz2 + sha256: 99358d58d778abee4dca82ad29fb58058571f19b0f86138363c260049d4ac7f1 + md5: b0309b72560df66f71a9d5e34a5efdfa + size: 3227 + timestamp: 1608166968312 - kind: conda name: mumps-include version: 5.6.2 @@ -4828,6 +5372,32 @@ packages: license_family: GPL size: 255870 timestamp: 1679532707590 +- kind: conda + name: rhash + version: 1.4.4 + build: h0dc2134_0 + subdir: osx-64 + url: https://conda.anaconda.org/conda-forge/osx-64/rhash-1.4.4-h0dc2134_0.conda + sha256: f1ae47e8c4e46f856faf5d8ee1e5291f55627aa93401b61a877f18ade5780c87 + md5: 55a2ada70c8a208c01f77978f2783121 + license: MIT + license_family: MIT + size: 177229 + timestamp: 1693456080514 +- kind: conda + name: rhash + version: 1.4.4 + build: hd590300_0 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/rhash-1.4.4-hd590300_0.conda + sha256: 12711d2d4a808a503c2e49b25d26ecb351435521e814c154e682dd2be71c2611 + md5: ec972a9a2925ac8d7a19eb9606561fff + depends: + - libgcc-ng >=12 + license: MIT + license_family: MIT + size: 185144 + timestamp: 1693455923632 - kind: conda name: scotch version: 7.0.4 diff --git a/pixi.toml b/pixi.toml index 71101d4..ac7bad1 100644 --- a/pixi.toml +++ b/pixi.toml @@ -50,6 +50,8 @@ uninstall = { cmd = ["cmake", "--build", ".build", "--target", "uninstall"]} c-compiler = "*" cxx-compiler = "*" ninja = "*" +cmake = "*" +make = "*" pkg-config = "*" eigen = "*" # Requires https://github.com/robotology/idyntree/pull/1178 diff --git a/pixi_source_deps_options.meta b/pixi_source_deps_options.meta index 7983ebf..64ae86a 100644 --- a/pixi_source_deps_options.meta +++ b/pixi_source_deps_options.meta @@ -4,6 +4,7 @@ "YARP" : { "cmake-args": [ + "-GNinja", "-DYARP_COMPILE_ALL_FAKE_DEVICES:BOOL=ON", "-DYARP_COMPILE_GUIS=OFF" ] @@ -11,6 +12,7 @@ "ICUB" : { "cmake-args": [ + "-GNinja", "-DBUILD_SHARED_LIBS=ON", "-DICUBMAIN_COMPILE_CORE=OFF", "-DICUBMAIN_COMPILE_TOOLS=OFF", From 9435bed689ec63ec57841a985adfb9f9d5248426 Mon Sep 17 00:00:00 2001 From: Silvio Traversaro Date: Thu, 11 Jul 2024 09:39:51 +0200 Subject: [PATCH 2/4] Apply suggestions from code review Co-authored-by: Stefano Dafarra --- devices/wholeBodyDynamics/WholeBodyDynamicsDevice.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/devices/wholeBodyDynamics/WholeBodyDynamicsDevice.cpp b/devices/wholeBodyDynamics/WholeBodyDynamicsDevice.cpp index 29935d8..b1c851a 100644 --- a/devices/wholeBodyDynamics/WholeBodyDynamicsDevice.cpp +++ b/devices/wholeBodyDynamics/WholeBodyDynamicsDevice.cpp @@ -903,7 +903,7 @@ bool WholeBodyDynamicsDevice::openMultipleAnalogSensorRemapper(os::Searchable &c // We get the multipleAnalogSensorsNames group, but from it we just use the multipleAnalogSensorsNames parameter if (!prop.check("multipleAnalogSensorsNames")) { - yError() << "wholeBodyDynamics :Impossible to find requied group multipleAnalogSensorsNames"; + yError() << "wholeBodyDynamics: Impossible to find required group multipleAnalogSensorsNames"; return false; } @@ -913,13 +913,13 @@ bool WholeBodyDynamicsDevice::openMultipleAnalogSensorRemapper(os::Searchable &c bool ok = getConfigParamsAsList(multipleAnalogSensorsNames, "SixAxisForceTorqueSensorsNames", this->ftSensorNames, required); if (!ok) { - yError() << "wholeBodyDynamics :Impossible to find required variable SixAxisForceTorqueSensorsNames in group multipleAnalogSensorsNames"; + yError() << "wholeBodyDynamics: Impossible to find required variable SixAxisForceTorqueSensorsNames in group multipleAnalogSensorsNames"; return false; } if (multipleAnalogSensorsNames.find("TemperatureSensorsNames").isList()) { - yWarning() << "wholeBodyDynamics : TemperatureSensorsNames parameter is not used anymore, the names in SixAxisForceTorqueSensorsNames are used, please remove TemperatureSensorsNames parameter to avoid confusion"; + yWarning() << "wholeBodyDynamics: TemperatureSensorsNames parameter is not used anymore, the names in SixAxisForceTorqueSensorsNames are used, please remove TemperatureSensorsNames parameter to avoid confusion"; } addVectorOfStringToProperty(propMASRemapper, "SixAxisForceTorqueSensorsNames", this->ftSensorNames); @@ -1184,7 +1184,7 @@ bool WholeBodyDynamicsDevice::loadSettingsFromConfig(os::Searchable& config) if( !(prop.check(estimateJointVelocityAccelerationOptionName.c_str()) && prop.find(estimateJointVelocityAccelerationOptionName.c_str()).isBool()) ) { yWarning() << "wholeBodyDynamics: estimateJointVelocityAcceleration bool parameter missing, please specify it."; - yWarning() << "wholeBodyDynamics: setting estimateJointVelocityAcceleration to the default value of true, but this is a deprecated behaviour that will be removed in the future."; + yWarning() << "wholeBodyDynamics: setting estimateJointVelocityAcceleration to the default value of false, but this is a deprecated behavior that will be removed in the future."; settings.estimateJointVelocityAcceleration = false; } else From 871e59d288cbeac1af4eea91dad4aa1ca2838596 Mon Sep 17 00:00:00 2001 From: iCub Virtualizer Date: Thu, 11 Jul 2024 12:30:43 +0200 Subject: [PATCH 3/4] Fix build type used on Windows after switch to Ninja --- pixi.toml | 2 +- pixi_source_deps_options.meta | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/pixi.toml b/pixi.toml index ac7bad1..19db338 100644 --- a/pixi.toml +++ b/pixi.toml @@ -41,7 +41,7 @@ configure = { cmd = [ ]} build = { cmd = "cmake --build .build --config Release", depends_on = ["configure"] } -test = { cmd = "ctest --test-dir .build --build-config Release", depends_on = ["build"] } +test = { cmd = "ctest --test-dir .build --build-config Release --output-on-failure", depends_on = ["build"] } install = { cmd = ["cmake", "--install", ".build", "--config", "Release"], depends_on = ["build"] } uninstall = { cmd = ["cmake", "--build", ".build", "--target", "uninstall"]} diff --git a/pixi_source_deps_options.meta b/pixi_source_deps_options.meta index 64ae86a..907f5c5 100644 --- a/pixi_source_deps_options.meta +++ b/pixi_source_deps_options.meta @@ -4,6 +4,7 @@ "YARP" : { "cmake-args": [ + "-DCMAKE_BUILD_TYPE=RelWithDebInfo", "-GNinja", "-DYARP_COMPILE_ALL_FAKE_DEVICES:BOOL=ON", "-DYARP_COMPILE_GUIS=OFF" @@ -12,6 +13,7 @@ "ICUB" : { "cmake-args": [ + "-DCMAKE_BUILD_TYPE=RelWithDebInfo", "-GNinja", "-DBUILD_SHARED_LIBS=ON", "-DICUBMAIN_COMPILE_CORE=OFF", From a67d28734036156f0729c537771a20338cc38803 Mon Sep 17 00:00:00 2001 From: Silvio Traversaro Date: Thu, 11 Jul 2024 12:42:52 +0200 Subject: [PATCH 4/4] Improve sensor check at startup logic --- devices/wholeBodyDynamics/WholeBodyDynamicsDevice.cpp | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/devices/wholeBodyDynamics/WholeBodyDynamicsDevice.cpp b/devices/wholeBodyDynamics/WholeBodyDynamicsDevice.cpp index b1c851a..c91ccf3 100644 --- a/devices/wholeBodyDynamics/WholeBodyDynamicsDevice.cpp +++ b/devices/wholeBodyDynamics/WholeBodyDynamicsDevice.cpp @@ -1850,13 +1850,17 @@ bool WholeBodyDynamicsDevice::attachAllFTs(const PolyDriverList& p) while( (timeSpentTryngToReadSensors < wholeBodyDynamics_sensorTimeoutInSeconds) && !readSuccessfull ) { readSuccessfull = readFTSensors(verbose); - timeSpentTryngToReadSensors = (yarp::os::Time::now() - tic); - yarp::os::Time::delay(0.001); + // Only update the timeSpentTryngToReadSensors and wait if the read was not successful + if (!readSuccessfull) + { + timeSpentTryngToReadSensors = (yarp::os::Time::now() - tic); + yarp::os::Time::delay(0.001); + } } if( !readSuccessfull ) { - yError() << "WholeBodyDynamicsDevice was unable to correctly read from the FT sensors"; + yError() << "WholeBodyDynamicsDevice was unable to correctly read from the FT sensors after " << timeSpentTryngToReadSensors << " seconds."; return false; } }