@@ -517,6 +517,14 @@ hardware_interface::CallbackReturn
517517URPositionHardwareInterface::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
728736void 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
839809void 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