Skip to content

Commit e4419a6

Browse files
committed
Fix the way we retrieve the transform for the sensors
This allows to export a sensor with a frame not specified in exportedFrames. It fixes #77.
1 parent d3f7ef7 commit e4419a6

File tree

3 files changed

+68
-20
lines changed

3 files changed

+68
-20
lines changed

src/creo2urdf/include/creo2urdf/Sensorizer.h

+14-2
Original file line numberDiff line numberDiff line change
@@ -43,19 +43,25 @@ struct Sensorizer {
4343

4444
/**
4545
* @brief Assigns a 3D transform to a force/torque sensor based on provided information.
46+
* @param exported_frame_info_map A map of exported frame information.
4647
* @param link_info_map A map of link information.
4748
* @param joint_info_map A map of joint information.
4849
* @param scale The scale for the position part of the 3D transform.
4950
*/
50-
void assignTransformToFTSensor(const std::map<std::string, LinkInfo>& link_info_map,
51+
void assignTransformToFTSensor(const std::map<std::string, ExportedFrameInfo>& exported_frame_info_map,
52+
const std::map<std::string, LinkInfo>& link_info_map,
5153
const std::map<std::string, JointInfo>& joint_info_map,
5254
const std::array<double, 3> scale);
5355

5456
/**
5557
* @brief Assigns a 3D transform to all sensors based on provided information.
5658
* @param exported_frame_info_map A map of exported frame information.
59+
* @param link_info_map A map of link information.
60+
* @param scale The scale for the position part of the 3D transform.
5761
*/
58-
void assignTransformToSensors(const std::map<std::string, ExportedFrameInfo>& exported_frame_info_map);
62+
void assignTransformToSensors(const std::map<std::string, ExportedFrameInfo>& exported_frame_info_map,
63+
const std::map<std::string, LinkInfo>& link_info_map,
64+
const std::array<double, 3> scale);
5965

6066
/**
6167
* @brief Builds a vector of XML trees as strings for force/torque sensors,
@@ -84,6 +90,12 @@ struct Sensorizer {
8490
* @brief Vector containing information about general sensors.
8591
*/
8692
std::vector<SensorInfo> sensors;
93+
94+
/**
95+
* @brief YAML node containing sensor configuration.
96+
*/
97+
YAML::Node m_config;
98+
8799
};
88100

89101

src/creo2urdf/src/Creo2Urdf.cpp

+2-2
Original file line numberDiff line numberDiff line change
@@ -263,9 +263,9 @@ void Creo2Urdf::OnCommand() {
263263
}
264264

265265
// Assign the transforms for the sensors
266-
sensorizer.assignTransformToSensors(exported_frame_info_map);
266+
sensorizer.assignTransformToSensors(exported_frame_info_map, link_info_map, scale);
267267
// Assign the transforms for the ft sensors
268-
sensorizer.assignTransformToFTSensor(link_info_map, joint_info_map, scale);
268+
sensorizer.assignTransformToFTSensor(exported_frame_info_map, link_info_map, joint_info_map, scale);
269269

270270
// Let's add sensors and ft sensors frames
271271

src/creo2urdf/src/Sensorizer.cpp

+52-16
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111

1212
void Sensorizer::readSensorsFromConfig(const YAML::Node & config)
1313
{
14+
m_config = config;
1415
if (!config["sensors"].IsDefined())
1516
return;
1617

@@ -102,25 +103,32 @@ void Sensorizer::readFTSensorsFromConfig(const YAML::Node& config)
102103

103104
}
104105

105-
void Sensorizer::assignTransformToFTSensor(const std::map<std::string, LinkInfo>& link_info_map, const std::map<std::string, JointInfo>& joint_info_map, const std::array<double, 3> scale)
106+
void Sensorizer::assignTransformToFTSensor(const std::map<std::string, ExportedFrameInfo>& exported_frame_info_map,const std::map<std::string, LinkInfo>& link_info_map, const std::map<std::string, JointInfo>& joint_info_map, const std::array<double, 3> scale)
106107
{
107108
// Iterate over all sensors
108109
for (auto& f : ft_sensors)
109110
{
110-
JointInfo j_info = joint_info_map.at(f.second.frameName);
111+
if (exported_frame_info_map.find(f.second.frameName) != exported_frame_info_map.end())
112+
{
113+
// If the frame used is in the exported frames map, use the transform from there
114+
f.second.child_link_H_sensor = exported_frame_info_map.at(f.second.frameName).linkFrame_H_additionalFrame * exported_frame_info_map.at(f.second.frameName).additionalTransformation;
115+
}
116+
else {
117+
JointInfo j_info = joint_info_map.at(f.second.frameName);
111118

112-
LinkInfo parent_l_info = link_info_map.at(j_info.parent_link_name);
113-
LinkInfo child_l_info = link_info_map.at(j_info.child_link_name);
119+
LinkInfo parent_l_info = link_info_map.at(j_info.parent_link_name);
120+
LinkInfo child_l_info = link_info_map.at(j_info.child_link_name);
114121

115-
auto parent_csys_H_sensor = (getTransformFromPart(parent_l_info.modelhdl, f.second.frameName, scale)).second;
116-
auto parent_csys_H_parent_link = (getTransformFromPart(parent_l_info.modelhdl, parent_l_info.link_frame_name, scale)).second;
117-
// This transform is used for exporting the ft frame
118-
f.second.parent_link_H_sensor = parent_csys_H_parent_link.inverse() * parent_csys_H_sensor;
122+
auto parent_csys_H_sensor = (getTransformFromPart(parent_l_info.modelhdl, f.second.frameName, scale)).second;
123+
auto parent_csys_H_parent_link = (getTransformFromPart(parent_l_info.modelhdl, parent_l_info.link_frame_name, scale)).second;
124+
// This transform is used for exporting the ft frame
125+
f.second.parent_link_H_sensor = parent_csys_H_parent_link.inverse() * parent_csys_H_sensor;
119126

120-
auto child_csys_H_sensor = (getTransformFromPart(child_l_info.modelhdl, f.second.frameName, scale)).second;
121-
auto child_csys_H_child_link = (getTransformFromPart(child_l_info.modelhdl, child_l_info.link_frame_name, scale)).second;
122-
// This transform is used for defining the pose of the ft sensor
123-
f.second.child_link_H_sensor = child_csys_H_child_link.inverse() * child_csys_H_sensor;
127+
auto child_csys_H_sensor = (getTransformFromPart(child_l_info.modelhdl, f.second.frameName, scale)).second;
128+
auto child_csys_H_child_link = (getTransformFromPart(child_l_info.modelhdl, child_l_info.link_frame_name, scale)).second;
129+
// This transform is used for defining the pose of the ft sensor
130+
f.second.child_link_H_sensor = child_csys_H_child_link.inverse() * child_csys_H_sensor;
131+
}
124132
}
125133
}
126134

@@ -218,18 +226,46 @@ std::vector<std::string> Sensorizer::buildFTXMLBlobs()
218226
return ft_xml_blobs;
219227
}
220228

221-
void Sensorizer::assignTransformToSensors(const std::map<std::string, ExportedFrameInfo>& exported_frame_info_map)
229+
void Sensorizer::assignTransformToSensors(const std::map<std::string, ExportedFrameInfo>& exported_frame_info_map, const std::map<std::string, LinkInfo>& link_info_map, const std::array<double, 3> scale)
222230
{
223231
for (auto& s : sensors)
224232
{
225-
226233
if (exported_frame_info_map.find(s.frameName) != exported_frame_info_map.end())
227234
{
228-
s.transform = exported_frame_info_map.at(s.frameName).linkFrame_H_additionalFrame;
235+
// If the frame used is in the exported frames map, use the transform from there
236+
s.transform = exported_frame_info_map.at(s.frameName).linkFrame_H_additionalFrame * exported_frame_info_map.at(s.frameName).additionalTransformation;
229237
}
230238
else
231239
{
232-
printToMessageWindow(s.sensorName + ": " + s.frameName + " was not found", c2uLogLevel::WARN);
240+
// Otherwise let's try to compute the transform
241+
bool ret = false;
242+
iDynTree::Transform csys_H_additionalFrame{ iDynTree::Transform::Identity() };
243+
iDynTree::Transform csys_H_linkFrame{ iDynTree::Transform::Identity() };
244+
iDynTree::Transform linkFrame_H_additionalFrame{ iDynTree::Transform::Identity() };
245+
std::string cad_link_name = "";
246+
for (auto& rename : m_config["rename"])
247+
{
248+
if (rename.second.Scalar() == s.linkName)
249+
{
250+
cad_link_name = rename.first.Scalar();
251+
break;
252+
}
253+
}
254+
auto link_info = link_info_map.at(cad_link_name);
255+
std::tie(ret, csys_H_additionalFrame) = getTransformFromPart(link_info.modelhdl, s.frameName, scale);
256+
if (!ret)
257+
{
258+
printToMessageWindow("Unable to get the transform for " + s.frameName, c2uLogLevel::WARN);
259+
continue;
260+
}
261+
std::tie(ret, csys_H_linkFrame) = getTransformFromPart(link_info.modelhdl, link_info.link_frame_name, scale);
262+
if (!ret)
263+
{
264+
printToMessageWindow("Unable to get the transform for " + link_info.link_frame_name, c2uLogLevel::WARN);
265+
continue;
266+
}
267+
linkFrame_H_additionalFrame = csys_H_linkFrame.inverse() * csys_H_additionalFrame;
268+
s.transform = linkFrame_H_additionalFrame;
233269
}
234270
}
235271
}

0 commit comments

Comments
 (0)