Skip to content

Commit 8ad5ebb

Browse files
Fix dynamics calculation of GenericSystem component (#2705)
1 parent 6d27e9d commit 8ad5ebb

File tree

2 files changed

+549
-80
lines changed

2 files changed

+549
-80
lines changed

hardware_interface/src/mock_components/generic_system.cpp

Lines changed: 23 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)