133 bool initialize(rclcpp::Node::SharedPtr node,
const std::string& model_path,
const std::string& mujoco_model_topic,
134 double sim_speed_factor,
bool headless);
205 bool set_free_joint_states(
const std::vector<mujoco_ros2_control_msgs::msg::FreeJointState>& free_joints,
206 std::string& error_message);
261 std::vector<mjtNum> qpos;
262 std::vector<mjtNum> qvel;
263 std::vector<mjtNum> act;
264 std::vector<mjtNum> qfrc_actuator;
265 std::vector<mjtNum> sensordata;
266 std::vector<mjtNum> ctrl;
297 RCLCPP_WARN_EXPRESSION(logger_, sim_mutex_ ==
nullptr,
"Sim recursive mutex is still nullptr");
308 return step_count_.load();
317 void apply_staged_control_inputs();
325 void publish_control_state();
334 void refresh_data_snapshot();
344 void publish_clock();
349 void update_sim_display();
361 void reset_world_state(
bool fill_initial_state,
const mujoco_ros2_control_msgs::msg::SimulationState& state_overrides);
370 int frame_body_id(
const std::string& frame_id)
const;
378 bool validate_frame_id(
const std::string& frame_id,
const std::string& field_label, std::string& error_message)
const;
383 int find_free_joint_id(
int body_id)
const;
393 bool validate_free_joint_states(
const std::vector<mujoco_ros2_control_msgs::msg::FreeJointState>& free_joints,
394 std::string& error_message);
404 void apply_free_joint_states(
const std::vector<mujoco_ros2_control_msgs::msg::FreeJointState>& free_joints);
416 bool validate_joint_state_overrides(
const sensor_msgs::msg::JointState& joint_state, std::string& error_message);
424 void apply_joint_state_overrides(
const sensor_msgs::msg::JointState& joint_state);
427 void reset_world_callback(
const std::shared_ptr<mujoco_ros2_control_msgs::srv::ResetWorld::Request> request,
428 std::shared_ptr<mujoco_ros2_control_msgs::srv::ResetWorld::Response> response);
429 void set_pause_callback(
const std::shared_ptr<mujoco_ros2_control_msgs::srv::SetPause::Request> request,
430 std::shared_ptr<mujoco_ros2_control_msgs::srv::SetPause::Response> response);
431 void step_simulation_callback(
const std::shared_ptr<mujoco_ros2_control_msgs::srv::StepSimulation::Request> request,
432 std::shared_ptr<mujoco_ros2_control_msgs::srv::StepSimulation::Response> response);
434 set_free_joint_state_callback(
const std::shared_ptr<mujoco_ros2_control_msgs::srv::SetFreeJointState::Request> request,
435 std::shared_ptr<mujoco_ros2_control_msgs::srv::SetFreeJointState::Response> response);
437 rclcpp::Logger get_logger()
const
443 rclcpp::Logger logger_ = rclcpp::get_logger(
"MujocoSimulation");
446 rclcpp::Node::SharedPtr node_;
449 std::string model_path_;
450 std::string mujoco_model_topic_;
454 mjModel* mj_model_{
nullptr };
458 mjData* mj_data_{
nullptr };
465 mjData* snapshot_write_{
nullptr };
466 mjData* snapshot_read_{
nullptr };
467 bool snapshot_ready_{
false };
470 std::vector<mjtNum> ctrl_staged_;
471 std::vector<mjtNum> qfrc_applied_staged_;
475 bool control_inputs_staged_{
false };
479 std::vector<mjtNum> xfrc_plugin_desired_;
480 std::vector<mjtNum> xfrc_viewer_capture_;
481 std::vector<mjtNum> xfrc_last_written_;
486 std::vector<mjtNum> qvel_override_staged_;
490 std::mutex data_exchange_mutex_;
495 std::atomic<bool> snapshot_refresh_requested_{
true };
503 std::mutex control_staging_mutex_;
509 ControlState control_state_;
510 std::mutex control_state_mutex_;
519 double sim_speed_factor_{ -1.0 };
522 bool headless_{
false };
525 std::unique_ptr<mujoco::Simulate> sim_;
528 std::thread physics_thread_;
529 std::thread ui_thread_;
532 std::shared_ptr<rclcpp::Publisher<rosgraph_msgs::msg::Clock>> clock_publisher_;
540 std::recursive_mutex* sim_mutex_{
nullptr };
543 rclcpp::CallbackGroup::SharedPtr reset_world_cb_group_;
544 rclcpp::Service<mujoco_ros2_control_msgs::srv::ResetWorld>::SharedPtr reset_world_service_;
547 rclcpp::CallbackGroup::SharedPtr set_pause_cb_group_;
548 rclcpp::Service<mujoco_ros2_control_msgs::srv::SetPause>::SharedPtr set_pause_service_;
551 rclcpp::CallbackGroup::SharedPtr step_simulation_cb_group_;
552 rclcpp::Service<mujoco_ros2_control_msgs::srv::StepSimulation>::SharedPtr step_simulation_service_;
555 rclcpp::CallbackGroup::SharedPtr set_free_joint_state_cb_group_;
556 rclcpp::Service<mujoco_ros2_control_msgs::srv::SetFreeJointState>::SharedPtr set_free_joint_state_service_;
559 std::atomic<uint32_t> pending_steps_{ 0 };
560 std::atomic<bool> step_diverged_{
false };
561 std::atomic<bool> steps_interrupted_{
false };
562 std::atomic<bool> keyboard_step_requested_{
false };
563 std::atomic<uint64_t> step_count_{ 0 };
564 std::mutex steps_cv_mutex_;
565 std::condition_variable steps_cv_;
568 std::vector<mjtNum> initial_qpos_;
569 std::vector<mjtNum> initial_qvel_;
570 std::vector<mjtNum> initial_ctrl_;