@@ -261,7 +261,7 @@ CallbackReturn GenericSystem::on_init(const hardware_interface::HardwareInfo & i
261261
262262 for (const auto & transmission_info : info_.transmissions )
263263 {
264- // only simple transmissions are supported in this demo
264+ // only simple transmissions are supported
265265 if (transmission_info.type != " transmission_interface/SimpleTransmission" )
266266 {
267267 std::string msg (
@@ -277,13 +277,20 @@ CallbackReturn GenericSystem::on_init(const hardware_interface::HardwareInfo & i
277277 std::vector<transmission_interface::JointHandle> joint_handles;
278278 for (const auto & joint_info : transmission_info.joints )
279279 {
280- // this demo supports only one interface per joint
281- if (!(joint_info.state_interfaces .size () == 1 &&
282- joint_info.state_interfaces [0 ] == hardware_interface::HW_IF_POSITION &&
283- joint_info.command_interfaces .size () == 1 &&
284- joint_info.command_interfaces [0 ] == hardware_interface::HW_IF_POSITION))
280+ // We currently only support HW_IF_POSITION -> search for HW_IF_POSITION in command_interfaces
281+ // and state_interfaces and throw is not present in one of them
282+ // TODO(Manuel) add arbitrary interface does this make sense? Or only velocity and effort?
283+ if (
284+ (std::find (
285+ joint_info.state_interfaces .begin (), joint_info.state_interfaces .end (),
286+ hardware_interface::HW_IF_POSITION) == joint_info.state_interfaces .end ()) ||
287+ (std::find (
288+ joint_info.command_interfaces .begin (), joint_info.command_interfaces .end (),
289+ hardware_interface::HW_IF_POSITION) == joint_info.command_interfaces .end ()))
285290 {
286- std::string msg (" Invalid transmission joint " + joint_info.name + " configuration" );
291+ std::string msg (
292+ " Invalid transmission joint " + joint_info.name +
293+ " configuration. No position interface found." );
287294 throw std::runtime_error (msg);
288295 }
289296
0 commit comments