SMACC2
Loading...
Searching...
No Matches
cl_foundation_pose::CpObjectTrackerTf Class Reference

#include <cp_object_tracker_tf.hpp>

Inheritance diagram for cl_foundation_pose::CpObjectTrackerTf:
Inheritance graph
Collaboration diagram for cl_foundation_pose::CpObjectTrackerTf:
Collaboration graph

Public Member Functions

 CpObjectTrackerTf (std::string global_frame_id="map")
 
void setEnabled (bool enabled)
 
bool isEnabled ()
 
void resetPoseEstimation ()
 
void update () override
 
void onInitialize ()
 
std::optional< geometry_msgs::msg::PoseStamped > updateAndGetGlobalPose (const std::string &child_frame_id, const std::string &frame_id)
 
- Public Member Functions inherited from smacc2::ISmaccComponent
 ISmaccComponent ()
 
virtual ~ISmaccComponent ()
 
virtual std::string getName () const
 
- Public Member Functions inherited from smacc2::ISmaccUpdatable
 ISmaccUpdatable ()
 
 ISmaccUpdatable (rclcpp::Duration duration)
 
void executeUpdate (rclcpp::Node::SharedPtr node)
 
void setUpdatePeriod (rclcpp::Duration duration)
 

Private Attributes

std::shared_ptr< tf2_ros::Buffer > tfBuffer_
 
std::shared_ptr< tf2_ros::TransformListener > tfListener_
 
std::shared_ptr< tf2_ros::TransformBroadcaster > tfBroadcaster_
 
std::string global_frame_id_
 
bool enabled_ = false
 
std::map< std::string, DetectedObjectdetectedObjects
 
std::mutex m_mutex_
 

Additional Inherited Members

- Protected Member Functions inherited from smacc2::ISmaccComponent
template<typename TOrthogonal , typename TClient >
void onComponentInitialization ()
 
template<typename EventType >
void postEvent (const EventType &ev)
 
template<typename EventType >
void postEvent ()
 
template<typename TOrthogonal , typename TSourceObject >
void onStateOrthogonalAllocation ()
 
template<typename TComponent >
void requiresComponent (TComponent *&requiredComponentStorage, ComponentRequirement requirementType=ComponentRequirement::SOFT)
 
template<typename TComponent >
void requiresComponent (std::string name, TComponent *&requiredComponentStorage, ComponentRequirement requirementType=ComponentRequirement::SOFT)
 
template<typename TClient >
void requiresClient (TClient *&requiredClientStorage)
 
template<typename SmaccComponentType , typename TOrthogonal , typename TClient , typename... TArgs>
SmaccComponentType * createSiblingComponent (TArgs... targs)
 
template<typename SmaccComponentType , typename TOrthogonal , typename TClient , typename... TArgs>
SmaccComponentType * createSiblingNamedComponent (std::string name, TArgs... targs)
 
rclcpp::Node::SharedPtr getNode ()
 
rclcpp::Logger getLogger () const
 
ISmaccStateMachinegetStateMachine ()
 
- Protected Member Functions inherited from smacc2::ISmaccUpdatable
- Protected Attributes inherited from smacc2::ISmaccComponent
ISmaccStateMachinestateMachine_
 
ISmaccClientowner_
 

Detailed Description

Definition at line 30 of file cp_object_tracker_tf.hpp.

Constructor & Destructor Documentation

◆ CpObjectTrackerTf()

cl_foundation_pose::CpObjectTrackerTf::CpObjectTrackerTf ( std::string global_frame_id = "map")
inline

Definition at line 45 of file cp_object_tracker_tf.hpp.

45: global_frame_id_(global_frame_id) {}

Member Function Documentation

◆ isEnabled()

bool cl_foundation_pose::CpObjectTrackerTf::isEnabled ( )
inline

Definition at line 53 of file cp_object_tracker_tf.hpp.

References enabled_.

Referenced by cl_foundation_pose::CbTrackObjectPose::update().

Here is the caller graph for this function:

◆ onInitialize()

void cl_foundation_pose::CpObjectTrackerTf::onInitialize ( )
inlinevirtual

Reimplemented from smacc2::ISmaccComponent.

Definition at line 102 of file cp_object_tracker_tf.hpp.

103 {
104 tfBuffer_ = std::make_shared<tf2_ros::Buffer>(this->getNode()->get_clock());
105 tfListener_ = std::make_shared<tf2_ros::TransformListener>(*tfBuffer_);
106 tfBroadcaster_ = std::make_shared<tf2_ros::TransformBroadcaster>(this->getNode());
107 }
std::shared_ptr< tf2_ros::TransformBroadcaster > tfBroadcaster_
std::shared_ptr< tf2_ros::Buffer > tfBuffer_
std::shared_ptr< tf2_ros::TransformListener > tfListener_
rclcpp::Node::SharedPtr getNode()

References smacc2::ISmaccComponent::getNode(), tfBroadcaster_, tfBuffer_, and tfListener_.

Here is the call graph for this function:

◆ resetPoseEstimation()

void cl_foundation_pose::CpObjectTrackerTf::resetPoseEstimation ( )
inline

Definition at line 55 of file cp_object_tracker_tf.hpp.

56 {
57 std::lock_guard<std::mutex> lock(m_mutex_);
58
59 RCLCPP_INFO(
60 getLogger(), "CpObjectTrackerTf::resetPoseEstimation() tracked objects: %ld",
61 detectedObjects.size());
62 for (auto & detectedObject : detectedObjects)
63 {
64 auto & detectedObjectInfo = detectedObject.second;
65 RCLCPP_INFO(
66 getLogger(), "CpObjectTrackerTf::resetPoseEstimation() tracking object: %s",
67 detectedObject.first.c_str());
68
69 detectedObjectInfo.filtered_pose.reset();
70 detectedObjectInfo.historicalPoses_.clear();
71 }
72 detectedObjects.clear();
73 }
std::map< std::string, DetectedObject > detectedObjects
rclcpp::Logger getLogger() const

References detectedObjects, smacc2::ISmaccComponent::getLogger(), and m_mutex_.

Referenced by setEnabled().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ setEnabled()

void cl_foundation_pose::CpObjectTrackerTf::setEnabled ( bool enabled)
inline

◆ update()

void cl_foundation_pose::CpObjectTrackerTf::update ( )
inlineoverridevirtual

Implements smacc2::ISmaccUpdatable.

Definition at line 75 of file cp_object_tracker_tf.hpp.

76 {
77 RCLCPP_INFO(
78 getLogger(), "CpObjectTrackerTf::update() tracked objects: %ld", detectedObjects.size());
79 std::lock_guard<std::mutex> lock(m_mutex_);
80
81 if (!enabled_) return;
82
83 RCLCPP_INFO(
84 getLogger(), "CpObjectTrackerTf::update() heartbeat, tracked objects: %ld",
85 detectedObjects.size());
86
87 // refresh tracked object poses
88 for (auto & detectedObject : detectedObjects)
89 {
90 RCLCPP_INFO(
91 getLogger(), "CpObjectTrackerTf::update() tracking object: %s",
92 detectedObject.first.c_str());
93
94 auto globalObjectPose = this->updateAndGetGlobalPose(detectedObject.first, global_frame_id_);
95 if (globalObjectPose)
96 {
97 detectedObject.second.filtered_pose = *globalObjectPose;
98 }
99 }
100 }
std::optional< geometry_msgs::msg::PoseStamped > updateAndGetGlobalPose(const std::string &child_frame_id, const std::string &frame_id)

References detectedObjects, enabled_, smacc2::ISmaccComponent::getLogger(), global_frame_id_, m_mutex_, and updateAndGetGlobalPose().

Here is the call graph for this function:

◆ updateAndGetGlobalPose()

std::optional< geometry_msgs::msg::PoseStamped > cl_foundation_pose::CpObjectTrackerTf::updateAndGetGlobalPose ( const std::string & child_frame_id,
const std::string & frame_id )
inline

Definition at line 109 of file cp_object_tracker_tf.hpp.

111 {
112 RCLCPP_INFO(
113 getLogger(), "[CpObjectTrackerTf] updateAndGetGlobalPose('%s', '%s')", child_frame_id.c_str(),
114 frame_id.c_str());
115 // check in database if the object is already tracked
116 auto object = detectedObjects.find(child_frame_id);
117 DetectedObject * detectedObject = nullptr;
118 if (object != detectedObjects.end()) // already tracked
119 {
120 detectedObject = &object->second;
121 RCLCPP_INFO(
122 getLogger(), "[CpObjectTrackerTf] tracking existing object: %s", child_frame_id.c_str());
123 }
124 else
125 {
126 detectedObjects[child_frame_id] = DetectedObject();
127 detectedObject = &detectedObjects[child_frame_id];
128 RCLCPP_INFO(
129 getLogger(), "[CpObjectTrackerTf] tracking new object: %s", child_frame_id.c_str());
130 }
131
132 if (tfBuffer_->canTransform(frame_id, child_frame_id, rclcpp::Time(0)))
133 {
134 geometry_msgs::msg::PoseStamped pose;
135
136 auto transformStamped = tfBuffer_->lookupTransform(frame_id, child_frame_id, rclcpp::Time(0));
137 pose.header = transformStamped.header;
138 pose.pose.position.x = transformStamped.transform.translation.x;
139 pose.pose.position.y = transformStamped.transform.translation.y;
140 pose.pose.position.z = transformStamped.transform.translation.z;
141 pose.pose.orientation = transformStamped.transform.rotation;
142
143 RCLCPP_INFO(
144 getLogger(), "[CpObjectTrackerTf] *updateAndGetGlobalPose('%s', '%s') pose: %f, %f, %f",
145 child_frame_id.c_str(), frame_id.c_str(), pose.pose.position.x, pose.pose.position.y,
146 tf2::getYaw(pose.pose.orientation));
147
148 auto & historicalPoses_ = detectedObject->historicalPoses_;
149 RCLCPP_INFO(
150 getLogger(), "[CpObjectTrackerTf] updateAndGetGlobalPose('%s', '%s') historical poses: %ld",
151 child_frame_id.c_str(), frame_id.c_str(), historicalPoses_.size());
152
153 const size_t MAX_HISTORY = 512;
154 if (historicalPoses_.size() > MAX_HISTORY)
155 {
156 RCLCPP_INFO(
157 getLogger(),
158 "[CpObjectTrackerTf] updateAndGetGlobalPose('%s', '%s') historical poses, popping oldest "
159 "pose",
160 child_frame_id.c_str(), frame_id.c_str());
161 historicalPoses_.erase(historicalPoses_.begin());
162 }
163 RCLCPP_INFO(
164 getLogger(),
165 "[CpObjectTrackerTf] updateAndGetGlobalPose('%s', '%s') historical poses, pushing new pose",
166 child_frame_id.c_str(), frame_id.c_str());
167 historicalPoses_.push_back(pose);
168
169 RCLCPP_INFO(
170 getLogger(),
171 "[CpObjectTrackerTf] updateAndGetGlobalPose('%s', '%s') -presort- historical poses: %ld",
172 child_frame_id.c_str(), frame_id.c_str(), historicalPoses_.size());
173
174 // compute median position in x
175 std::sort(
176 historicalPoses_.begin(), historicalPoses_.end(),
177 [](const geometry_msgs::msg::PoseStamped & a, const geometry_msgs::msg::PoseStamped & b)
178 { return a.pose.position.x < b.pose.position.x; });
179
180 RCLCPP_INFO(
181 getLogger(),
182 "[CpObjectTrackerTf] updateAndGetGlobalPose('%s', '%s')- presort- historical poses: %ld",
183 child_frame_id.c_str(), frame_id.c_str(), historicalPoses_.size());
184
185 geometry_msgs::msg::PoseStamped medianPose;
186 medianPose.pose.position.x = historicalPoses_[historicalPoses_.size() / 2].pose.position.x;
187
188 // compute median position in y
189 std::sort(
190 historicalPoses_.begin(), historicalPoses_.end(),
191 [](const geometry_msgs::msg::PoseStamped & a, const geometry_msgs::msg::PoseStamped & b)
192 { return a.pose.position.y < b.pose.position.y; });
193
194 medianPose.pose.position.y = historicalPoses_[historicalPoses_.size() / 2].pose.position.y;
195 medianPose.header = pose.header;
196
197 detectedObject->filtered_pose = medianPose;
198
199 RCLCPP_INFO(
200 getLogger(),
201 "[CpObjectTrackerTf] updateAndGetGlobalPose('%s', '%s') filtered pose [%ld samples]: %f, "
202 "%f, %f",
203 child_frame_id.c_str(), frame_id.c_str(), detectedObject->historicalPoses_.size(),
204 detectedObject->filtered_pose->pose.position.x,
205 detectedObject->filtered_pose->pose.position.y,
206 tf2::getYaw(detectedObject->filtered_pose->pose.orientation));
208
209 return detectedObject->filtered_pose;
210 }
211
212 RCLCPP_INFO(
213 getLogger(), "[CpObjectTrackerTf] updateAndGetGlobalPose('%s', '%s') failed",
214 child_frame_id.c_str(), frame_id.c_str());
215
216 return std::nullopt;
217 }

References detectedObjects, cl_foundation_pose::DetectedObject::filtered_pose, smacc2::ISmaccComponent::getLogger(), cl_foundation_pose::DetectedObject::historicalPoses_, smacc2::ISmaccComponent::postEvent(), and tfBuffer_.

Referenced by cl_foundation_pose::CbTrackObjectPose::onEntry(), cl_foundation_pose::CbTrackObjectPose::update(), and update().

Here is the call graph for this function:
Here is the caller graph for this function:

Member Data Documentation

◆ detectedObjects

std::map<std::string, DetectedObject> cl_foundation_pose::CpObjectTrackerTf::detectedObjects
private

Definition at line 41 of file cp_object_tracker_tf.hpp.

Referenced by resetPoseEstimation(), update(), and updateAndGetGlobalPose().

◆ enabled_

bool cl_foundation_pose::CpObjectTrackerTf::enabled_ = false
private

Definition at line 38 of file cp_object_tracker_tf.hpp.

Referenced by isEnabled(), setEnabled(), and update().

◆ global_frame_id_

std::string cl_foundation_pose::CpObjectTrackerTf::global_frame_id_
private

Definition at line 37 of file cp_object_tracker_tf.hpp.

Referenced by update().

◆ m_mutex_

std::mutex cl_foundation_pose::CpObjectTrackerTf::m_mutex_
private

Definition at line 42 of file cp_object_tracker_tf.hpp.

Referenced by resetPoseEstimation(), and update().

◆ tfBroadcaster_

std::shared_ptr<tf2_ros::TransformBroadcaster> cl_foundation_pose::CpObjectTrackerTf::tfBroadcaster_
private

Definition at line 35 of file cp_object_tracker_tf.hpp.

Referenced by onInitialize().

◆ tfBuffer_

std::shared_ptr<tf2_ros::Buffer> cl_foundation_pose::CpObjectTrackerTf::tfBuffer_
private

Definition at line 33 of file cp_object_tracker_tf.hpp.

Referenced by onInitialize(), and updateAndGetGlobalPose().

◆ tfListener_

std::shared_ptr<tf2_ros::TransformListener> cl_foundation_pose::CpObjectTrackerTf::tfListener_
private

Definition at line 34 of file cp_object_tracker_tf.hpp.

Referenced by onInitialize().


The documentation for this class was generated from the following file: