SMACC2
Loading...
Searching...
No Matches
cp_pose.cpp
Go to the documentation of this file.
1// Copyright 2021 RobosoftAI Inc.
2//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7// http://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14
15/*****************************************************************************************************************
16 *
17 * Authors: Pablo Inigo Blasco, Brett Aldrich
18 *
19 ******************************************************************************************************************/
20
22
23#include <memory>
24#include <string>
25
26namespace cl_nav2z
27{
28using namespace std::chrono_literals;
29
30// static
31std::shared_ptr<tf2_ros::TransformListener> Pose::tfListener_;
32std::shared_ptr<tf2_ros::Buffer> Pose::tfBuffer_;
33std::mutex Pose::listenerMutex_;
34
35Pose::Pose(std::string targetFrame, std::string referenceFrame)
36: isInitialized(false), poseFrameName_(targetFrame), referenceFrame_(referenceFrame)
37
38{
39 this->pose_.header.frame_id = referenceFrame_;
40}
41
43{
44 switch (referenceFrame)
45 {
47 return "map";
49 return "odom";
50 default:
51 return "odom";
52 }
53}
54
56: Pose("base_link", referenceFrameToString(referenceFrame))
57{
58}
59
61{
62 RCLCPP_INFO(
63 getLogger(), "[Pose] Creating Pose tracker component to track %s in the reference frame %s",
64 poseFrameName_.c_str(), referenceFrame_.c_str());
65
66 {
67 // singleton
68 std::lock_guard<std::mutex> guard(listenerMutex_);
69 if (tfListener_ == nullptr)
70 {
71 tfBuffer_ = std::make_shared<tf2_ros::Buffer>(getNode()->get_clock());
72 tfListener_ = std::make_shared<tf2_ros::TransformListener>(*tfBuffer_);
73 }
74 }
75}
76
77void Pose::waitTransformUpdate(rclcpp::Rate r)
78{
79 bool found = false;
80 RCLCPP_INFO(getLogger(), "[Pose Component] waitTransformUpdate");
81 while (rclcpp::ok() && !found)
82 {
83 tf2::Stamped<tf2::Transform> transform;
84 try
85 {
86 {
87 RCLCPP_INFO_THROTTLE(
88 getLogger(), *(getNode()->get_clock()), 1000,
89 "[Pose Component] waiting transform %s -> %s", referenceFrame_.c_str(),
90 poseFrameName_.c_str());
91 std::lock_guard<std::mutex> lock(listenerMutex_);
92 auto transformstamped =
93 tfBuffer_->lookupTransform(referenceFrame_, poseFrameName_, getNode()->now());
94 tf2::fromMsg(transformstamped, transform);
95 }
96
97 {
98 std::lock_guard<std::mutex> guard(m_mutex_);
99 tf2::toMsg(transform, this->pose_.pose);
100 this->pose_.header.stamp = tf2_ros::toRclcpp(transform.stamp_);
101 this->pose_.header.frame_id = referenceFrame_;
102 found = true;
103 this->isInitialized = true;
104 }
105 }
106 catch (tf2::TransformException & ex)
107 {
108 RCLCPP_ERROR_STREAM_THROTTLE(
109 getLogger(), *(getNode()->get_clock()), 1000,
110 "[Component pose] (" << poseFrameName_ << "/[" << referenceFrame_
111 << "] ) is failing on pose update : " << ex.what());
112 }
113
114 r.sleep();
115 }
116 RCLCPP_INFO(getLogger(), "[Pose Component] waitTransformUpdate -> pose found!");
117}
118
119float Pose::getYaw() { return tf2::getYaw(pose_.pose.orientation); }
120
121float Pose::getX() { return pose_.pose.position.x; }
122float Pose::getY() { return pose_.pose.position.y; }
123float Pose::getZ() { return pose_.pose.position.z; }
124
126{
127 tf2::Stamped<tf2::Transform> transform;
128 try
129 {
131 {
132 std::lock_guard<std::mutex> lock(listenerMutex_);
133 RCLCPP_INFO(
134 getLogger(), "[pose] looking up transform: %s -> %s", referenceFrame_.c_str(),
135 poseFrameName_.c_str());
136 auto transformstamped =
137 tfBuffer_->lookupTransform(referenceFrame_, poseFrameName_, rclcpp::Time(0));
138 tf2::fromMsg(transformstamped, transform);
139 RCLCPP_INFO(getLogger(), "[pose] transform found");
140 }
141 else
142 {
143 RCLCPP_INFO(
144 getLogger(), "[pose] looking up transform: %s -> %s", referenceFrame_.c_str(),
145 poseFrameName_.c_str());
146 auto transformstamped = tfBuffer_->lookupTransform(
148 referenceFrame_, 1s);
149 tf2::fromMsg(transformstamped, transform);
150 RCLCPP_INFO(getLogger(), "[pose] transform found");
151 }
152
153 {
154 std::lock_guard<std::mutex> guard(m_mutex_);
155 tf2::toMsg(transform, this->pose_.pose);
156 this->pose_.header.stamp = tf2_ros::toRclcpp(transform.stamp_);
157 this->pose_.header.frame_id = referenceFrame_;
158 this->isInitialized = true;
159 }
160 }
161 catch (tf2::TransformException & ex)
162 {
163 // RCLCPP_DEBUG(getLogger(), "[pose] EXCEPTION");
164 RCLCPP_ERROR_STREAM_THROTTLE(
165 getLogger(), *(getNode()->get_clock()), 1000,
166 "[Component pose] (" << poseFrameName_ << "/[" << referenceFrame_
167 << "] ) is failing on pose update : " << ex.what());
168 }
169}
170} // namespace cl_nav2z
static std::mutex listenerMutex_
Definition cp_pose.hpp:99
static std::shared_ptr< tf2_ros::Buffer > tfBuffer_
Definition cp_pose.hpp:96
void update() override
Definition cp_pose.cpp:125
static std::shared_ptr< tf2_ros::TransformListener > tfListener_
Definition cp_pose.hpp:97
std::mutex m_mutex_
Definition cp_pose.hpp:104
float getYaw()
Definition cp_pose.cpp:119
Pose(std::string poseFrameName="base_link", std::string referenceFrame="odom")
Definition cp_pose.cpp:35
void onInitialize() override
Definition cp_pose.cpp:60
bool isInitialized
Definition cp_pose.hpp:83
std::string referenceFrame_
Definition cp_pose.hpp:102
std::optional< rclcpp::Time > frozenReferenceFrameTime
Definition cp_pose.hpp:85
void waitTransformUpdate(rclcpp::Rate r=rclcpp::Rate(20))
Definition cp_pose.cpp:77
geometry_msgs::msg::PoseStamped pose_
Definition cp_pose.hpp:94
std::string poseFrameName_
Definition cp_pose.hpp:101
rclcpp::Logger getLogger() const
rclcpp::Node::SharedPtr getNode()
StandardReferenceFrames
Definition cp_pose.hpp:38
std::string referenceFrameToString(StandardReferenceFrames referenceFrame)
Definition cp_pose.cpp:42