Skip to content

Commit 9e82f24

Browse files
authored
Merge pull request #34 from pucciland95/main
Possible to read robot_description from topic
2 parents 0c321c0 + 6ecc0b8 commit 9e82f24

File tree

6 files changed

+58
-20
lines changed

6 files changed

+58
-20
lines changed

mujoco_ros2_control/include/mujoco_ros2_control/mujoco_ros2_control.hpp

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
#define MUJOCO_ROS2_CONTROL__MUJOCO_ROS2_CONTROL_HPP_
2323

2424
#include <memory>
25+
#include <string>
2526

2627
#include "controller_manager/controller_manager.hpp"
2728
#include "pluginlib/class_loader.hpp"
@@ -44,15 +45,16 @@ class MujocoRos2Control
4445

4546
private:
4647
void publish_sim_time(rclcpp::Time sim_time);
47-
rclcpp::Node::SharedPtr node_; // TODO(sangteak601): delete node
48+
std::string get_robot_description();
49+
rclcpp::Node::SharedPtr node_;
4850
mjModel *mj_model_;
4951
mjData *mj_data_;
5052

5153
rclcpp::Logger logger_;
5254
std::shared_ptr<pluginlib::ClassLoader<MujocoSystemInterface>> robot_hw_sim_loader_;
5355

5456
std::shared_ptr<controller_manager::ControllerManager> controller_manager_;
55-
rclcpp::executors::MultiThreadedExecutor::SharedPtr cm_executor_;
57+
rclcpp::Executor::SharedPtr cm_executor_;
5658
std::thread cm_thread_;
5759
bool stop_cm_thread_;
5860
rclcpp::Duration control_period_;

mujoco_ros2_control/include/mujoco_ros2_control/mujoco_system.hpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -51,8 +51,8 @@ class MujocoSystem : public MujocoSystemInterface
5151
const rclcpp::Time &time, const rclcpp::Duration &period) override;
5252

5353
bool init_sim(
54-
rclcpp::Node::SharedPtr &node, mjModel *mujoco_model, mjData *mujoco_data,
55-
const urdf::Model &urdf_model, const hardware_interface::HardwareInfo &hardware_info) override;
54+
mjModel *mujoco_model, mjData *mujoco_data, const urdf::Model &urdf_model,
55+
const hardware_interface::HardwareInfo &hardware_info) override;
5656

5757
struct JointState
5858
{

mujoco_ros2_control/include/mujoco_ros2_control/mujoco_system_interface.hpp

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -34,11 +34,10 @@ class MujocoSystemInterface : public hardware_interface::SystemInterface
3434
{
3535
public:
3636
virtual bool init_sim(
37-
rclcpp::Node::SharedPtr &node, mjModel *mujoco_model, mjData *mujoco_data,
38-
const urdf::Model &urdf_model, const hardware_interface::HardwareInfo &hardware_info) = 0;
37+
mjModel *mujoco_model, mjData *mujoco_data, const urdf::Model &urdf_model,
38+
const hardware_interface::HardwareInfo &hardware_info) = 0;
3939

4040
protected:
41-
rclcpp::Node::SharedPtr node_; // TODO(sangteak601): need node?
4241
};
4342
} // namespace mujoco_ros2_control
4443

mujoco_ros2_control/src/mujoco_ros2_control.cpp

Lines changed: 43 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -42,19 +42,57 @@ MujocoRos2Control::~MujocoRos2Control()
4242
stop_cm_thread_ = true;
4343
cm_executor_->remove_node(controller_manager_);
4444
cm_executor_->cancel();
45-
cm_thread_.join();
45+
46+
if (cm_thread_.joinable()) cm_thread_.join();
47+
}
48+
49+
std::string MujocoRos2Control::get_robot_description()
50+
{
51+
// Getting robot description from parameter first. If not set trying from topic
52+
std::string robot_description;
53+
54+
auto node = std::make_shared<rclcpp::Node>(
55+
"robot_description_node",
56+
rclcpp::NodeOptions().automatically_declare_parameters_from_overrides(true));
57+
58+
if (node->has_parameter("robot_description"))
59+
{
60+
robot_description = node->get_parameter("robot_description").as_string();
61+
return robot_description;
62+
}
63+
64+
RCLCPP_WARN(
65+
logger_,
66+
"Failed to get robot_description from parameter. Will listen on the ~/robot_description "
67+
"topic...");
68+
69+
auto robot_description_sub = node->create_subscription<std_msgs::msg::String>(
70+
"robot_description", rclcpp::QoS(1).transient_local(),
71+
[&](const std_msgs::msg::String::SharedPtr msg)
72+
{
73+
if (!msg->data.empty() && robot_description.empty()) robot_description = msg->data;
74+
});
75+
76+
while (robot_description.empty() && rclcpp::ok())
77+
{
78+
rclcpp::spin_some(node);
79+
RCLCPP_INFO(node->get_logger(), "Waiting for robot description message");
80+
rclcpp::sleep_for(std::chrono::milliseconds(500));
81+
}
82+
83+
return robot_description;
4684
}
4785

4886
void MujocoRos2Control::init()
4987
{
5088
clock_publisher_ = node_->create_publisher<rosgraph_msgs::msg::Clock>("/clock", 10);
51-
// Read urdf from ros parameter server then
89+
90+
std::string urdf_string = this->get_robot_description();
91+
5292
// setup actuators and mechanism control node.
53-
std::string urdf_string;
5493
std::vector<hardware_interface::HardwareInfo> control_hardware_info;
5594
try
5695
{
57-
urdf_string = node_->get_parameter("robot_description").as_string();
5896
control_hardware_info = hardware_interface::parse_control_resources_from_urdf(urdf_string);
5997
}
6098
catch (const std::runtime_error &ex)
@@ -103,7 +141,7 @@ void MujocoRos2Control::init()
103141

104142
urdf::Model urdf_model;
105143
urdf_model.initString(urdf_string);
106-
if (!mujoco_system->init_sim(node_, mj_model_, mj_data_, urdf_model, hardware))
144+
if (!mujoco_system->init_sim(mj_model_, mj_data_, urdf_model, hardware))
107145
{
108146
RCLCPP_FATAL(logger_, "Could not initialize robot simulation interface");
109147
return;
@@ -122,7 +160,6 @@ void MujocoRos2Control::init()
122160
cm_executor_ = std::make_shared<rclcpp::executors::MultiThreadedExecutor>();
123161
controller_manager_ = std::make_shared<controller_manager::ControllerManager>(
124162
std::move(resource_manager), cm_executor_, "controller_manager", node_->get_namespace());
125-
126163
cm_executor_->add_node(controller_manager_);
127164

128165
if (!controller_manager_->has_parameter("update_rate"))

mujoco_ros2_control/src/mujoco_ros2_control_node.cpp

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -62,8 +62,9 @@ int main(int argc, const char **argv)
6262
mujoco_data = mj_makeData(mujoco_model);
6363

6464
// initialize mujoco control
65-
auto control = mujoco_ros2_control::MujocoRos2Control(node, mujoco_model, mujoco_data);
66-
control.init();
65+
auto mujoco_control = mujoco_ros2_control::MujocoRos2Control(node, mujoco_model, mujoco_data);
66+
67+
mujoco_control.init();
6768
RCLCPP_INFO_STREAM(
6869
node->get_logger(), "Mujoco ros2 controller has been successfully initialized !");
6970

@@ -90,7 +91,7 @@ int main(int argc, const char **argv)
9091
mjtNum simstart = mujoco_data->time;
9192
while (mujoco_data->time - simstart < 1.0 / 60.0)
9293
{
93-
control.update();
94+
mujoco_control.update();
9495
}
9596
rendering->update();
9697

mujoco_ros2_control/src/mujoco_system.cpp

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -138,14 +138,13 @@ hardware_interface::return_type MujocoSystem::write(
138138
}
139139

140140
bool MujocoSystem::init_sim(
141-
rclcpp::Node::SharedPtr &node, mjModel *mujoco_model, mjData *mujoco_data,
142-
const urdf::Model &urdf_model, const hardware_interface::HardwareInfo &hardware_info)
141+
mjModel *mujoco_model, mjData *mujoco_data, const urdf::Model &urdf_model,
142+
const hardware_interface::HardwareInfo &hardware_info)
143143
{
144-
node_ = node;
145144
mj_model_ = mujoco_model;
146145
mj_data_ = mujoco_data;
147146

148-
logger_ = rclcpp::get_logger(node_->get_name() + std::string("mujoco_system"));
147+
logger_ = rclcpp::get_logger("mujoco_system");
149148

150149
register_joints(urdf_model, hardware_info);
151150
register_sensors(urdf_model, hardware_info);

0 commit comments

Comments
 (0)