Skip to content

Commit 44eaf99

Browse files
committed
rviz: catch + display invalid-robot-model exception
1 parent 10f6b7a commit 44eaf99

File tree

5 files changed

+39
-24
lines changed

5 files changed

+39
-24
lines changed

visualization/motion_planning_tasks/src/remote_task_model.cpp

Lines changed: 6 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -422,17 +422,13 @@ DisplaySolutionPtr RemoteTaskModel::getSolution(const QModelIndex& index) {
422422
// request solution via service
423423
moveit_task_constructor_msgs::GetSolution srv;
424424
srv.request.solution_id = id;
425-
try {
426-
if (get_solution_client_.call(srv)) {
427-
id_to_solution_[id] = result = processSolutionMessage(srv.response.solution);
428-
return result;
429-
} else { // on failure mark remote task as destroyed: don't retrieve more solutions
430-
get_solution_client_.shutdown();
431-
flags_ |= IS_DESTROYED;
432-
}
433-
} catch (const std::exception& e) {
434-
ROS_ERROR("exception: %s", e.what());
425+
if (get_solution_client_.call(srv)) {
426+
id_to_solution_[id] = result = processSolutionMessage(srv.response.solution);
427+
return result;
435428
}
429+
// on failure mark remote task as destroyed: don't retrieve more solutions
430+
get_solution_client_.shutdown();
431+
flags_ |= IS_DESTROYED;
436432
}
437433
return result;
438434
}

visualization/motion_planning_tasks/src/task_display.cpp

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -216,10 +216,16 @@ void TaskDisplay::taskStatisticsCB(const moveit_task_constructor_msgs::TaskStati
216216

217217
void TaskDisplay::taskSolutionCB(const moveit_task_constructor_msgs::SolutionConstPtr& msg) {
218218
setStatus(rviz::StatusProperty::Ok, "Task Monitor", "OK");
219-
const DisplaySolutionPtr& s = task_list_model_->processSolutionMessage(*msg);
220-
if (s)
221-
trajectory_visual_->showTrajectory(s, false);
222-
return;
219+
try {
220+
const DisplaySolutionPtr& s = task_list_model_->processSolutionMessage(*msg);
221+
if (s)
222+
trajectory_visual_->showTrajectory(s, false);
223+
else
224+
setSolutionStatus(false);
225+
} catch (const std::invalid_argument& e) {
226+
ROS_ERROR_STREAM(e.what());
227+
setSolutionStatus(false, e.what());
228+
}
223229
}
224230

225231
void TaskDisplay::changedTaskSolutionTopic() {
@@ -249,11 +255,11 @@ void TaskDisplay::changedTaskSolutionTopic() {
249255
setStatus(rviz::StatusProperty::Warn, "Task Monitor", "No messages received");
250256
}
251257

252-
void TaskDisplay::setSolutionStatus(bool ok) {
258+
void TaskDisplay::setSolutionStatus(bool ok, const char* msg) {
253259
if (ok)
254260
setStatus(rviz::StatusProperty::Ok, "Solution", "Ok");
255261
else
256-
setStatus(rviz::StatusProperty::Warn, "Solution", "Retrieval failed");
262+
setStatus(rviz::StatusProperty::Warn, "Solution", msg ? msg : "Retrieval failed");
257263
}
258264

259265
void TaskDisplay::onTasksInserted(const QModelIndex& parent, int first, int last) {

visualization/motion_planning_tasks/src/task_display.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,7 @@ class TaskDisplay : public rviz::Display
8585
void load(const rviz::Config& config) override;
8686

8787
void setName(const QString& name) override;
88-
void setSolutionStatus(bool ok);
88+
void setSolutionStatus(bool ok, const char* msg = "");
8989

9090
TaskListModel& getTaskListModel() { return *task_list_model_; }
9191
TaskSolutionVisualization* visualization() const { return trajectory_visual_.get(); }

visualization/motion_planning_tasks/src/task_panel.cpp

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -483,8 +483,14 @@ void TaskView::onCurrentSolutionChanged(const QModelIndex& current, const QModel
483483
Q_ASSERT(task);
484484

485485
TaskSolutionVisualization* vis = display->visualization();
486-
const DisplaySolutionPtr& solution = task->getSolution(current);
487-
display->setSolutionStatus(bool(solution));
486+
DisplaySolutionPtr solution;
487+
try {
488+
solution = task->getSolution(current);
489+
display->setSolutionStatus(bool(solution));
490+
} catch (const std::invalid_argument& e) {
491+
ROS_ERROR_STREAM(e.what());
492+
display->setSolutionStatus(false, e.what());
493+
}
488494
vis->interruptCurrentDisplay();
489495
vis->showTrajectory(solution, true);
490496
}
@@ -500,8 +506,14 @@ void TaskView::onSolutionSelectionChanged(const QItemSelection& selected, const
500506

501507
display->clearMarkers();
502508
for (const auto& index : selected_rows) {
503-
const DisplaySolutionPtr& solution = task->getSolution(index);
504-
display->setSolutionStatus(bool(solution));
509+
DisplaySolutionPtr solution;
510+
try {
511+
solution = task->getSolution(index);
512+
display->setSolutionStatus(bool(solution));
513+
} catch (const std::invalid_argument& e) {
514+
ROS_ERROR_STREAM(e.what());
515+
display->setSolutionStatus(false, e.what());
516+
}
505517
display->addMarkers(solution);
506518
}
507519
}

visualization/visualization_tools/src/display_solution.cpp

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@
3939
#include <moveit/planning_scene/planning_scene.h>
4040
#include <moveit/robot_trajectory/robot_trajectory.h>
4141
#include <ros/console.h>
42+
#include <boost/format.hpp>
4243

4344
namespace moveit_rviz_plugin {
4445

@@ -88,9 +89,9 @@ const MarkerVisualizationPtr DisplaySolution::markers(const DisplaySolution::Ind
8889
void DisplaySolution::setFromMessage(const planning_scene::PlanningScenePtr& start_scene,
8990
const moveit_task_constructor_msgs::Solution& msg) {
9091
if (msg.start_scene.robot_model_name != start_scene->getRobotModel()->getName()) {
91-
ROS_ERROR("Solution for model '%s' but model '%s' was expected", msg.start_scene.robot_model_name.c_str(),
92-
start_scene->getRobotModel()->getName().c_str());
93-
throw std::runtime_error("invalid robot model");
92+
static boost::format fmt("Solution for model '%s' but model '%s' was expected");
93+
fmt % msg.start_scene.robot_model_name.c_str() % start_scene->getRobotModel()->getName().c_str();
94+
throw std::invalid_argument(fmt.str());
9495
}
9596

9697
// initialize parent scene from solution's start scene

0 commit comments

Comments
 (0)