diff --git a/src/iiwa_config/config/moveit/iiwa_controller.yaml b/src/iiwa_config/config/moveit/iiwa_controller.yaml index abeecde..21903c8 100644 --- a/src/iiwa_config/config/moveit/iiwa_controller.yaml +++ b/src/iiwa_config/config/moveit/iiwa_controller.yaml @@ -39,7 +39,7 @@ iiwa_arm_controller: - position - velocity - interpolate_from_desired_state: false + interpolate_from_desired_state: true allow_partial_joints_goal: false allow_nonzero_velocity_at_trajectory_end: false diff --git a/src/iiwa_config/config/setting.yaml b/src/iiwa_config/config/setting.yaml index bbd36c0..4c210e1 100644 --- a/src/iiwa_config/config/setting.yaml +++ b/src/iiwa_config/config/setting.yaml @@ -4,7 +4,7 @@ robot: port: 30200 command_mode: "position" # torque, position fri_cycle_ms: 5 # период FRI-цикла: 5 мс (200 Гц) или 10 мс (100 Гц) - joint_position_tau: 0.04 # постоянная времени фильтра позиций [с]: больше → плавнее, медленнее + joint_position_tau: 0.15 # EMA фильтр позиций: 0 = выкл (без лага → без overshoot при торможении) active_controller: "jtc" # "jtc" = MoveIt/JointTrajectoryController, "forward" = ForwardCommandController description: pkg://iiwa_description/urdf/iiwa7.urdf.xacro diff --git a/src/iiwa_controller/src/IIWAHardwareInterface.cpp b/src/iiwa_controller/src/IIWAHardwareInterface.cpp index 2fb006c..97d76d6 100644 --- a/src/iiwa_controller/src/IIWAHardwareInterface.cpp +++ b/src/iiwa_controller/src/IIWAHardwareInterface.cpp @@ -1,6 +1,7 @@ #include "iiwa_controller/IIWAHardwareInterface.hpp" #include +#include #include #include "hardware_interface/hardware_info.hpp" @@ -238,9 +239,17 @@ hardware_interface::return_type IIWAHardwareInterface::read( const double dt = (static_cast(snap.time_stamp_sec) - static_cast(last_ts_sec_)) + (static_cast(snap.time_stamp_nano_sec) - static_cast(last_ts_nsec_)) * 1e-9; + + // iiwa7 physical velocity limits [rad/s], used to clamp impossible spikes + static constexpr std::array kMaxVel = + {1.71, 1.71, 1.75, 2.27, 2.44, 3.14, 3.14}; + static constexpr double kVelDeadband = 1e-4; + if (dt > 0.0) { for (size_t i = 0; i < N_JOINTS; ++i) { - vel_filtered_[i] = (snap.measured_pos[i] - prev_pos_[i]) / dt; + const double raw = (snap.measured_pos[i] - prev_pos_[i]) / dt; + const double clamped = std::clamp(raw, -kMaxVel[i], kMaxVel[i]); + vel_filtered_[i] = (std::abs(clamped) < kVelDeadband) ? 0.0 : clamped; } } for (size_t i = 0; i < N_JOINTS; ++i) { diff --git a/src/iiwa_controller_v2/src/system_interface.cpp b/src/iiwa_controller_v2/src/system_interface.cpp index 0773761..daf9716 100644 --- a/src/iiwa_controller_v2/src/system_interface.cpp +++ b/src/iiwa_controller_v2/src/system_interface.cpp @@ -2,6 +2,7 @@ #include #include +#include #include #include "hardware_interface/types/hardware_component_interface_params.hpp" @@ -375,10 +376,23 @@ void SystemInterface::compute_velocity_(const IIWAStateSnapshot & snap) return; } - const double dt = (ts_sec + ts_nsec * 1e-9) - (last_ts_sec_ + last_ts_nsec_ * 1e-9); + // Use integer subtraction to avoid floating-point precision loss with large Unix timestamps + const double dt = + static_cast(static_cast(snap.time_stamp_sec) - + static_cast(static_cast(last_ts_sec_))) + + (ts_nsec - last_ts_nsec_) * 1e-9; + + // iiwa7 max joint velocity [rad/s], used to clamp impossible spikes + static constexpr std::array kMaxVel = + {1.71, 1.71, 1.75, 2.27, 2.44, 3.14, 3.14}; + static constexpr double kVelDeadband = 1e-4; // zero out near-stop residuals + if (dt > 0.0) { for (std::size_t i = 0; i < FRIClient::N_JOINTS; ++i) { - velocity_[i] = (snap.measured_pos[i] - last_pos_[i]) / dt; + const double raw = (snap.measured_pos[i] - last_pos_[i]) / dt; + // Clamp to physical limit and apply zero deadband + const double clamped = std::clamp(raw, -kMaxVel[i], kMaxVel[i]); + velocity_[i] = (std::abs(clamped) < kVelDeadband) ? 0.0 : clamped; } } diff --git a/src/iiwa_description/urdf/iiwa7.urdf.xacro b/src/iiwa_description/urdf/iiwa7.urdf.xacro index f5a9175..7edf3aa 100644 --- a/src/iiwa_description/urdf/iiwa7.urdf.xacro +++ b/src/iiwa_description/urdf/iiwa7.urdf.xacro @@ -9,8 +9,8 @@ - - + @@ -152,15 +152,15 @@ ════════════════════════════════════════════════════════ --> - iiwa_controller_v2/SystemInterface - $(arg robot_ip) - $(arg fri_port) - false - $(arg command_mode) - $(arg joint_position_tau) + + + + + + - $(arg open_loop) - $(arg rt_prio) + + + + iiwa_controller/IIWAHardwareInterface + $(arg robot_ip) + $(arg fri_port) + false + $(arg command_mode) + $(arg joint_position_tau)