@@ -427,50 +427,49 @@ return_type GenericSystem::read(const rclcpp::Time & /*time*/, const rclcpp::Dur
427427 {
428428 case ACCELERATION_INTERFACE_INDEX:
429429 {
430- // currently we do backward integration
431- joint_state_values_[POSITION_INTERFACE_INDEX] += // apply offset to positions only
432- std::isfinite (joint_state_values_[VELOCITY_INTERFACE_INDEX])
433- ? joint_state_values_[VELOCITY_INTERFACE_INDEX] * period.seconds ()
434- : 0.0 + (custom_interface_with_following_offset_.empty ()
435- ? position_state_following_offset_
436- : 0.0 );
437-
438430 if (std::isnan (joint_state_values_[VELOCITY_INTERFACE_INDEX]))
439431 {
440432 joint_state_values_[VELOCITY_INTERFACE_INDEX] = 0.0 ;
441433 }
442- joint_state_values_[VELOCITY_INTERFACE_INDEX] +=
443- std::isnan (joint_state_values_[ACCELERATION_INTERFACE_INDEX])
444- ? 0.0
445- : joint_state_values_[ACCELERATION_INTERFACE_INDEX] * period.seconds ();
446434
447435 if (std::isfinite (joint_command_values_[ACCELERATION_INTERFACE_INDEX]))
448436 {
449437 joint_state_values_[ACCELERATION_INTERFACE_INDEX] =
450438 joint_command_values_[ACCELERATION_INTERFACE_INDEX];
451439 }
452- break ;
453- }
454- case VELOCITY_INTERFACE_INDEX:
455- {
456- // currently we do backward integration
440+ // currently we do backward Euler integration
441+ joint_state_values_[VELOCITY_INTERFACE_INDEX] +=
442+ std::isnan (joint_state_values_[ACCELERATION_INTERFACE_INDEX])
443+ ? 0.0
444+ : joint_state_values_[ACCELERATION_INTERFACE_INDEX] * period. seconds ();
457445 joint_state_values_[POSITION_INTERFACE_INDEX] += // apply offset to positions only
458446 std::isfinite (joint_state_values_[VELOCITY_INTERFACE_INDEX])
459447 ? joint_state_values_[VELOCITY_INTERFACE_INDEX] * period.seconds ()
460448 : 0.0 + (custom_interface_with_following_offset_.empty ()
461449 ? position_state_following_offset_
462450 : 0.0 );
463-
451+ break ;
452+ }
453+ case VELOCITY_INTERFACE_INDEX:
454+ {
464455 if (std::isfinite (joint_command_values_[VELOCITY_INTERFACE_INDEX]))
465456 {
466- const double old_velocity = joint_state_values_[VELOCITY_INTERFACE_INDEX];
467-
457+ const double old_velocity = std::isfinite (joint_state_values_[VELOCITY_INTERFACE_INDEX])
458+ ? joint_state_values_[VELOCITY_INTERFACE_INDEX]
459+ : 0.0 ;
468460 joint_state_values_[VELOCITY_INTERFACE_INDEX] =
469461 joint_command_values_[VELOCITY_INTERFACE_INDEX];
470462
471463 joint_state_values_[ACCELERATION_INTERFACE_INDEX] =
472464 (joint_state_values_[VELOCITY_INTERFACE_INDEX] - old_velocity) / period.seconds ();
473465 }
466+ // currently we do backward Euler integration
467+ joint_state_values_[POSITION_INTERFACE_INDEX] += // apply offset to positions only
468+ std::isfinite (joint_state_values_[VELOCITY_INTERFACE_INDEX])
469+ ? joint_state_values_[VELOCITY_INTERFACE_INDEX] * period.seconds ()
470+ : 0.0 + (custom_interface_with_following_offset_.empty ()
471+ ? position_state_following_offset_
472+ : 0.0 );
474473 break ;
475474 }
476475 case POSITION_INTERFACE_INDEX:
@@ -497,9 +496,11 @@ return_type GenericSystem::read(const rclcpp::Time & /*time*/, const rclcpp::Dur
497496 }
498497 }
499498 // mirror them back
500- for (size_t i = 0 ; i < 3 ; ++i)
499+ for (size_t i = 0 ; i < standard_interfaces_. size () ; ++i)
501500 {
502- if (std::isfinite (joint_state_values_[i]))
501+ if (
502+ std::isfinite (joint_state_values_[i]) &&
503+ has_state (joint_name + " /" + standard_interfaces_[i]))
503504 {
504505 set_state (joint_name + " /" + standard_interfaces_[i], joint_state_values_[i]);
505506 }
0 commit comments