92 hardware_interface::CallbackReturn
98 on_init(
const hardware_interface::HardwareComponentInterfaceParams& params)
override;
103 hardware_interface::CallbackReturn on_activate(
const rclcpp_lifecycle::State& previous_state)
override;
104 hardware_interface::CallbackReturn on_deactivate(
const rclcpp_lifecycle::State& previous_state)
override;
107 const std::vector<std::string>& stop_interfaces)
override;
109 hardware_interface::return_type
read(
const rclcpp::Time& time,
const rclcpp::Duration& period)
override;
110 hardware_interface::return_type
write(
const rclcpp::Time& time,
const rclcpp::Duration& period)
override;
159 rclcpp::Logger get_logger()
const;
168 bool register_mujoco_actuators();
198 bool apply_keyframe(
const std::string& keyframe_name);
258 bool set_override_start_positions(
const std::string& override_start_position_file);
263 void set_initial_pose();
275 void reset_simulation_state(
bool fill_initial_state);
283 void reset_world_callback(
const std::shared_ptr<mujoco_ros2_control_msgs::srv::ResetWorld::Request> request,
284 std::shared_ptr<mujoco_ros2_control_msgs::srv::ResetWorld::Response> response);
286 void set_pause_callback(
const std::shared_ptr<mujoco_ros2_control_msgs::srv::SetPause::Request> request,
287 std::shared_ptr<mujoco_ros2_control_msgs::srv::SetPause::Response> response);
289 void step_simulation_callback(
const std::shared_ptr<mujoco_ros2_control_msgs::srv::StepSimulation::Request> request,
290 std::shared_ptr<mujoco_ros2_control_msgs::srv::StepSimulation::Response> response);
302 void publish_clock();
309 void update_sim_display();
315 rclcpp::Node::SharedPtr get_node()
const;
324 void load_mujoco_plugins();
327 std::string model_path_;
330 mjModel* mj_model_{
nullptr };
331 mjData* mj_data_{
nullptr };
334 mjData* mj_data_control_{
nullptr };
342 rclcpp::Logger logger_ = rclcpp::get_logger(
"MujocoSystemInterface");
346 double sim_speed_factor_;
349 bool headless_{
false };
352 std::unique_ptr<mujoco::Simulate> sim_;
355 std::thread physics_thread_;
356 std::thread ui_thread_;
359 std::shared_ptr<rclcpp::Node> mujoco_node_;
360 std::unique_ptr<rclcpp::executors::MultiThreadedExecutor> executor_;
361 std::thread executor_thread_;
364 std::shared_ptr<rclcpp::Publisher<rosgraph_msgs::msg::Clock>> clock_publisher_;
368 std::shared_ptr<rclcpp::Publisher<sensor_msgs::msg::JointState>> actuator_state_publisher_ =
nullptr;
371 sensor_msgs::msg::JointState actuator_state_msg_;
374 std::shared_ptr<rclcpp::Publisher<nav_msgs::msg::Odometry>> floating_base_publisher_ =
nullptr;
376 nav_msgs::msg::Odometry floating_base_msg_;
379 int free_joint_id_ = -1;
380 int free_joint_qpos_adr_ = -1;
381 int free_joint_qvel_adr_ = -1;
384 std::unique_ptr<MujocoCameras> cameras_;
387 std::unique_ptr<MujocoLidar> lidar_sensors_;
394 std::recursive_mutex* sim_mutex_{
nullptr };
397 std::unordered_map<std::string, hardware_interface::ComponentInfo> joint_hw_info_;
398 std::unordered_map<std::string, hardware_interface::ComponentInfo> sensors_hw_info_;
401 std::vector<MuJoCoActuatorData> mujoco_actuator_data_;
404 std::vector<URDFJointData> urdf_joint_data_;
407 std::unique_ptr<pluginlib::ClassLoader<transmission_interface::TransmissionLoader>> transmission_loader_ =
nullptr;
408 std::vector<std::shared_ptr<transmission_interface::Transmission>> transmission_instances_;
411 std::unique_ptr<pluginlib::ClassLoader<mujoco_ros2_control_plugins::MuJoCoROS2ControlPluginBase>> plugin_loader_ =
413 std::vector<std::shared_ptr<mujoco_ros2_control_plugins::MuJoCoROS2ControlPluginBase>> plugin_instances_;
415 std::vector<FTSensorData> ft_sensor_data_;
416 std::vector<IMUSensorData> imu_sensor_data_;
418 bool override_mujoco_actuator_positions_{
false };
419 bool override_urdf_joint_positions_{
false };
422 rclcpp::CallbackGroup::SharedPtr reset_world_cb_group_;
423 rclcpp::Service<mujoco_ros2_control_msgs::srv::ResetWorld>::SharedPtr reset_world_service_;
426 rclcpp::CallbackGroup::SharedPtr set_pause_cb_group_;
427 rclcpp::Service<mujoco_ros2_control_msgs::srv::SetPause>::SharedPtr set_pause_service_;
430 rclcpp::CallbackGroup::SharedPtr step_simulation_cb_group_;
431 rclcpp::Service<mujoco_ros2_control_msgs::srv::StepSimulation>::SharedPtr step_simulation_service_;
434 std::atomic<uint32_t> pending_steps_{ 0 };
435 std::atomic<bool> step_diverged_{
false };
436 std::atomic<bool> steps_interrupted_{
false };
437 std::atomic<bool> keyboard_step_requested_{
false };
438 std::atomic<uint64_t> step_count_{ 0 };
439 std::mutex steps_cv_mutex_;
440 std::condition_variable steps_cv_;
443 std::vector<mjtNum> initial_qpos_;
444 std::vector<mjtNum> initial_qvel_;
445 std::vector<mjtNum> initial_ctrl_;
446 std::string initial_keyframe_ =
"";