5#include <SimoxUtility/algorithm/advanced.h>
6#include <SimoxUtility/algorithm/get_map_keys_values.h>
8#include <RobotAPI/interface/units/RobotUnit/RobotUnitInterface.h>
28 const RobotUnitDataStreaming::DataStreamingDescription&
description)
30 arondto::Proprioception
dto;
31 dto.iterationID =
data.iterationId;
33 for (
const auto& [dataEntryName, dataEntry] :
description.entries)
42 const std::string& entryName,
45 const std::vector<std::string>
split = simox::alg::split(entryName,
".",
false,
false);
47 const std::set<size_t> acceptedSizes{3, 4, 5};
49 <<
"Data entry name could not be parsed (exected 3 or 4 or 5 components between '.'): "
50 <<
"\n- split: '" <<
split <<
"'";
52 const std::string& category =
split.at(0);
53 const std::string& name =
split.at(1);
54 const std::string& field =
split.at(2);
57 if (name ==
"Platform")
60 processPlatformEntry(
dto.platform, field, value);
62 else if (simox::alg::starts_with(name,
"FT"))
65 processForceTorqueEntry(
dto.forceTorque,
split, value);
70 bool processed = processJointEntry(
dto.joints,
split, value);
74 const std::vector<std::string> comps{simox::alg::advanced(
split.begin(), 1),
76 const std::string key = simox::alg::join(comps,
".");
78 switch (value.entry.type)
80 case RobotUnitDataStreaming::NodeTypeFloat:
83 case RobotUnitDataStreaming::NodeTypeLong:
86 case RobotUnitDataStreaming::NodeTypeBool:
89 case RobotUnitDataStreaming::NodeTypeInt:
92 case RobotUnitDataStreaming::NodeTypeShort:
95 case RobotUnitDataStreaming::NodeTypeByte:
100 <<
"Cannot handle extra field '" << key <<
"' of type "
109 Armar6Converter::processPlatformEntry(prop::arondto::Platform&
dto,
110 const std::string& fieldName,
119 if (Eigen::Vector3f* dst = getter(
dto))
135 Armar6Converter::processForceTorqueEntry(std::map<std::string, prop::arondto::ForceTorque>& fts,
136 const std::vector<std::string>&
split,
139 const std::string& name =
split.at(1);
140 std::vector<std::string> splitName = simox::alg::split(name,
" ",
false,
false);
144 auto it = tools->sidePrefixMap.find(splitName.at(1));
145 ARMARX_CHECK(it != tools->sidePrefixMap.end()) << splitName.at(1);
147 const std::string& side = it->second;
148 processForceTorqueEntry(fts[side],
split, value);
152 Armar6Converter::processForceTorqueEntry(prop::arondto::ForceTorque& dto,
153 const std::vector<std::string>&
split,
156 const std::string& fieldName =
split.at(2);
157 if (
auto getter =
findByPrefix(fieldName, tools->ftGetters))
159 if (Eigen::Vector3f* dst = getter(dto))
161 if (
auto setter =
findBySuffix(fieldName, tools->vector3fSetters))
170 std::string key =
split.size() == 4 ? (fieldName +
"." +
split.at(3)) : fieldName;
172 switch (
value.entry.type)
174 case RobotUnitDataStreaming::NodeTypeFloat:
177 case RobotUnitDataStreaming::NodeTypeInt:
180 case RobotUnitDataStreaming::NodeTypeLong:
184 ARMARX_DEBUG <<
"Cannot handle extra field '" << key <<
"' of type "
193 Armar6Converter::processJointEntry(prop::arondto::Joints& dto,
194 const std::vector<std::string>&
split,
197 const std::string& jointName =
split.at(1);
198 const std::string& fieldName =
split.at(2);
202 if (
auto getter =
findByPrefix(fieldName, tools->jointGetters))
204 if (std::map<std::string, float>* map = getter(dto))
211 const std::string tempSuffix =
"Temperature";
212 if (simox::alg::ends_with(
split.at(2), tempSuffix))
215 const std::string name =
split.at(2).substr(0,
split.at(2).size() - tempSuffix.size());
219 else if (
auto it = tools->jointSetters.find(fieldName); it != tools->jointSetters.end())
222 setter(dto,
split, value);
virtual ~Armar6Converter() override
aron::data::DictPtr convert(const RobotUnitDataStreaming::TimeStep &data, const RobotUnitDataStreaming::DataStreamingDescription &description) override
void process(arondto::Proprioception &dto, const std::string &entryName, const ConverterValue &value)
#define ARMARX_CHECK_GREATER(lhs, rhs)
This macro evaluates whether lhs is greater (>) than rhs and if it turns out to be false it will thro...
#define ARMARX_CHECK(expression)
Shortcut for ARMARX_CHECK_EXPRESSION.
#define ARMARX_CHECK_GREATER_EQUAL(lhs, rhs)
This macro evaluates whether lhs is greater or equal (>=) rhs and if it turns out to be false it will...
#define ARMARX_CHECK_EQUAL(lhs, rhs)
This macro evaluates whether lhs is equal (==) rhs and if it turns out to be false it will throw an E...
#define ARMARX_DEBUG
The logging level for output that is only interesting while debugging.
const simox::meta::EnumNames< DataEntryType > DataEntryNames
T getValueAs(const ConverterValue &value)
ValueT findBySuffix(const std::string &key, const std::map< std::string, ValueT > &map)
std::optional< std::string > findByPrefix(const std::string &key, const std::set< std::string > &prefixes)
Search.
std::shared_ptr< Dict > DictPtr
std::vector< std::string > split(const std::string &source, const std::string &splitBy, bool trimElements=false, bool removeEmptyElements=false)
std::shared_ptr< Value > value()