3 #include <cnoid/BodyItem>
4 #include <cnoid/DyBody>
5 #include <cnoid/ItemManager>
6 #include <cnoid/MessageView>
7 #include <cnoid/PutPropertyFunction>
8 #include <cnoid/RootItem>
10 #include <geometry_msgs/msg/pose_stamped.hpp>
11 #include <geometry_msgs/msg/transform_stamped.hpp>
12 #include <geometry_msgs/msg/twist_stamped.hpp>
24 rclcpp::init(argc, argv);
29 ext->itemManager().registerClass<
PosePublisherItem>(
"CnoidRosUtils::PosePublisherItem");
60 cnoid::Item::doPutProperties(putProperty);
67 [&](
const double & pub_rate)
69 pub_rate_ = std::min(std::max(pub_rate, 1e-1), 1e3);
84 archive.write(
"Velocity topic name (only for topic output)",
vel_topic_name_);
97 archive.read(
"Velocity topic name (only for topic output)",
vel_topic_name_);
108 world_ = this->findOwnerItem<cnoid::WorldItem>();
116 for(cnoid::Item * child =
world_->childItem(); child; child = child->nextItem())
118 cnoid::SimulatorItemPtr sim =
dynamic_cast<cnoid::SimulatorItem *
>(child);
119 if(sim && !sim->isRunning() && !
hooked_sims_.count(sim->name()))
131 sim_ = cnoid::SimulatorItem::findActiveSimulatorItemFor(
this);
134 cnoid::MessageView::instance()->putln(
"[PosePublisherItem] SimulatorItem not found", cnoid::MessageView::ERROR);
139 body_item_ = this->findOwnerItem<cnoid::BodyItem>();
142 cnoid::MessageView::instance()->putln(
"[PosePublisherItem] Owner BodyItem not found", cnoid::MessageView::ERROR);
147 nh_ = rclcpp::Node::make_shared(
"CnoidROSPlugin::PosePublisher");
194 cnoid::SimulationBody * sim_body =
sim_->findSimulationBody(
body_item_);
197 cnoid::MessageView::instance()->putln(
"[PosePublisherItem] SimulationBody not found", cnoid::MessageView::ERROR);
202 cnoid::DyLink * link =
nullptr;
205 link =
static_cast<cnoid::DyBody *
>(sim_body->body())->rootLink();
209 link =
static_cast<cnoid::DyBody *
>(sim_body->body())->link(
link_name_);
213 cnoid::MessageView::instance()->putln(
"[PosePublisherItem] Link " +
link_name_ +
" not found",
214 cnoid::MessageView::ERROR);
219 rclcpp::Time stamp_now =
nh_->now();
223 cnoid::Isometry3 pose = link->T();
229 tf_br_ = std::make_shared<tf2_ros::TransformBroadcaster>(
nh_);
232 geometry_msgs::msg::TransformStamped msg;
233 msg.header.stamp = stamp_now;
236 tf2::toMsg(pose.translation(), msg.transform.translation);
237 msg.transform.rotation = tf2::toMsg(Eigen::Quaterniond(pose.rotation()));
239 tf_br_->sendTransform(msg);
243 geometry_msgs::msg::PoseStamped pose_msg;
244 pose_msg.header.stamp = stamp_now;
246 pose_msg.pose = tf2::toMsg(pose);
249 geometry_msgs::msg::TwistStamped vel_msg;
250 vel_msg.header.stamp = stamp_now;
252 tf2::toMsg(link->v(), vel_msg.twist.linear);
253 tf2::toMsg(link->w(), vel_msg.twist.angular);
261 return std::max(
static_cast<int>(1.0 / (
pub_rate_ *
sim_->worldTimeStep())), 1);
Plugin item to publish topics and broadcast TF of pose and velocity of the model.
rclcpp::Publisher< geometry_msgs::msg::PoseStamped >::SharedPtr pose_pub_
cnoid::WorldItemPtr world_
std::set< std::string > hooked_sims_
std::string pose_topic_name_
virtual bool store(cnoid::Archive &archive) override
virtual void doPutProperties(cnoid::PutPropertyFunction &putProperty) override
virtual bool restore(const cnoid::Archive &archive) override
cnoid::BodyItem * body_item_
std::string tf_child_frame_id_
virtual cnoid::Item * doDuplicate() const override
rclcpp::Publisher< geometry_msgs::msg::TwistStamped >::SharedPtr vel_pub_
int post_dynamics_func_id_
static void initialize(cnoid::ExtensionManager *ext)
std::string vel_topic_name_
cnoid::SimulatorItemPtr sim_
rclcpp::Node::SharedPtr nh_
std::shared_ptr< tf2_ros::TransformBroadcaster > tf_br_