Skip to content

Commit b30fb33

Browse files
author
Felix Exner
committed
Move force_mode communication from AsyncIO to write
This should be more thread-safe, as the buffers are filled from the same thread as the write function is called.
1 parent 950629d commit b30fb33

File tree

2 files changed

+60
-46
lines changed

2 files changed

+60
-46
lines changed

ur_robot_driver/include/ur_robot_driver/hardware_interface.hpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -136,6 +136,8 @@ class URPositionHardwareInterface : public hardware_interface::SystemInterface
136136
void updateNonDoubleValues();
137137
void extractToolPose();
138138
void transformForceTorque();
139+
void start_force_mode();
140+
void stop_force_mode();
139141

140142
urcl::vector6d_t urcl_position_commands_;
141143
urcl::vector6d_t urcl_position_commands_old_;
@@ -206,6 +208,7 @@ class URPositionHardwareInterface : public hardware_interface::SystemInterface
206208
// force mode parameters
207209
urcl::vector6d_t force_mode_task_frame_;
208210
urcl::vector6d_t force_mode_selection_vector_;
211+
urcl::vector6uint32_t force_mode_selection_vector_copy_;
209212
urcl::vector6d_t force_mode_wrench_;
210213
urcl::vector6d_t force_mode_limits_;
211214
double force_mode_type_;

ur_robot_driver/src/hardware_interface.cpp

Lines changed: 57 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -517,6 +517,14 @@ hardware_interface::CallbackReturn
517517
URPositionHardwareInterface::on_activate(const rclcpp_lifecycle::State& previous_state)
518518
{
519519
RCLCPP_INFO(rclcpp::get_logger("URPositionHardwareInterface"), "Activating HW interface");
520+
521+
for (size_t i = 0; i < 6; i++) {
522+
force_mode_task_frame_[i] = NO_NEW_CMD_;
523+
force_mode_selection_vector_[i] = static_cast<uint32_t>(NO_NEW_CMD_);
524+
force_mode_wrench_[i] = NO_NEW_CMD_;
525+
force_mode_limits_[i] = NO_NEW_CMD_;
526+
}
527+
force_mode_type_ = static_cast<unsigned int>(NO_NEW_CMD_);
520528
return hardware_interface::CallbackReturn::SUCCESS;
521529
}
522530

@@ -686,6 +694,14 @@ hardware_interface::return_type URPositionHardwareInterface::write(const rclcpp:
686694

687695
} else {
688696
ur_driver_->writeKeepalive();
697+
698+
if (!std::isnan(force_mode_task_frame_[0]) && !std::isnan(force_mode_selection_vector_[0]) &&
699+
!std::isnan(force_mode_wrench_[0]) && !std::isnan(force_mode_type_) && !std::isnan(force_mode_limits_[0]) &&
700+
!std::isnan(force_mode_damping_) && !std::isnan(force_mode_gain_scaling_) && ur_driver_ != nullptr) {
701+
start_force_mode();
702+
} else if (!std::isnan(force_mode_disable_cmd_) && ur_driver_ != nullptr && force_mode_async_success_ == 2.0) {
703+
stop_force_mode();
704+
}
689705
}
690706

691707
packet_read_ = false;
@@ -715,14 +731,6 @@ void URPositionHardwareInterface::initAsyncIO()
715731

716732
payload_mass_ = NO_NEW_CMD_;
717733
payload_center_of_gravity_ = { NO_NEW_CMD_, NO_NEW_CMD_, NO_NEW_CMD_ };
718-
719-
for (size_t i = 0; i < 6; i++) {
720-
force_mode_task_frame_[i] = NO_NEW_CMD_;
721-
force_mode_selection_vector_[i] = static_cast<uint32_t>(NO_NEW_CMD_);
722-
force_mode_wrench_[i] = NO_NEW_CMD_;
723-
force_mode_limits_[i] = NO_NEW_CMD_;
724-
}
725-
force_mode_type_ = static_cast<unsigned int>(NO_NEW_CMD_);
726734
}
727735

728736
void URPositionHardwareInterface::checkAsyncIO()
@@ -796,44 +804,6 @@ void URPositionHardwareInterface::checkAsyncIO()
796804
zero_ftsensor_async_success_ = ur_driver_->zeroFTSensor();
797805
zero_ftsensor_cmd_ = NO_NEW_CMD_;
798806
}
799-
if (!std::isnan(force_mode_task_frame_[0]) && !std::isnan(force_mode_selection_vector_[0]) &&
800-
!std::isnan(force_mode_wrench_[0]) && !std::isnan(force_mode_type_) && !std::isnan(force_mode_limits_[0]) &&
801-
!std::isnan(force_mode_damping_) && !std::isnan(force_mode_gain_scaling_) && ur_driver_ != nullptr) {
802-
urcl::vector6uint32_t force_mode_selection_vector;
803-
for (size_t i = 0; i < 6; i++) {
804-
force_mode_selection_vector[i] = force_mode_selection_vector_[i];
805-
}
806-
/* Check version of robot to ensure that the correct startForceMode is called. */
807-
if (ur_driver_->getVersion().major < 5) {
808-
force_mode_async_success_ =
809-
ur_driver_->startForceMode(force_mode_task_frame_, force_mode_selection_vector, force_mode_wrench_,
810-
force_mode_type_, force_mode_limits_, force_mode_damping_);
811-
if (force_mode_gain_scaling_ != 0.5) {
812-
RCLCPP_WARN(rclcpp::get_logger("URPositionHardwareInterface"), "Force mode gain scaling cannot be used on CB3 "
813-
"robots. Starting force mode, but disregarding "
814-
"gain scaling.");
815-
}
816-
} else {
817-
force_mode_async_success_ = ur_driver_->startForceMode(force_mode_task_frame_, force_mode_selection_vector,
818-
force_mode_wrench_, force_mode_type_, force_mode_limits_,
819-
force_mode_damping_, force_mode_gain_scaling_);
820-
}
821-
822-
for (size_t i = 0; i < 6; i++) {
823-
force_mode_task_frame_[i] = NO_NEW_CMD_;
824-
force_mode_selection_vector_[i] = static_cast<uint32_t>(NO_NEW_CMD_);
825-
force_mode_wrench_[i] = NO_NEW_CMD_;
826-
force_mode_limits_[i] = NO_NEW_CMD_;
827-
}
828-
force_mode_type_ = static_cast<unsigned int>(NO_NEW_CMD_);
829-
force_mode_damping_ = NO_NEW_CMD_;
830-
force_mode_gain_scaling_ = NO_NEW_CMD_;
831-
}
832-
833-
if (!std::isnan(force_mode_disable_cmd_) && ur_driver_ != nullptr && force_mode_async_success_ == 2.0) {
834-
force_mode_async_success_ = ur_driver_->endForceMode();
835-
force_mode_disable_cmd_ = NO_NEW_CMD_;
836-
}
837807
}
838808

839809
void URPositionHardwareInterface::updateNonDoubleValues()
@@ -1018,6 +988,47 @@ hardware_interface::return_type URPositionHardwareInterface::perform_command_mod
1018988

1019989
return ret_val;
1020990
}
991+
992+
void URPositionHardwareInterface::start_force_mode()
993+
{
994+
for (size_t i = 0; i < force_mode_selection_vector_.size(); i++) {
995+
force_mode_selection_vector_copy_[i] = force_mode_selection_vector_[i];
996+
}
997+
/* Check version of robot to ensure that the correct startForceMode is called. */
998+
if (ur_driver_->getVersion().major < 5) {
999+
force_mode_async_success_ =
1000+
ur_driver_->startForceMode(force_mode_task_frame_, force_mode_selection_vector_copy_, force_mode_wrench_,
1001+
force_mode_type_, force_mode_limits_, force_mode_damping_);
1002+
if (force_mode_gain_scaling_ != 0.5) {
1003+
RCLCPP_WARN(rclcpp::get_logger("URPositionHardwareInterface"), "Force mode gain scaling cannot be used on "
1004+
"CB3 "
1005+
"robots. Starting force mode, but "
1006+
"disregarding "
1007+
"gain scaling.");
1008+
}
1009+
} else {
1010+
force_mode_async_success_ =
1011+
ur_driver_->startForceMode(force_mode_task_frame_, force_mode_selection_vector_copy_, force_mode_wrench_,
1012+
force_mode_type_, force_mode_limits_, force_mode_damping_, force_mode_gain_scaling_);
1013+
}
1014+
1015+
for (size_t i = 0; i < 6; i++) {
1016+
force_mode_task_frame_[i] = NO_NEW_CMD_;
1017+
force_mode_selection_vector_[i] = static_cast<uint32_t>(NO_NEW_CMD_);
1018+
force_mode_wrench_[i] = NO_NEW_CMD_;
1019+
force_mode_limits_[i] = NO_NEW_CMD_;
1020+
}
1021+
force_mode_type_ = static_cast<unsigned int>(NO_NEW_CMD_);
1022+
force_mode_damping_ = NO_NEW_CMD_;
1023+
force_mode_gain_scaling_ = NO_NEW_CMD_;
1024+
}
1025+
1026+
void URPositionHardwareInterface::stop_force_mode()
1027+
{
1028+
force_mode_async_success_ = ur_driver_->endForceMode();
1029+
force_mode_disable_cmd_ = NO_NEW_CMD_;
1030+
}
1031+
10211032
} // namespace ur_robot_driver
10221033

10231034
#include "pluginlib/class_list_macros.hpp"

0 commit comments

Comments
 (0)