This commit is contained in:
parent
1e1ff27cef
commit
7bd11e6e8d
@ -43,6 +43,8 @@ def generate_robot_description(context: LaunchContext, description_package, desc
|
|||||||
gravity_torque_mode, gravity_scale,
|
gravity_torque_mode, gravity_scale,
|
||||||
gravity_tau_limit1, gravity_tau_limit2, gravity_tau_limit3,
|
gravity_tau_limit1, gravity_tau_limit2, gravity_tau_limit3,
|
||||||
gravity_tau_limit4, gravity_tau_limit5, gravity_tau_limit6, gravity_tau_limit7,
|
gravity_tau_limit4, gravity_tau_limit5, gravity_tau_limit6, gravity_tau_limit7,
|
||||||
|
gripper_gravity_tau,
|
||||||
|
gripper_gravity_tau_limit,
|
||||||
kdl_urdf_path, kdl_base_link, kdl_tip_link):
|
kdl_urdf_path, kdl_base_link, kdl_tip_link):
|
||||||
"""Generate robot description using xacro processing."""
|
"""Generate robot description using xacro processing."""
|
||||||
|
|
||||||
@ -63,6 +65,8 @@ def generate_robot_description(context: LaunchContext, description_package, desc
|
|||||||
gravity_tau_limit5_str = context.perform_substitution(gravity_tau_limit5)
|
gravity_tau_limit5_str = context.perform_substitution(gravity_tau_limit5)
|
||||||
gravity_tau_limit6_str = context.perform_substitution(gravity_tau_limit6)
|
gravity_tau_limit6_str = context.perform_substitution(gravity_tau_limit6)
|
||||||
gravity_tau_limit7_str = context.perform_substitution(gravity_tau_limit7)
|
gravity_tau_limit7_str = context.perform_substitution(gravity_tau_limit7)
|
||||||
|
gripper_gravity_tau_str = context.perform_substitution(gripper_gravity_tau)
|
||||||
|
gripper_gravity_tau_limit_str = context.perform_substitution(gripper_gravity_tau_limit)
|
||||||
kdl_urdf_path_str = context.perform_substitution(kdl_urdf_path)
|
kdl_urdf_path_str = context.perform_substitution(kdl_urdf_path)
|
||||||
kdl_base_link_str = context.perform_substitution(kdl_base_link)
|
kdl_base_link_str = context.perform_substitution(kdl_base_link)
|
||||||
kdl_tip_link_str = context.perform_substitution(kdl_tip_link)
|
kdl_tip_link_str = context.perform_substitution(kdl_tip_link)
|
||||||
@ -93,6 +97,8 @@ def generate_robot_description(context: LaunchContext, description_package, desc
|
|||||||
"gravity_tau_limit5": gravity_tau_limit5_str,
|
"gravity_tau_limit5": gravity_tau_limit5_str,
|
||||||
"gravity_tau_limit6": gravity_tau_limit6_str,
|
"gravity_tau_limit6": gravity_tau_limit6_str,
|
||||||
"gravity_tau_limit7": gravity_tau_limit7_str,
|
"gravity_tau_limit7": gravity_tau_limit7_str,
|
||||||
|
"gripper_gravity_tau": gripper_gravity_tau_str,
|
||||||
|
"gripper_gravity_tau_limit": gripper_gravity_tau_limit_str,
|
||||||
"kdl_urdf_path": kdl_urdf_path_str,
|
"kdl_urdf_path": kdl_urdf_path_str,
|
||||||
"kdl_base_link": kdl_base_link_str,
|
"kdl_base_link": kdl_base_link_str,
|
||||||
"kdl_tip_link": kdl_tip_link_str,
|
"kdl_tip_link": kdl_tip_link_str,
|
||||||
@ -111,6 +117,8 @@ def robot_nodes_spawner(context: LaunchContext, description_package, description
|
|||||||
gravity_compensation_use_kdl, gravity_torque_mode, gravity_scale,
|
gravity_compensation_use_kdl, gravity_torque_mode, gravity_scale,
|
||||||
gravity_tau_limit1, gravity_tau_limit2, gravity_tau_limit3,
|
gravity_tau_limit1, gravity_tau_limit2, gravity_tau_limit3,
|
||||||
gravity_tau_limit4, gravity_tau_limit5, gravity_tau_limit6, gravity_tau_limit7,
|
gravity_tau_limit4, gravity_tau_limit5, gravity_tau_limit6, gravity_tau_limit7,
|
||||||
|
gripper_gravity_tau,
|
||||||
|
gripper_gravity_tau_limit,
|
||||||
kdl_urdf_path,
|
kdl_urdf_path,
|
||||||
kdl_base_link, kdl_tip_link):
|
kdl_base_link, kdl_tip_link):
|
||||||
"""Spawn both robot state publisher and control nodes with shared robot description."""
|
"""Spawn both robot state publisher and control nodes with shared robot description."""
|
||||||
@ -122,6 +130,8 @@ def robot_nodes_spawner(context: LaunchContext, description_package, description
|
|||||||
gravity_compensation_use_kdl, gravity_torque_mode, gravity_scale,
|
gravity_compensation_use_kdl, gravity_torque_mode, gravity_scale,
|
||||||
gravity_tau_limit1, gravity_tau_limit2, gravity_tau_limit3,
|
gravity_tau_limit1, gravity_tau_limit2, gravity_tau_limit3,
|
||||||
gravity_tau_limit4, gravity_tau_limit5, gravity_tau_limit6, gravity_tau_limit7,
|
gravity_tau_limit4, gravity_tau_limit5, gravity_tau_limit6, gravity_tau_limit7,
|
||||||
|
gripper_gravity_tau,
|
||||||
|
gripper_gravity_tau_limit,
|
||||||
kdl_urdf_path,
|
kdl_urdf_path,
|
||||||
kdl_base_link, kdl_tip_link,
|
kdl_base_link, kdl_tip_link,
|
||||||
)
|
)
|
||||||
@ -282,7 +292,7 @@ def generate_launch_description():
|
|||||||
),
|
),
|
||||||
DeclareLaunchArgument(
|
DeclareLaunchArgument(
|
||||||
"gravity_scale",
|
"gravity_scale",
|
||||||
default_value="2.5",
|
default_value="3.5",
|
||||||
description="Scale multiplier for gravity torque from KDL.",
|
description="Scale multiplier for gravity torque from KDL.",
|
||||||
),
|
),
|
||||||
DeclareLaunchArgument("gravity_tau_limit1", default_value="10.0"),
|
DeclareLaunchArgument("gravity_tau_limit1", default_value="10.0"),
|
||||||
@ -291,7 +301,17 @@ def generate_launch_description():
|
|||||||
DeclareLaunchArgument("gravity_tau_limit4", default_value="5.0"),
|
DeclareLaunchArgument("gravity_tau_limit4", default_value="5.0"),
|
||||||
DeclareLaunchArgument("gravity_tau_limit5", default_value="5.0"),
|
DeclareLaunchArgument("gravity_tau_limit5", default_value="5.0"),
|
||||||
DeclareLaunchArgument("gravity_tau_limit6", default_value="3.0"),
|
DeclareLaunchArgument("gravity_tau_limit6", default_value="3.0"),
|
||||||
DeclareLaunchArgument("gravity_tau_limit7", default_value="3.0"),
|
DeclareLaunchArgument("gravity_tau_limit7", default_value="10.0"),
|
||||||
|
DeclareLaunchArgument(
|
||||||
|
"gripper_gravity_tau",
|
||||||
|
default_value="-0.1",
|
||||||
|
description="Constant gripper gravity compensation torque (Nm), sign follows motor positive direction.",
|
||||||
|
),
|
||||||
|
DeclareLaunchArgument(
|
||||||
|
"gripper_gravity_tau_limit",
|
||||||
|
default_value="0.1",
|
||||||
|
description="Absolute clamp limit (Nm) for gripper gravity compensation torque.",
|
||||||
|
),
|
||||||
DeclareLaunchArgument(
|
DeclareLaunchArgument(
|
||||||
"kdl_urdf_path",
|
"kdl_urdf_path",
|
||||||
default_value="/tmp/openarm_bimanual_runtime.urdf",
|
default_value="/tmp/openarm_bimanual_runtime.urdf",
|
||||||
@ -357,6 +377,8 @@ def generate_launch_description():
|
|||||||
gravity_tau_limit5 = LaunchConfiguration("gravity_tau_limit5")
|
gravity_tau_limit5 = LaunchConfiguration("gravity_tau_limit5")
|
||||||
gravity_tau_limit6 = LaunchConfiguration("gravity_tau_limit6")
|
gravity_tau_limit6 = LaunchConfiguration("gravity_tau_limit6")
|
||||||
gravity_tau_limit7 = LaunchConfiguration("gravity_tau_limit7")
|
gravity_tau_limit7 = LaunchConfiguration("gravity_tau_limit7")
|
||||||
|
gripper_gravity_tau = LaunchConfiguration("gripper_gravity_tau")
|
||||||
|
gripper_gravity_tau_limit = LaunchConfiguration("gripper_gravity_tau_limit")
|
||||||
kdl_urdf_path = LaunchConfiguration("kdl_urdf_path")
|
kdl_urdf_path = LaunchConfiguration("kdl_urdf_path")
|
||||||
kdl_base_link = LaunchConfiguration("kdl_base_link")
|
kdl_base_link = LaunchConfiguration("kdl_base_link")
|
||||||
kdl_tip_link = LaunchConfiguration("kdl_tip_link")
|
kdl_tip_link = LaunchConfiguration("kdl_tip_link")
|
||||||
@ -379,6 +401,8 @@ def generate_launch_description():
|
|||||||
gravity_torque_mode, gravity_scale,
|
gravity_torque_mode, gravity_scale,
|
||||||
gravity_tau_limit1, gravity_tau_limit2, gravity_tau_limit3,
|
gravity_tau_limit1, gravity_tau_limit2, gravity_tau_limit3,
|
||||||
gravity_tau_limit4, gravity_tau_limit5, gravity_tau_limit6, gravity_tau_limit7,
|
gravity_tau_limit4, gravity_tau_limit5, gravity_tau_limit6, gravity_tau_limit7,
|
||||||
|
gripper_gravity_tau,
|
||||||
|
gripper_gravity_tau_limit,
|
||||||
kdl_urdf_path, kdl_base_link, kdl_tip_link]
|
kdl_urdf_path, kdl_base_link, kdl_tip_link]
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|||||||
@ -114,6 +114,8 @@ class OpenArm_v10HW : public hardware_interface::SystemInterface {
|
|||||||
const double GRIPPER_MOTOR_1_RADIANS = -1.0472;
|
const double GRIPPER_MOTOR_1_RADIANS = -1.0472;
|
||||||
const double GRIPPER_KP = 5.0;
|
const double GRIPPER_KP = 5.0;
|
||||||
const double GRIPPER_KD = 0.1;
|
const double GRIPPER_KD = 0.1;
|
||||||
|
double gripper_gravity_tau_ = 0.0;
|
||||||
|
double gripper_gravity_tau_limit_ = 0.5;
|
||||||
|
|
||||||
// Configuration
|
// Configuration
|
||||||
std::string can_interface_;
|
std::string can_interface_;
|
||||||
|
|||||||
@ -126,6 +126,18 @@ bool OpenArm_v10HW::parse_config(const hardware_interface::HardwareInfo& info) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
it = info.hardware_parameters.find("gripper_gravity_tau");
|
||||||
|
if (it != info.hardware_parameters.end()) {
|
||||||
|
gripper_gravity_tau_ = std::stod(it->second);
|
||||||
|
}
|
||||||
|
|
||||||
|
it = info.hardware_parameters.find("gripper_gravity_tau_limit");
|
||||||
|
if (it != info.hardware_parameters.end()) {
|
||||||
|
gripper_gravity_tau_limit_ = std::stod(it->second);
|
||||||
|
}
|
||||||
|
|
||||||
// Safety defaults: if limits are not provided, use conservative clamp.
|
// Safety defaults: if limits are not provided, use conservative clamp.
|
||||||
if (gravity_compensation_enabled_) {
|
if (gravity_compensation_enabled_) {
|
||||||
constexpr double kDefaultGravityTauLimit = 2.0;
|
constexpr double kDefaultGravityTauLimit = 2.0;
|
||||||
@ -153,13 +165,23 @@ bool OpenArm_v10HW::parse_config(const hardware_interface::HardwareInfo& info) {
|
|||||||
gravity_scale_ = 1.0;
|
gravity_scale_ = 1.0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (gripper_gravity_tau_limit_ < 0.0) {
|
||||||
|
RCLCPP_WARN(rclcpp::get_logger("OpenArm_v10HW"),
|
||||||
|
"gripper_gravity_tau_limit=%.3f is invalid, clamping to 0.0",
|
||||||
|
gripper_gravity_tau_limit_);
|
||||||
|
gripper_gravity_tau_limit_ = 0.0;
|
||||||
|
}
|
||||||
|
|
||||||
|
gripper_gravity_tau_ = clamp_abs(gripper_gravity_tau_, gripper_gravity_tau_limit_);
|
||||||
|
|
||||||
RCLCPP_INFO(rclcpp::get_logger("OpenArm_v10HW"),
|
RCLCPP_INFO(rclcpp::get_logger("OpenArm_v10HW"),
|
||||||
"Configuration: CAN=%s, arm_prefix=%s, hand=%s, can_fd=%s, gravity_comp=%s, use_kdl=%s, torque_mode=%s, gravity_scale=%.3f",
|
"Configuration: CAN=%s, arm_prefix=%s, hand=%s, can_fd=%s, gravity_comp=%s, use_kdl=%s, torque_mode=%s, gravity_scale=%.3f, gripper_gravity_tau=%.3f, gripper_tau_limit=%.3f",
|
||||||
can_interface_.c_str(), arm_prefix_.c_str(),
|
can_interface_.c_str(), arm_prefix_.c_str(),
|
||||||
hand_ ? "enabled" : "disabled", can_fd_ ? "enabled" : "disabled",
|
hand_ ? "enabled" : "disabled", can_fd_ ? "enabled" : "disabled",
|
||||||
gravity_compensation_enabled_ ? "enabled" : "disabled",
|
gravity_compensation_enabled_ ? "enabled" : "disabled",
|
||||||
gravity_compensation_use_kdl_ ? "true" : "false",
|
gravity_compensation_use_kdl_ ? "true" : "false",
|
||||||
gravity_torque_mode_ ? "true" : "false", gravity_scale_);
|
gravity_torque_mode_ ? "true" : "false", gravity_scale_,
|
||||||
|
gripper_gravity_tau_, gripper_gravity_tau_limit_);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -383,8 +405,17 @@ hardware_interface::return_type OpenArm_v10HW::write(
|
|||||||
if (hand_ && joint_names_.size() > ARM_DOF) {
|
if (hand_ && joint_names_.size() > ARM_DOF) {
|
||||||
// TODO the true mappings are unimplemented.
|
// TODO the true mappings are unimplemented.
|
||||||
double motor_command = joint_to_motor_radians(pos_commands_[ARM_DOF]);
|
double motor_command = joint_to_motor_radians(pos_commands_[ARM_DOF]);
|
||||||
openarm_->get_gripper().mit_control_all(
|
double gripper_gravity_tau = 0.0;
|
||||||
{{GRIPPER_KP, GRIPPER_KD, motor_command, 0, 0}});
|
if (gravity_compensation_enabled_ && gravity_torque_mode_) {
|
||||||
|
gripper_gravity_tau = clamp_abs(gripper_gravity_tau_, gripper_gravity_tau_limit_);
|
||||||
|
const double gripper_tau_total = tau_commands_[ARM_DOF] + gripper_gravity_tau;
|
||||||
|
openarm_->get_gripper().mit_control_all(
|
||||||
|
{{0.0, 0.0, motor_command, 0, gripper_tau_total}});
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
openarm_->get_gripper().mit_control_all(
|
||||||
|
{{GRIPPER_KP, GRIPPER_KD, motor_command, 0, 0}});
|
||||||
|
}
|
||||||
}
|
}
|
||||||
openarm_->recv_all(1000);
|
openarm_->recv_all(1000);
|
||||||
return hardware_interface::return_type::OK;
|
return hardware_interface::return_type::OK;
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user