5 #include <SimoxUtility/algorithm/string/string_tools.h>
6 #include <VirtualRobot/XML/RobotIO.h>
22 #include <RobotAPI/libraries/armem_robot_state/aron/Proprioception.aron.generated.h>
23 #include <RobotAPI/libraries/armem_robot_state/aron/Robot.aron.generated.h>
24 #include <RobotAPI/libraries/armem_robot_state/aron/RobotDescription.aron.generated.h>
35 Base(memoryToIceAdapter,
37 arondto::RobotDescription::ToAronType())
46 robotUnit = robotUnitPrx;
49 updateRobotDescription();
53 Segment::commitRobotDescription(
62 arondto::RobotDescription::ToAronType());
70 arondto::RobotDescription dto;
71 toAron(dto, robotDescription);
72 update.instancesData = {dto.toAron()};
92 tryGet(
const std::function<std::string()>& func)
98 catch (
const std::exception& ex)
105 Segment::updateRobotDescription()
108 KinematicUnitInterfacePrx kinematicUnit = robotUnit->getKinematicUnit();
111 const std::string robotName = kinematicUnit->getRobotName();
112 const std::string robotFilename = kinematicUnit->getRobotFilename();
114 const std::vector<std::string> packages =
117 const std::string
package = simox::alg::split(robotFilename, "/").front();
127 auto spp = pp.serialize();
131 const std::string fixedPath = spp.path.substr(spp.package.size() + 1, -1);
133 spp.path = fixedPath;
142 const auto fixPathDto = [](armarx::arondto::PackagePath& pp)
147 const std::string fixedPath = pp.path.substr(pp.package.size() + 1, -1);
153 ARMARX_INFO <<
"Robot description '" << robotPath <<
"'";
157 arondto::RobotInfo info;
159 for (
const auto& side :
162 const auto arm = robotNameHelper->getArm(side);
164 arondto::RobotInfoElement e;
165 e.end_effector =
tryGet([&]() {
return arm.getEndEffector(); });
166 e.force_torque_sensor =
tryGet([&]() {
return arm.getForceTorqueSensor(); });
167 e.force_torque_sensor_frame =
168 tryGet([&]() {
return arm.getForceTorqueSensorFrame(); });
170 e.full_hand_collision_model.package =
171 tryGet([&]() {
return arm.getHandModelPackage(); });
172 e.full_hand_collision_model.path =
173 tryGet([&]() {
return arm.getFullHandCollisionModel(); });
174 fixPathDto(e.full_hand_collision_model);
177 e.hand_controller_name =
tryGet([&]() {
return arm.getHandControllerName(); });
179 e.hand_model.package =
tryGet([&]() {
return arm.getHandModelPackage(); });
180 e.hand_model.path =
tryGet([&]() {
return arm.getHandModelPath(); });
181 fixPathDto(e.hand_model);
183 e.hand_root_node =
tryGet([&]() {
return arm.getHandRootNode(); });
184 e.kinematic_chain =
tryGet([&]() {
return arm.getKinematicChain(); });
186 e.palm_collision_model =
tryGet([&]() {
return arm.getPalmCollisionModel(); });
188 e.tcp =
tryGet([&]() {
return arm.getTCP(); });
189 e.torso_kinematic_chain =
190 tryGet([&]() {
return arm.getTorsoKinematicChain(); });
192 e.hand_unit =
tryGet([&]() {
return arm.getHandUnitName(); });
195 info.parts.emplace(side +
"Arm", e);
199 arondto::RobotDescriptionVisualization visualization;
201 for (
const auto& side :
204 const auto arm = robotNameHelper->getArm(side);
206 armarx::armem::arondto::BodyPartDescription bpd;
207 bpd.root_node_name =
tryGet([&]() {
return arm.getHandRootNode(); });
208 bpd.xml.package =
tryGet([&]() {
return arm.getHandModelPackage(); });
209 bpd.xml.path =
tryGet([&]() {
return arm.getHandModelPath(); });
212 visualization.body_parts.emplace(side +
"Hand", bpd);
217 std::map<std::string, std::vector<armarx::armem::arondto::ManipulationCapability>>>
218 allManipulationCapabilities;
220 const auto robot = VirtualRobot::RobotIO::loadRobot(robotPath.toSystemPath());
223 for (
const auto& eef : robot->getEndEffectors())
225 const auto& capabilities = eef->getManipulationCapabilities();
226 if (capabilities.has_value())
228 std::vector<armarx::armem::arondto::ManipulationCapability>
229 manipulationCapabilities;
231 for (
const auto& vrCap : capabilities->capabilities)
233 arondto::ManipulationCapability dto;
235 dto.affordance = vrCap.affordance;
237 dto.shape = vrCap.shape;
238 dto.type = vrCap.type;
240 manipulationCapabilities.push_back(dto);
244 if (not allManipulationCapabilities)
246 allManipulationCapabilities.emplace();
249 allManipulationCapabilities->emplace(eef->getName(),
250 manipulationCapabilities);
255 const armem::robot_state::description::RobotDescription robotDescription{
256 .
name = kinematicUnit->getRobotName(),
257 .xml = {robotPath.serialize().package, robotPath.serialize().path},
258 .visualization = visualization,
260 .manipulationCapabilities = allManipulationCapabilities};
265 commitRobotDescription(robotDescription);
269 ARMARX_WARNING <<
"Robot unit '" << robotUnit->ice_getIdentity().name
270 <<
"' does not have a kinematic unit."
271 <<
"\n Cannot commit robot description.";
289 [
this, &robotDescriptions](
const wm::Entity& entity)
293 const auto description =
298 robotDescriptions.emplace(description->name, *description);
302 ARMARX_WARNING <<
"Could not convert entity instance to 'RobotDescription'";
307 <<
"Number of known robot descriptions: " << robotDescriptions.size();
308 return robotDescriptions;