42 const std::string
LOGNAME =
"handeye_context_widget";
46 std::vector<std::string> names;
54 const std::vector<std::string>& robot_links =
robot_model_loader_->getModel()->getLinkModelNames();
55 for (
const std::string& name : names)
57 auto it = std::find(robot_links.begin(), robot_links.end(), name);
61 if (it != robot_links.end())
62 addItem(QString(
name.c_str()));
66 addItem(QString(
name.c_str()));
69 if (it == robot_links.end() && index == std::string::npos)
70 addItem(QString(
name.c_str()));
78 std::vector<std::string> names;
82 auto it = std::find(names.begin(), names.end(), frame_name);
83 return it != names.end();
87 : QWidget(parent), min_position_(
min), max_position_(max)
89 QHBoxLayout* row =
new QHBoxLayout(
this);
90 row->setContentsMargins(0, 10, 0, 10);
93 label_ =
new QLabel(QString(
name.c_str()),
this);
94 label_->setContentsMargins(0, 0, 0, 0);
95 row->addWidget(label_);
98 slider_ =
new QSlider(Qt::Horizontal,
this);
99 slider_->setSingleStep(100);
100 slider_->setPageStep(100);
101 slider_->setTickInterval(1000);
102 slider_->setContentsMargins(0, 0, 0, 0);
103 row->addWidget(slider_);
105 slider_->setMaximum(max_position_ * 10000);
106 slider_->setMinimum(min_position_ * 10000);
108 connect(slider_, SIGNAL(valueChanged(
int)),
this, SLOT(changeValue(
int)));
111 edit_ =
new QLineEdit(
this);
112 edit_->setMinimumWidth(62);
113 edit_->setContentsMargins(0, 0, 0, 0);
114 connect(edit_, SIGNAL(editingFinished()),
this, SLOT(changeSlider()));
115 row->addWidget(edit_);
117 this->setLayout(row);
122 return edit_->text().toDouble();
131 edit_->setText(QString(
"%1").arg(value, 0,
'f', 4));
132 slider_->setSliderPosition(value * 10000);
137 const double double_value = double(value) / 10000;
140 edit_->setText(QString(
"%1").arg(double_value, 0,
'f', 4));
158 : QWidget(parent), calibration_display_(pdisplay), tf_listener_(tf_buffer_)
161 QHBoxLayout* layout =
new QHBoxLayout();
162 this->setLayout(layout);
163 QVBoxLayout* layout_left =
new QVBoxLayout();
164 layout->addLayout(layout_left);
165 QVBoxLayout* layout_right =
new QVBoxLayout();
166 layout->addLayout(layout_right);
169 QGroupBox* group_left_top =
new QGroupBox(
"General Setting",
this);
170 layout_left->addWidget(group_left_top);
171 QFormLayout* layout_left_top =
new QFormLayout();
172 group_left_top->setLayout(layout_left_top);
174 sensor_mount_type_ =
new QComboBox();
175 sensor_mount_type_->addItem(
"Eye-to-hand");
176 sensor_mount_type_->addItem(
"Eye-in-hand");
177 layout_left_top->addRow(
"Sensor configuration", sensor_mount_type_);
178 connect(sensor_mount_type_, SIGNAL(activated(
int)),
this, SLOT(updateSensorMountType(
int)));
181 QGroupBox* frame_group =
new QGroupBox(
"Frames Selection",
this);
182 layout_left->addWidget(frame_group);
183 QFormLayout* frame_layout =
new QFormLayout();
184 frame_group->setLayout(frame_layout);
187 frame_layout->addRow(
"Sensor frame:", frames_[
"sensor"]);
190 frame_layout->addRow(
"Object frame:", frames_[
"object"]);
193 frame_layout->addRow(
"End-effector frame:", frames_[
"eef"]);
196 frame_layout->addRow(
"Robot base frame:", frames_[
"base"]);
198 for (std::pair<const std::string, TFFrameNameComboBox*>& frame : frames_)
199 connect(frame.second, SIGNAL(activated(
int)),
this, SLOT(updateFrameName(
int)));
202 QGroupBox* pose_group =
new QGroupBox(
"Camera Pose Inital Guess",
this);
203 pose_group->setMinimumWidth(300);
204 layout_right->addWidget(pose_group);
205 QFormLayout* pose_layout =
new QFormLayout();
206 pose_group->setLayout(pose_layout);
208 guess_pose_.insert(std::make_pair(
"Tx",
new SliderWidget(
this,
"X", -2.0, 2.0)));
209 pose_layout->addRow(guess_pose_[
"Tx"]);
211 guess_pose_.insert(std::make_pair(
"Ty",
new SliderWidget(
this,
"Y", -2.0, 2.0)));
212 pose_layout->addRow(guess_pose_[
"Ty"]);
214 guess_pose_.insert(std::make_pair(
"Tz",
new SliderWidget(
this,
"Z", -2.0, 2.0)));
215 pose_layout->addRow(guess_pose_[
"Tz"]);
217 guess_pose_.insert(std::make_pair(
"Rx",
new SliderWidget(
this,
"Roll", -M_PI, M_PI)));
218 pose_layout->addRow(guess_pose_[
"Rx"]);
220 guess_pose_.insert(std::make_pair(
"Ry",
new SliderWidget(
this,
"Pitch", -M_PI, M_PI)));
221 pose_layout->addRow(guess_pose_[
"Ry"]);
223 guess_pose_.insert(std::make_pair(
"Rz",
new SliderWidget(
this,
"Yaw", -M_PI, M_PI)));
224 pose_layout->addRow(guess_pose_[
"Rz"]);
226 for (std::pair<const std::string, SliderWidget*>& dim : guess_pose_)
228 dim.second->setValue(0);
229 connect(
dim.second, SIGNAL(
valueChanged(
double)),
this, SLOT(updateCameraMarkerPose(
double)));
233 camera_pose_ = Eigen::Isometry3d::Identity();
234 fov_pose_ = Eigen::Quaterniond(0.5, -0.5, 0.5, -0.5);
235 fov_pose_.translate(Eigen::Vector3d(0.0149, 0.0325, 0.0125));
237 camera_info_.reset(
new sensor_msgs::CameraInfo());
240 visual_tools_->enableFrameLocking(
true);
241 visual_tools_->setAlpha(1.0);
242 visual_tools_->setLifetime(0.0);
243 visual_tools_->trigger();
246 "Not all calibration frames have been selected.");
252 if (
config.mapGetInt(
"sensor_mount_type", &index))
257 for (std::pair<const std::string, TFFrameNameComboBox*>& frame :
frames_)
260 if (
config.mapGetString(frame.first.c_str(), &frame_name))
262 frame.second->clear();
263 if (!frame_name.isEmpty() && frame.second->hasFrame(frame_name.toStdString()))
264 frame.second->addItem(frame_name);
268 for (std::pair<const std::string, SliderWidget*>& dim :
guess_pose_)
271 if (
config.mapGetFloat(
dim.first.c_str(), &value))
272 dim.second->setValue(value);
276 std::map<std::string, std::string> names;
277 for (std::pair<const std::string, TFFrameNameComboBox*>& frame :
frames_)
278 names.insert(std::make_pair(frame.first, frame.second->currentText().toStdString()));
287 for (std::pair<const std::string, TFFrameNameComboBox*>& frame :
frames_)
288 config.mapSetValue(frame.first.c_str(), frame.second->currentText());
290 for (std::pair<const std::string, SliderWidget*>&
dim :
guess_pose_)
291 config.mapSetValue(
dim.first.c_str(),
dim.second->getValue());
306 QString from_frame(
"");
312 from_frame =
frames_[
"base"]->currentText();
322 if (!from_frame.isEmpty())
324 for (std::pair<const std::string, TFFrameNameComboBox*> frame :
frames_)
327 const std::string& frame_id = frame.second->currentText().toStdString();
328 if (!frame_id.empty())
332 visual_tools_->publishAxisLabeled(Eigen::Isometry3d::Identity(), frame_id);
337 QString to_frame =
frames_[
"sensor"]->currentText();
338 if (!to_frame.isEmpty())
350 shape_msgs::Mesh mesh =
367 QString sensor_frame =
frames_[
"sensor"]->currentText();
368 geometry_msgs::TransformStamped tf_msg;
378 <<
"\nTranslation:\n"
379 <<
fov_pose_.translation() <<
"\nRotation:\n"
391 shape_msgs::Mesh mesh;
394 double delta_x = camera_model.
getDeltaX(camera_info.width / 2, max_dist);
395 double delta_y = camera_model.
getDeltaY(camera_info.height / 2, max_dist);
397 std::vector<double> x_cords = { -delta_x, delta_x };
398 std::vector<double> y_cords = { -delta_y, delta_y };
401 mesh.vertices.clear();
403 mesh.vertices.push_back(geometry_msgs::Point());
406 for (
const double& x_it : x_cords)
407 for (
const double& y_it : y_cords)
409 geometry_msgs::Point vertex;
411 if (std::isfinite(x_it) && std::isfinite(y_it) && std::isfinite(max_dist))
417 mesh.vertices.push_back(vertex);
421 mesh.triangles.resize(4);
422 mesh.triangles[0].vertex_indices = { 0, 1, 2 };
423 mesh.triangles[1].vertex_indices = { 0, 2, 4 };
424 mesh.triangles[2].vertex_indices = { 0, 4, 3 };
425 mesh.triangles[3].vertex_indices = { 0, 3, 1 };
431 double alpha, std::string frame_id)
438 double alpha, std::string frame_id)
440 visualization_msgs::Marker marker;
441 marker.header.frame_id = frame_id;
442 marker.ns =
"camera_fov";
444 marker.type = visualization_msgs::Marker::TRIANGLE_LIST;
445 marker.action = visualization_msgs::Marker::ADD;
450 marker.scale.x = 1.0;
451 marker.scale.y = 1.0;
452 marker.scale.z = 1.0;
454 marker.points.clear();
455 for (
const shape_msgs::MeshTriangle& triangle : mesh.triangles)
456 for (
const uint32_t& index : triangle.vertex_indices)
457 marker.points.push_back(mesh.vertices[index]);
473 camera_info_->distortion_model = camera_info.distortion_model;
501 for (std::pair<const std::string, SliderWidget*>
dim :
guess_pose_)
502 dim.second->setValue(0);
514 std::map<std::string, std::string> names;
515 bool any_empty =
false;
516 for (std::pair<const std::string, TFFrameNameComboBox*>& frame :
frames_)
518 names.insert(std::make_pair(frame.first, frame.second->currentText().toStdString()));
519 any_empty = any_empty || frame.second->currentText().toStdString().empty();
524 "Not all calibration frames have been selected.");
529 "Calibration frames have been selected.");