Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions src/camp/ros/ros_widget.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ ROSWidget::ROSWidget(QWidget *parent)

}

QGeoCoordinate ROSWidget::getGeoCoordinate(const geometry_msgs::msg::Pose &pose, const std_msgs::msg::Header &header)
QGeoCoordinate ROSWidget::getGeoCoordinate(const geometry_msgs::msg::Pose &pose, const std_msgs::msg::Header &header, double timeout_sec)
{
if(header.frame_id.empty())
return {};
Expand All @@ -23,7 +23,7 @@ QGeoCoordinate ROSWidget::getGeoCoordinate(const geometry_msgs::msg::Pose &pose,
geometry_msgs::msg::PoseStamped ecef;
try
{
ecef = transform_buffer_->transform(ps, "earth", tf2::durationFromSec(1.5));
ecef = transform_buffer_->transform(ps, "earth", tf2::durationFromSec(timeout_sec));
}
catch (const tf2::TransformException &)
{
Expand All @@ -37,7 +37,7 @@ QGeoCoordinate ROSWidget::getGeoCoordinate(const geometry_msgs::msg::Pose &pose,
{
ps.header.stamp.sec = 0;
ps.header.stamp.nanosec = 0;
ecef = transform_buffer_->transform(ps, "earth", tf2::durationFromSec(1.5));
ecef = transform_buffer_->transform(ps, "earth", tf2::durationFromSec(timeout_sec));
}
catch (const tf2::TransformException &ex)
{
Expand Down
6 changes: 5 additions & 1 deletion src/camp/ros/ros_widget.h
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,11 @@ class ROSWidget: public ROSClient<QWidget>
ROSWidget(QWidget *parent = nullptr);

protected:
QGeoCoordinate getGeoCoordinate(const geometry_msgs::msg::Pose &pose, const std_msgs::msg::Header &header);
// timeout_sec bounds the TF wait. The default keeps the original blocking
// behaviour for existing callers; pass 0.0 for a non-blocking lookup (e.g. on
// the GUI thread in a per-frame loop, where a 1.5 s block per pose freezes the
// UI — see camp#136).
QGeoCoordinate getGeoCoordinate(const geometry_msgs::msg::Pose &pose, const std_msgs::msg::Header &header, double timeout_sec = 1.5);


};
Expand Down
7 changes: 6 additions & 1 deletion src/camp/running_tasks/running_tasks_overlay.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -72,10 +72,15 @@ void RunningTasksOverlay::rebuildItems(
// TaskInformation.poses is geometry_msgs/PoseStamped[] with per-pose headers.
// getGeoCoordinate transforms each to earth frame with stale-stamp retry,
// so the source frame (commonly map or earth) is handled transparently.
// Use a NON-BLOCKING lookup (0 s timeout): this runs on the GUI thread on
// every TaskFeedback rebuild, and the default 1.5 s blocking wait per pose
// freezes the whole UI when map->earth isn't yet available (camp#136). A
// pose that isn't transformable this cycle is simply skipped and reappears
// on the next rebuild once the (quasi-static) transform is available.
QList<QGeoCoordinate> geo_poses;
for (const auto& ps : task.poses)
{
QGeoCoordinate gc = getGeoCoordinate(ps.pose, ps.header);
QGeoCoordinate gc = getGeoCoordinate(ps.pose, ps.header, 0.0);
if (gc.isValid())
geo_poses.append(gc);
}
Expand Down
Loading