94 bool initialize(rclcpp::Node::SharedPtr node,
const std::string& model_path,
const std::string& mujoco_model_topic,
95 double sim_speed_factor,
bool headless);
149 return mj_data_control_;
157 RCLCPP_WARN_EXPRESSION(logger_, sim_mutex_ ==
nullptr,
"Sim recursive mutex is still nullptr");
168 return xfrc_plugin_desired_;
186 void publish_clock();
191 void update_sim_display();
194 void reset_world_callback(
const std::shared_ptr<mujoco_ros2_control_msgs::srv::ResetWorld::Request> request,
195 std::shared_ptr<mujoco_ros2_control_msgs::srv::ResetWorld::Response> response);
196 void set_pause_callback(
const std::shared_ptr<mujoco_ros2_control_msgs::srv::SetPause::Request> request,
197 std::shared_ptr<mujoco_ros2_control_msgs::srv::SetPause::Response> response);
198 void step_simulation_callback(
const std::shared_ptr<mujoco_ros2_control_msgs::srv::StepSimulation::Request> request,
199 std::shared_ptr<mujoco_ros2_control_msgs::srv::StepSimulation::Response> response);
201 rclcpp::Logger get_logger()
const
207 rclcpp::Logger logger_ = rclcpp::get_logger(
"MujocoSimulation");
210 rclcpp::Node::SharedPtr node_;
213 std::string model_path_;
214 std::string mujoco_model_topic_;
217 mjModel* mj_model_{
nullptr };
218 mjData* mj_data_{
nullptr };
221 mjData* mj_data_control_{
nullptr };
235 std::vector<mjtNum> xfrc_viewer_capture_;
236 std::vector<mjtNum> xfrc_plugin_desired_;
241 std::vector<mjtNum> xfrc_last_restore_;
250 double sim_speed_factor_{ -1.0 };
253 bool headless_{
false };
256 std::unique_ptr<mujoco::Simulate> sim_;
259 std::thread physics_thread_;
260 std::thread ui_thread_;
263 std::shared_ptr<rclcpp::Publisher<rosgraph_msgs::msg::Clock>> clock_publisher_;
271 std::recursive_mutex* sim_mutex_{
nullptr };
274 rclcpp::CallbackGroup::SharedPtr reset_world_cb_group_;
275 rclcpp::Service<mujoco_ros2_control_msgs::srv::ResetWorld>::SharedPtr reset_world_service_;
278 rclcpp::CallbackGroup::SharedPtr set_pause_cb_group_;
279 rclcpp::Service<mujoco_ros2_control_msgs::srv::SetPause>::SharedPtr set_pause_service_;
282 rclcpp::CallbackGroup::SharedPtr step_simulation_cb_group_;
283 rclcpp::Service<mujoco_ros2_control_msgs::srv::StepSimulation>::SharedPtr step_simulation_service_;
286 std::atomic<uint32_t> pending_steps_{ 0 };
287 std::atomic<bool> step_diverged_{
false };
288 std::atomic<bool> steps_interrupted_{
false };
289 std::atomic<bool> keyboard_step_requested_{
false };
290 std::atomic<uint64_t> step_count_{ 0 };
291 std::mutex steps_cv_mutex_;
292 std::condition_variable steps_cv_;
295 std::vector<mjtNum> initial_qpos_;
296 std::vector<mjtNum> initial_qvel_;
297 std::vector<mjtNum> initial_ctrl_;
bool initialize(rclcpp::Node::SharedPtr node, const std::string &model_path, const std::string &mujoco_model_topic, double sim_speed_factor, bool headless)
Construct the Simulate application and start the UI thread (if not headless).
Definition mujoco_simulation.cpp:486