94 bool init(rclcpp::Node::SharedPtr node,
const mjModel* model, mjData* data)
override;
95 void pre_step(mjData* data)
override;
112 void publish_markers(visualization_msgs::msg::MarkerArray& markers)
const;
115 using ApplyExternalWrench = mujoco_ros2_control_msgs::srv::ApplyExternalWrench;
116 using MarkerArray = visualization_msgs::msg::MarkerArray;
122 std::string link_name;
123 mjtNum force[3]{ 0.0, 0.0, 0.0 };
124 mjtNum torque[3]{ 0.0, 0.0, 0.0 };
125 mjtNum application_point[3]{ 0.0, 0.0, 0.0 };
126 rclcpp::Time end_time{ 0, 0, RCL_ROS_TIME };
127 rclcpp::Duration ramp_down_duration{ 0, 0 };
128 double current_scale{ 1.0 };
132 void handleApplyWrench(
const ApplyExternalWrench::Request::SharedPtr request,
133 ApplyExternalWrench::Response::SharedPtr response);
136 void publish_markers();
139 rclcpp::Node::SharedPtr node_;
140 rclcpp::Logger logger_{ rclcpp::get_logger(
"ExternalWrenchPlugin") };
141 rclcpp::Service<ApplyExternalWrench>::SharedPtr service_;
143 rclcpp::Publisher<MarkerArray>::SharedPtr marker_pub_raw_;
144 std::unique_ptr<realtime_tools::RealtimePublisher<MarkerArray>> marker_pub_;
147 const mjModel* model_{
nullptr };
150 std::mutex pending_mutex_;
151 std::queue<ActiveWrench> pending_wrenches_;
154 std::vector<ActiveWrench> active_wrenches_;
158 std::vector<int> prev_written_body_ids_;
162 double force_arrow_scale_{ 0.01 };
164 double torque_arrow_scale_{ 0.1 };
166 std::atomic_bool service_requested_{
false };