Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

rqt_image_view: Adding the possibility to publish mouse events. #368

Merged
merged 1 commit into from
Apr 27, 2016
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
4 changes: 2 additions & 2 deletions rqt_image_view/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ cmake_minimum_required(VERSION 2.8.3)

project(rqt_image_view)
# Load catkin and all dependencies required for this package
find_package(catkin REQUIRED COMPONENTS rqt_gui rqt_gui_cpp image_transport sensor_msgs cv_bridge)
find_package(catkin REQUIRED COMPONENTS rqt_gui rqt_gui_cpp image_transport sensor_msgs geometry_msgs cv_bridge)

find_package(Qt4 COMPONENTS QtCore QtGui REQUIRED)

Expand Down Expand Up @@ -30,7 +30,7 @@ set(rqt_image_view_INCLUDE_DIRECTORIES
catkin_package(
INCLUDE_DIRS ${rqt_image_view_INCLUDE_DIRECTORIES}
LIBRARIES ${PROJECT_NAME}
CATKIN_DEPENDS rqt_gui rqt_gui_cpp image_transport sensor_msgs cv_bridge
CATKIN_DEPENDS rqt_gui rqt_gui_cpp image_transport sensor_msgs cv_bridge geometry_msgs
)
catkin_python_setup()

Expand Down
10 changes: 10 additions & 0 deletions rqt_image_view/include/rqt_image_view/image_view.h
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@
#include <image_transport/image_transport.h>
#include <ros/macros.h>
#include <sensor_msgs/Image.h>
#include <geometry_msgs/Point.h>

#include <opencv2/core/core.hpp>

Expand Down Expand Up @@ -93,6 +94,12 @@ protected slots:

virtual void saveImage();

virtual void onMousePublish(bool checked);

virtual void onMouseLeft(int x, int y);

virtual void onPubTopicChanged();

protected:

virtual void callbackImage(const sensor_msgs::Image::ConstPtr& msg);
Expand All @@ -108,6 +115,9 @@ protected slots:
private:

QString arg_topic_name;
ros::Publisher pub_mouse_left_;

bool pub_topic_custom_;

};

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -80,6 +80,8 @@ class RatioLayoutedFrame

void delayed_update();

void mouseLeft(int x, int y);

protected:

void setAspectRatio(unsigned short width, unsigned short height);
Expand All @@ -90,6 +92,8 @@ class RatioLayoutedFrame

static int greatestCommonDivisor(int a, int b);

void mousePressEvent(QMouseEvent * mouseEvent);

QSize aspect_ratio_;

QImage qimage_;
Expand Down
2 changes: 2 additions & 0 deletions rqt_image_view/package.xml
Original file line number Diff line number Diff line change
Expand Up @@ -15,11 +15,13 @@
<buildtool_depend>catkin</buildtool_depend>

<build_depend>cv_bridge</build_depend>
<build_depend>geometry_msgs</build_depend>
<build_depend>image_transport</build_depend>
<build_depend>rqt_gui</build_depend>
<build_depend>rqt_gui_cpp</build_depend>
<build_depend>sensor_msgs</build_depend>
<run_depend>cv_bridge</run_depend>
<run_depend>geometry_msgs</run_depend>
<run_depend>image_transport</run_depend>
<run_depend>rqt_gui</run_depend>
<run_depend>rqt_gui_cpp</run_depend>
Expand Down
61 changes: 61 additions & 0 deletions rqt_image_view/src/rqt_image_view/image_view.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -91,11 +91,19 @@ void ImageView::initPlugin(qt_gui_cpp::PluginContext& context)
ui_.topics_combo_box->setCurrentIndex(ui_.topics_combo_box->findText(arg_topic_name));
}
}
pub_topic_custom_ = false;

QRegExp rx("([a-zA-Z/][a-zA-Z0-9_/]*)?"); //see http://www.ros.org/wiki/ROS/Concepts#Names.Valid_Names (but also accept an empty field)
ui_.publish_click_location_topic_line_edit->setValidator(new QRegExpValidator(rx, this));
connect(ui_.publish_click_location_check_box, SIGNAL(toggled(bool)), this, SLOT(onMousePublish(bool)));
connect(ui_.image_frame, SIGNAL(mouseLeft(int, int)), this, SLOT(onMouseLeft(int, int)));
connect(ui_.publish_click_location_topic_line_edit, SIGNAL(editingFinished()), this, SLOT(onPubTopicChanged()));
}

void ImageView::shutdownPlugin()
{
subscriber_.shutdown();
pub_mouse_left_.shutdown();
}

void ImageView::saveSettings(qt_gui_cpp::Settings& plugin_settings, qt_gui_cpp::Settings& instance_settings) const
Expand All @@ -106,6 +114,8 @@ void ImageView::saveSettings(qt_gui_cpp::Settings& plugin_settings, qt_gui_cpp::
instance_settings.setValue("zoom1", ui_.zoom_1_push_button->isChecked());
instance_settings.setValue("dynamic_range", ui_.dynamic_range_check_box->isChecked());
instance_settings.setValue("max_range", ui_.max_range_double_spin_box->value());
instance_settings.setValue("publish_click_location", ui_.publish_click_location_check_box->isChecked());
instance_settings.setValue("mouse_pub_topic", ui_.publish_click_location_topic_line_edit->text());
}

void ImageView::restoreSettings(const qt_gui_cpp::Settings& plugin_settings, const qt_gui_cpp::Settings& instance_settings)
Expand All @@ -130,6 +140,12 @@ void ImageView::restoreSettings(const qt_gui_cpp::Settings& plugin_settings, con
//qDebug("ImageView::restoreSettings() topic '%s'", topic.toStdString().c_str());
selectTopic(topic);
}

bool publish_click_location = instance_settings.value("publish_click_location", false).toBool();
ui_.publish_click_location_check_box->setChecked(publish_click_location);

QString pub_topic = instance_settings.value("mouse_pub_topic", "").toString();
ui_.publish_click_location_topic_line_edit->setText(pub_topic);
}

void ImageView::updateTopicList()
Expand Down Expand Up @@ -261,6 +277,8 @@ void ImageView::onTopicChanged(int index)
QMessageBox::warning(widget_, tr("Loading image transport plugin failed"), e.what());
}
}

onMousePublish(ui_.publish_click_location_check_box->isChecked());
}

void ImageView::onZoom1(bool checked)
Expand Down Expand Up @@ -302,6 +320,49 @@ void ImageView::saveImage()
img.save(file_name);
}

void ImageView::onMousePublish(bool checked)
{
std::string topicName;
if(pub_topic_custom_)
{
topicName = ui_.publish_click_location_topic_line_edit->text().toStdString();
} else {
if(!subscriber_.getTopic().empty())
{
topicName = subscriber_.getTopic()+"_mouse_left";
} else {
topicName = "mouse_left";
}
ui_.publish_click_location_topic_line_edit->setText(QString::fromStdString(topicName));
}

if(checked)
{
pub_mouse_left_ = getNodeHandle().advertise<geometry_msgs::Point>(topicName, 1000);
} else {
pub_mouse_left_.shutdown();
}
}

void ImageView::onMouseLeft(int x, int y)
{
if(ui_.publish_click_location_check_box->isChecked() && !ui_.image_frame->getImage().isNull())
{
geometry_msgs::Point clickLocation;
// Publish click location in pixel coordinates
clickLocation.x = round((double)x/(double)ui_.image_frame->width()*(double)ui_.image_frame->getImage().width());
clickLocation.y = round((double)y/(double)ui_.image_frame->height()*(double)ui_.image_frame->getImage().height());
clickLocation.z = 0;
pub_mouse_left_.publish(clickLocation);
}
}

void ImageView::onPubTopicChanged()
{
pub_topic_custom_ = !(ui_.publish_click_location_topic_line_edit->text().isEmpty());
onMousePublish(ui_.publish_click_location_check_box->isChecked());
}

void ImageView::callbackImage(const sensor_msgs::Image::ConstPtr& msg)
{
try
Expand Down
42 changes: 41 additions & 1 deletion rqt_image_view/src/rqt_image_view/image_view.ui
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@
<property name="windowTitle">
<string>Image View</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout" stretch="0,1,0">
<layout class="QVBoxLayout" name="verticalLayout" stretch="0,0,1,0">
<item>
<layout class="QHBoxLayout" name="horizontalLayout" stretch="0,0,0,0,0,0,1">
<item>
Expand Down Expand Up @@ -96,6 +96,46 @@
</item>
</layout>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_3">
<item>
<widget class="QCheckBox" name="publish_click_location_check_box">
<property name="toolTip">
<string>Publish click location</string>
</property>
<property name="text">
<string/>
</property>
</widget>
</item>
<item>
<widget class="QLineEdit" name="publish_click_location_topic_line_edit">
<property name="enabled">
<bool>true</bool>
</property>
<property name="toolTip">
<string>Click location topic (leave empty for auto-naming)</string>
</property>
<property name="autoFillBackground">
<bool>false</bool>
</property>
</widget>
</item>
<item>
<spacer name="horizontalSpacer_3">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
</layout>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_2" stretch="1,0">
<property name="spacing">
Expand Down
9 changes: 9 additions & 0 deletions rqt_image_view/src/rqt_image_view/ratio_layouted_frame.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@
#include <rqt_image_view/ratio_layouted_frame.h>

#include <assert.h>
#include <QMouseEvent>

namespace rqt_image_view {

Expand Down Expand Up @@ -159,4 +160,12 @@ int RatioLayoutedFrame::greatestCommonDivisor(int a, int b)
return greatestCommonDivisor(b, a % b);
}

void RatioLayoutedFrame::mousePressEvent(QMouseEvent * mouseEvent)
{
if(mouseEvent->button() == Qt::LeftButton)
{
emit mouseLeft(mouseEvent->x(), mouseEvent->y());
}
QFrame::mousePressEvent(mouseEvent);
}
}