110 const std::string & child_frame_id,
const std::string & frame_id)
113 getLogger(),
"[CpObjectTrackerTf] updateAndGetGlobalPose('%s', '%s')", child_frame_id.c_str(),
120 detectedObject = &
object->second;
122 getLogger(),
"[CpObjectTrackerTf] tracking existing object: %s", child_frame_id.c_str());
129 getLogger(),
"[CpObjectTrackerTf] tracking new object: %s", child_frame_id.c_str());
132 if (
tfBuffer_->canTransform(frame_id, child_frame_id, rclcpp::Time(0)))
134 geometry_msgs::msg::PoseStamped pose;
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;
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));
150 getLogger(),
"[CpObjectTrackerTf] updateAndGetGlobalPose('%s', '%s') historical poses: %ld",
151 child_frame_id.c_str(), frame_id.c_str(), historicalPoses_.size());
153 const size_t MAX_HISTORY = 512;
154 if (historicalPoses_.size() > MAX_HISTORY)
158 "[CpObjectTrackerTf] updateAndGetGlobalPose('%s', '%s') historical poses, popping oldest "
160 child_frame_id.c_str(), frame_id.c_str());
161 historicalPoses_.erase(historicalPoses_.begin());
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);
171 "[CpObjectTrackerTf] updateAndGetGlobalPose('%s', '%s') -presort- historical poses: %ld",
172 child_frame_id.c_str(), frame_id.c_str(), historicalPoses_.size());
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; });
182 "[CpObjectTrackerTf] updateAndGetGlobalPose('%s', '%s')- presort- historical poses: %ld",
183 child_frame_id.c_str(), frame_id.c_str(), historicalPoses_.size());
185 geometry_msgs::msg::PoseStamped medianPose;
186 medianPose.pose.position.x = historicalPoses_[historicalPoses_.size() / 2].pose.position.x;
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; });
194 medianPose.pose.position.y = historicalPoses_[historicalPoses_.size() / 2].pose.position.y;
195 medianPose.header = pose.header;
201 "[CpObjectTrackerTf] updateAndGetGlobalPose('%s', '%s') filtered pose [%ld samples]: %f, "
203 child_frame_id.c_str(), frame_id.c_str(), detectedObject->
historicalPoses_.size(),
206 tf2::getYaw(detectedObject->
filtered_pose->pose.orientation));
213 getLogger(),
"[CpObjectTrackerTf] updateAndGetGlobalPose('%s', '%s') failed",
214 child_frame_id.c_str(), frame_id.c_str());