80 ,
ui_(new
Ui::MotionPlanningUI())
84 auto ros_node_abstraction =
context_->getRosNodeAbstraction().lock();
85 if (!ros_node_abstraction)
87 RCLCPP_INFO(logger_,
"Unable to lock weak_ptr from DisplayContext in MotionPlanningFrame constructor");
90 node_ = ros_node_abstraction->get_raw_node();
93 if (!node_->has_parameter(
"warehouse_host"))
94 node_->declare_parameter<std::string>(
"warehouse_host",
"127.0.0.1");
95 if (!node_->has_parameter(
"warehouse_plugin"))
96 node_->declare_parameter<std::string>(
"warehouse_plugin",
"warehouse_ros_mongo::MongoDatabaseConnection");
97 if (!node_->has_parameter(
"warehouse_port"))
98 node_->declare_parameter<
int>(
"warehouse_port", 33829);
102 ui_->shapes_combo_box->addItem(
"Box", shapes::BOX);
103 ui_->shapes_combo_box->addItem(
"Sphere", shapes::SPHERE);
104 ui_->shapes_combo_box->addItem(
"Cylinder", shapes::CYLINDER);
105 ui_->shapes_combo_box->addItem(
"Cone", shapes::CONE);
106 ui_->shapes_combo_box->addItem(
"Mesh from file", shapes::MESH);
107 ui_->shapes_combo_box->addItem(
"Mesh from URL", shapes::MESH);
108 setLocalSceneEdited(
false);
120 connect(
ui_->plan_button, &QPushButton::clicked,
this, &MotionPlanningFrame::planButtonClicked);
121 connect(
ui_->execute_button, &QPushButton::clicked,
this, &MotionPlanningFrame::executeButtonClicked);
122 connect(
ui_->plan_and_execute_button, &QPushButton::clicked,
this, &MotionPlanningFrame::planAndExecuteButtonClicked);
123 connect(
ui_->stop_button, &QPushButton::clicked,
this, &MotionPlanningFrame::stopButtonClicked);
124 connect(
ui_->start_state_combo_box, &QComboBox::textActivated,
this, &MotionPlanningFrame::startStateTextChanged);
125 connect(
ui_->goal_state_combo_box, &QComboBox::textActivated,
this, &MotionPlanningFrame::goalStateTextChanged);
126 connect(
ui_->planning_group_combo_box, &QComboBox::textActivated,
this,
127 &MotionPlanningFrame::planningGroupTextChanged);
128 connect(
ui_->database_connect_button, &QPushButton::clicked,
this, &MotionPlanningFrame::databaseConnectButtonClicked);
129 connect(
ui_->save_scene_button, &QPushButton::clicked,
this, &MotionPlanningFrame::saveSceneButtonClicked);
130 connect(
ui_->save_query_button, &QPushButton::clicked,
this, &MotionPlanningFrame::saveQueryButtonClicked);
131 connect(
ui_->delete_scene_button, &QPushButton::clicked,
this, &MotionPlanningFrame::deleteSceneButtonClicked);
132 connect(
ui_->delete_query_button, &QPushButton::clicked,
this, &MotionPlanningFrame::deleteQueryButtonClicked);
133 connect(
ui_->planning_scene_tree, &QTreeWidget::itemSelectionChanged,
this,
134 &MotionPlanningFrame::planningSceneItemClicked);
135 connect(
ui_->load_scene_button, &QPushButton::clicked,
this, &MotionPlanningFrame::loadSceneButtonClicked);
136 connect(
ui_->load_query_button, &QPushButton::clicked,
this, &MotionPlanningFrame::loadQueryButtonClicked);
137 connect(
ui_->allow_looking, &QCheckBox::toggled,
this, &MotionPlanningFrame::allowLookingToggled);
138 connect(
ui_->allow_replanning, &QCheckBox::toggled,
this, &MotionPlanningFrame::allowReplanningToggled);
139 connect(
ui_->allow_external_program, &QCheckBox::toggled,
this,
140 &MotionPlanningFrame::allowExternalProgramCommunication);
141 connect(
ui_->planning_pipeline_combo_box, QOverload<int>::of(&QComboBox::currentIndexChanged),
this,
142 &MotionPlanningFrame::planningPipelineIndexChanged);
143 connect(
ui_->planning_algorithm_combo_box, QOverload<int>::of(&QComboBox::currentIndexChanged),
this,
144 &MotionPlanningFrame::planningAlgorithmIndexChanged);
145 connect(
ui_->clear_scene_button, &QPushButton::clicked,
this, &MotionPlanningFrame::clearScene);
146 connect(
ui_->scene_scale, QOverload<int>::of(&QSlider::valueChanged),
this, &MotionPlanningFrame::sceneScaleChanged);
147 connect(
ui_->scene_scale, &QSlider::sliderPressed,
this, &MotionPlanningFrame::sceneScaleStartChange);
148 connect(
ui_->scene_scale, &QSlider::sliderReleased,
this, &MotionPlanningFrame::sceneScaleEndChange);
149 connect(
ui_->remove_object_button, &QPushButton::clicked,
this, &MotionPlanningFrame::removeSceneObject);
150 connect(
ui_->object_x, QOverload<double>::of(&QDoubleSpinBox::valueChanged),
this,
151 &MotionPlanningFrame::objectPoseValueChanged);
152 connect(
ui_->object_y, QOverload<double>::of(&QDoubleSpinBox::valueChanged),
this,
153 &MotionPlanningFrame::objectPoseValueChanged);
154 connect(
ui_->object_z, QOverload<double>::of(&QDoubleSpinBox::valueChanged),
this,
155 &MotionPlanningFrame::objectPoseValueChanged);
156 connect(
ui_->object_rx, QOverload<double>::of(&QDoubleSpinBox::valueChanged),
this,
157 &MotionPlanningFrame::objectPoseValueChanged);
158 connect(
ui_->object_ry, QOverload<double>::of(&QDoubleSpinBox::valueChanged),
this,
159 &MotionPlanningFrame::objectPoseValueChanged);
160 connect(
ui_->object_rz, QOverload<double>::of(&QDoubleSpinBox::valueChanged),
this,
161 &MotionPlanningFrame::objectPoseValueChanged);
162 connect(
ui_->publish_current_scene_button, &QPushButton::clicked,
this, &MotionPlanningFrame::publishScene);
163 connect(
ui_->collision_objects_list, &QListWidget::itemSelectionChanged,
this,
164 &MotionPlanningFrame::selectedCollisionObjectChanged);
165 connect(
ui_->collision_objects_list, &QListWidget::itemChanged,
this, &MotionPlanningFrame::collisionObjectChanged);
166 connect(
ui_->path_constraints_combo_box, QOverload<int>::of(&QComboBox::currentIndexChanged),
this,
167 &MotionPlanningFrame::pathConstraintsIndexChanged);
168 connect(
ui_->clear_octomap_button, &QPushButton::clicked,
this, &MotionPlanningFrame::onClearOctomapClicked);
169 connect(
ui_->planning_scene_tree, &QTreeWidget::itemChanged,
this, &MotionPlanningFrame::warehouseItemNameChanged);
170 connect(
ui_->reset_db_button, &QPushButton::clicked,
this, &MotionPlanningFrame::resetDbButtonClicked);
172 connect(
ui_->add_object_button, &QPushButton::clicked,
this, &MotionPlanningFrame::addSceneObject);
173 connect(
ui_->shapes_combo_box, &QComboBox::currentTextChanged,
this, &MotionPlanningFrame::shapesComboBoxChanged);
174 connect(
ui_->export_scene_geometry_text_button, &QPushButton::clicked,
this,
175 &MotionPlanningFrame::exportGeometryAsTextButtonClicked);
176 connect(
ui_->import_scene_geometry_text_button, &QPushButton::clicked,
this,
177 &MotionPlanningFrame::importGeometryFromTextButtonClicked);
178 connect(
ui_->load_state_button, &QPushButton::clicked,
this, &MotionPlanningFrame::loadStateButtonClicked);
179 connect(
ui_->save_start_state_button, &QPushButton::clicked,
this, &MotionPlanningFrame::saveStartStateButtonClicked);
180 connect(
ui_->save_goal_state_button, &QPushButton::clicked,
this, &MotionPlanningFrame::saveGoalStateButtonClicked);
181 connect(
ui_->set_as_start_state_button, &QPushButton::clicked,
this,
182 &MotionPlanningFrame::setAsStartStateButtonClicked);
183 connect(
ui_->set_as_goal_state_button, &QPushButton::clicked,
this, &MotionPlanningFrame::setAsGoalStateButtonClicked);
184 connect(
ui_->remove_state_button, &QPushButton::clicked,
this, &MotionPlanningFrame::removeStateButtonClicked);
185 connect(
ui_->clear_states_button, &QPushButton::clicked,
this, &MotionPlanningFrame::clearStatesButtonClicked);
186#if QT_VERSION >= QT_VERSION_CHECK(6, 9, 0)
187 connect(
ui_->approximate_ik, &QCheckBox::checkStateChanged,
this, &MotionPlanningFrame::approximateIKChanged);
189 connect(
ui_->approximate_ik, &QCheckBox::stateChanged,
this, &MotionPlanningFrame::approximateIKChanged);
192 connect(
ui_->detect_objects_button, &QPushButton::clicked,
this, &MotionPlanningFrame::detectObjectsButtonClicked);
193 connect(
ui_->pick_button, &QPushButton::clicked,
this, &MotionPlanningFrame::pickObjectButtonClicked);
194 connect(
ui_->place_button, &QPushButton::clicked,
this, &MotionPlanningFrame::placeObjectButtonClicked);
195 connect(
ui_->detected_objects_list, &QListWidget::itemSelectionChanged,
this,
196 &MotionPlanningFrame::selectedDetectedObjectChanged);
197 connect(
ui_->detected_objects_list, &QListWidget::itemChanged,
this, &MotionPlanningFrame::detectedObjectChanged);
198 connect(
ui_->support_surfaces_list, &QListWidget::itemSelectionChanged,
this,
199 &MotionPlanningFrame::selectedSupportSurfaceChanged);
201 connect(
ui_->tabWidget, &QTabWidget::currentChanged,
this, &MotionPlanningFrame::tabChanged);
207 connect(
ui_->planning_time, QOverload<double>::of(&QDoubleSpinBox::valueChanged),
this,
209 connect(
ui_->planning_attempts, QOverload<int>::of(&QSpinBox::valueChanged),
this,
211 connect(
ui_->velocity_scaling_factor, QOverload<double>::of(&QDoubleSpinBox::valueChanged),
this,
213 connect(
ui_->acceleration_scaling_factor, QOverload<double>::of(&QDoubleSpinBox::valueChanged),
this,
216#if QT_VERSION >= QT_VERSION_CHECK(6, 9, 0)
232 connect(
ui_->wcenter_x, QOverload<double>::of(&QDoubleSpinBox::valueChanged),
this,
234 connect(
ui_->wcenter_y, QOverload<double>::of(&QDoubleSpinBox::valueChanged),
this,
236 connect(
ui_->wcenter_z, QOverload<double>::of(&QDoubleSpinBox::valueChanged),
this,
242 QShortcut* copy_object_shortcut =
new QShortcut(QKeySequence(Qt::CTRL | Qt::Key_C),
ui_->collision_objects_list);
243 connect(copy_object_shortcut, &QShortcut::activated,
this, &MotionPlanningFrame::copySelectedCollisionObject);
245 ui_->reset_db_button->hide();
246 ui_->background_job_progress->hide();
247 ui_->background_job_progress->setMaximum(0);
249 ui_->tabWidget->setCurrentIndex(1);
251 known_collision_objects_version_ = 0;
255 object_recognition_client_ = rclcpp_action::create_client<object_recognition_msgs::action::ObjectRecognition>(
258 if (object_recognition_client_)
260 if (!object_recognition_client_->wait_for_action_server(std::chrono::seconds(3)))
263 object_recognition_client_.reset();