Skip to content

Commit

Permalink
porting rqt_console to ros2
Browse files Browse the repository at this point in the history
  • Loading branch information
Mike Lautman authored and Mike Lautman committed Nov 22, 2018
1 parent dbf4075 commit a13b10b
Show file tree
Hide file tree
Showing 14 changed files with 129 additions and 91 deletions.
23 changes: 15 additions & 8 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -1,18 +1,25 @@
cmake_minimum_required(VERSION 2.8.3)
cmake_minimum_required(VERSION 3.5)
project(rqt_console)
# Load catkin and all dependencies required for this package
find_package(catkin REQUIRED)
catkin_package()
catkin_python_setup()

# Load ament and all dependencies required for this package
find_package(ament_cmake REQUIRED)
find_package(ament_cmake_python REQUIRED)
# Note: This is needed for rcl_interfaces Log.msg
find_package(rcl_interfaces REQUIRED)

ament_python_install_package(${PROJECT_NAME}
PACKAGE_DIR src/${PROJECT_NAME})

install(FILES plugin.xml
DESTINATION ${CATKIN_PACKAGE_SHARE_DESTINATION}
DESTINATION share/${PROJECT_NAME}
)

install(DIRECTORY resource
DESTINATION ${CATKIN_PACKAGE_SHARE_DESTINATION}
DESTINATION share/${PROJECT_NAME}
)

install(PROGRAMS scripts/rqt_console
DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION}
DESTINATION lib/${PROJECT_NAME}
)

ament_package()
27 changes: 16 additions & 11 deletions package.xml
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
<package>
<package format="2">
<name>rqt_console</name>
<version>0.4.8</version>
<description>rqt_console provides a GUI plugin for displaying and filtering ROS messages.</description>
Expand All @@ -12,19 +12,24 @@
<url type="repository">https://github.com/ros-visualization/rqt_console</url>
<url type="bugtracker">https://github.com/ros-visualization/rqt_console/issues</url>

<buildtool_depend>catkin</buildtool_depend>
<buildtool_depend>ament_cmake</buildtool_depend>

<run_depend>python-rospkg</run_depend>
<run_depend version_gte="0.2.19">python_qt_binding</run_depend>
<run_depend>roslib</run_depend>
<run_depend>rospy</run_depend>
<run_depend>rqt_gui</run_depend>
<run_depend>rqt_gui_py</run_depend>
<run_depend>rqt_logger_level</run_depend>
<run_depend>rqt_py_common</run_depend>
<exec_depend>ament_index_python</exec_depend>
<exec_depend version_gte="0.2.19">python_qt_binding</exec_depend>
<exec_depend>rclpy</exec_depend>
<exec_depend>rqt_gui</exec_depend>
<exec_depend>rqt_gui_py</exec_depend>
<exec_depend>rqt_py_common</exec_depend>

<!-- TODO(mlautman): Replace once rqt_logger_level has been ported -->
<!-- <exec_depend>rqt_logger_level</exec_depend> -->

<!-- Note: This is needed for rcl_interfaces Log.msg -->
<exec_depend>rcl_interfaces</exec_depend>

<export>
<architecture_independent/>
<!-- <architecture_independent/> -->
<rqt_gui plugin="${prefix}/plugin.xml"/>
<build_type>ament_cmake</build_type>
</export>
</package>
2 changes: 1 addition & 1 deletion scripts/rqt_console
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
#!/usr/bin/env python
#!/usr/bin/env python3

import sys

Expand Down
12 changes: 0 additions & 12 deletions setup.py

This file was deleted.

38 changes: 20 additions & 18 deletions src/rqt_console/console.py
Original file line number Diff line number Diff line change
Expand Up @@ -30,19 +30,19 @@
# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
# POSSIBILITY OF SUCH DAMAGE.

from rosgraph_msgs.msg import Log
import rospkg
import rospy
from rcl_interfaces.msg import Log

import rclpy

from python_qt_binding.QtCore import QMutex, QMutexLocker, QTimer

from qt_gui.plugin import Plugin

from .console_settings_dialog import ConsoleSettingsDialog
from .console_widget import ConsoleWidget
from .message import Message
from .message_data_model import MessageDataModel
from .message_proxy_model import MessageProxyModel
from rqt_console.console_settings_dialog import ConsoleSettingsDialog
from rqt_console.console_widget import ConsoleWidget
from rqt_console.message import Message
from rqt_console.message_data_model import MessageDataModel
from rqt_console.message_proxy_model import MessageProxyModel


class Console(Plugin):
Expand All @@ -60,13 +60,12 @@ def __init__(self, context):
super(Console, self).__init__(context)
self.setObjectName('Console')

self._rospack = rospkg.RosPack()

self._context = context
self._model = MessageDataModel()
self._proxy_model = MessageProxyModel()
self._proxy_model.setSourceModel(self._model)

self._widget = ConsoleWidget(self._proxy_model, self._rospack)
self._widget = ConsoleWidget(self._proxy_model)
if context.serial_number() > 1:
self._widget.setWindowTitle(
self._widget.windowTitle() + (' (%d)' % context.serial_number()))
Expand Down Expand Up @@ -100,8 +99,7 @@ def convert_rosgraph_log_message(log_msg):
msg.message = log_msg.msg
msg.severity = log_msg.level
msg.node = log_msg.name
msg.stamp = (log_msg.header.stamp.secs, log_msg.header.stamp.nsecs)
msg.topics = sorted(log_msg.topics)
msg.stamp = (log_msg.header.stamp.sec, log_msg.header.stamp.nanosec)
msg.location = log_msg.file + ':' + log_msg.function + ':' + str(log_msg.line)
return msg

Expand All @@ -116,7 +114,7 @@ def insert_messages(self):
self._model.insert_rows(msgs)

def shutdown_plugin(self):
self._subscriber.unregister()
self._context.node.destroy_subscription(self._subscriber)
self._timer.stop()
self._widget.cleanup_browsers_on_close()

Expand All @@ -127,9 +125,13 @@ def restore_settings(self, plugin_settings, instance_settings):
self._widget.restore_settings(plugin_settings, instance_settings)

def trigger_configuration(self):
topics = [t for t in rospy.get_published_topics() if t[1] == 'rosgraph_msgs/Log']
topics = [
topic_name for topic_name, topic_types
in self._context.node.get_topic_names_and_types()
if 'rcl_interfaces/Log' in topic_types]

topics.sort(key=lambda tup: tup[0])
dialog = ConsoleSettingsDialog(topics, self._rospack)
dialog = ConsoleSettingsDialog(topics)
(topic, message_limit) = dialog.query(self._topic, self._model.get_message_limit())
if topic != self._topic:
self._subscribe(topic)
Expand All @@ -138,6 +140,6 @@ def trigger_configuration(self):

def _subscribe(self, topic):
if self._subscriber:
self._subscriber.unregister()
self._subscriber = rospy.Subscriber(topic, Log, self.queue_message)
self._context.node.destroy_subscription(self._subscriber)
self._subscriber = self._node.create_subscription(Log, topic, self.queue_message)
self._currenttopic = topic
21 changes: 14 additions & 7 deletions src/rqt_console/console_settings_dialog.py
Original file line number Diff line number Diff line change
Expand Up @@ -32,11 +32,14 @@

import os

from ament_index_python.resources import get_resource

from python_qt_binding import loadUi
from python_qt_binding.QtWidgets import QDialog

from rqt_logger_level.logger_level_widget import LoggerLevelWidget
from rqt_logger_level.logger_level_service_caller import LoggerLevelServiceCaller
# TODO(mlautman): Restore this functionality once rqt_logger_level has been ported
# from rqt_logger_level.logger_level_widget import LoggerLevelWidget
# from rqt_logger_level.logger_level_service_caller import LoggerLevelServiceCaller


class ConsoleSettingsDialog(QDialog):
Expand All @@ -45,21 +48,25 @@ class ConsoleSettingsDialog(QDialog):
Dialog to change the subscribed topic and alter the message buffer size.
"""

def __init__(self, topics, rospack):
def __init__(self, topics):
"""
:param topics: list of topics to allow switching, ''list of string''
:param limit: displayed in the message buffer size spin box, ''int''
"""
super(ConsoleSettingsDialog, self).__init__()

pkg_name = 'rqt_console'
_, package_path = get_resource('packages', pkg_name)
ui_file = os.path.join(
rospack.get_path('rqt_console'), 'resource', 'console_settings_dialog.ui')
package_path, 'share', pkg_name, 'resource', 'console_settings_dialog.ui')

loadUi(ui_file, self)
for topic in topics:
self.topic_combo.addItem(topic[0] + ' (' + topic[1] + ')', topic[0])

self._service_caller = LoggerLevelServiceCaller()
self._logger_widget = LoggerLevelWidget(self._service_caller)
self.levelsLayout.addWidget(self._logger_widget)
# self._service_caller = LoggerLevelServiceCaller()
# self._logger_widget = LoggerLevelWidget(self._service_caller)
# self.levelsLayout.addWidget(self._logger_widget)
self.adjustSize()

def query(self, topic, buffer_size):
Expand Down
20 changes: 12 additions & 8 deletions src/rqt_console/console_widget.py
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,8 @@

import os

from ament_index_python.resources import get_resource

from python_qt_binding import loadUi
from python_qt_binding.QtGui import QCursor, QIcon
from python_qt_binding.QtWidgets import (QApplication, QFileDialog, QHeaderView,
Expand Down Expand Up @@ -69,7 +71,7 @@ class ConsoleWidget(QWidget):
Primary widget for the rqt_console plugin.
"""

def __init__(self, proxy_model, rospack, minimal=False):
def __init__(self, proxy_model, minimal=False):
"""
:param proxymodel: the proxy model to display in the widget,''QSortFilterProxyModel''
:param minimal: if true the load, save and column buttons will be hidden as well as the
Expand All @@ -79,14 +81,16 @@ def __init__(self, proxy_model, rospack, minimal=False):
self._proxy_model = proxy_model
self._model = self._proxy_model.sourceModel()
self._paused = False
self._rospack = rospack

# These are lists of Tuples = (,)
self._exclude_filters = []
self._highlight_filters = []

pkg_name = 'rqt_console'
_, package_path = get_resource('packages', pkg_name)
ui_file = os.path.join(
self._rospack.get_path('rqt_console'), 'resource', 'console_widget.ui')
package_path, 'share', pkg_name, 'resource', 'console_widget.ui')

loadUi(ui_file, self)

if minimal:
Expand Down Expand Up @@ -327,9 +331,9 @@ def _add_highlight_filter(self, filter_index=False):
newfilter = self.filter_factory[filter_index][1]()
if len(self.filter_factory[filter_index]) >= 4:
newwidget = self.filter_factory[filter_index][2](
newfilter, self._rospack, self.filter_factory[filter_index][3])
newfilter, self.filter_factory[filter_index][3])
else:
newwidget = self.filter_factory[filter_index][2](newfilter, self._rospack)
newwidget = self.filter_factory[filter_index][2](newfilter)

# pack the new filter tuple onto the filter list
self._highlight_filters.append((
Expand Down Expand Up @@ -384,9 +388,9 @@ def _add_exclude_filter(self, filter_index=False):
newfilter = self.filter_factory[filter_index][1]()
if len(self.filter_factory[filter_index]) >= 4:
newwidget = self.filter_factory[filter_index][2](
newfilter, self._rospack, self.filter_factory[filter_index][3])
newfilter, self.filter_factory[filter_index][3])
else:
newwidget = self.filter_factory[filter_index][2](newfilter, self._rospack)
newwidget = self.filter_factory[filter_index][2](newfilter)

# pack the new filter tuple onto the filter list
self._exclude_filters.append((
Expand Down Expand Up @@ -585,7 +589,7 @@ def _show_browsers(self):
rowlist.append(self._proxy_model.mapToSource(current).row())
browsetext = self._model.get_selected_text(rowlist)
if browsetext is not None:
self._browsers.append(TextBrowseDialog(browsetext, self._rospack))
self._browsers.append(TextBrowseDialog(browsetext))
self._browsers[-1].show()

def _handle_clear_button_clicked(self, checked):
Expand Down
11 changes: 8 additions & 3 deletions src/rqt_console/filters/custom_filter_widget.py
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,8 @@
# POSSIBILITY OF SUCH DAMAGE.

import os
import rospkg

from ament_index_python.resources import get_resource

from python_qt_binding import loadUi
from python_qt_binding.QtCore import Qt
Expand All @@ -43,10 +44,14 @@

class CustomFilterWidget(QWidget):

def __init__(self, parentfilter, rospack, item_providers):
def __init__(self, parentfilter, item_providers):
super(CustomFilterWidget, self).__init__()

pkg_name = 'rqt_console'
_, package_path = get_resource('packages', pkg_name)
ui_file = os.path.join(
rospack.get_path('rqt_console'), 'resource/filters', 'custom_filter_widget.ui')
package_path, 'share', pkg_name, 'resource', 'filters', 'custom_filter_widget.ui')

loadUi(ui_file, self)
self.setObjectName('CustomFilterWidget')
self._parentfilter = parentfilter # When data is changed it is stored in the parent filter
Expand Down
10 changes: 7 additions & 3 deletions src/rqt_console/filters/filter_wrapper_widget.py
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,8 @@
# POSSIBILITY OF SUCH DAMAGE.

import os
import rospkg

from ament_index_python.resources import get_resource

from python_qt_binding import loadUi
from python_qt_binding.QtGui import QIcon
Expand All @@ -51,9 +52,12 @@ def __init__(self, widget, filter_name):
:param filter_name: the name to be placed on the label ''str''
"""
super(FilterWrapperWidget, self).__init__()
rp = rospkg.RosPack()

pkg_name = 'rqt_console'
_, package_path = get_resource('packages', pkg_name)
ui_file = os.path.join(
rp.get_path('rqt_console'), 'resource/filters', 'filter_wrapper_widget.ui')
package_path, 'share', pkg_name, 'resource', 'filters', 'filter_wrapper_widget.ui')

loadUi(ui_file, self)
self.setObjectName('FilterWrapperWidget')
self.delete_button.setIcon(QIcon.fromTheme('list-remove'))
Expand Down
11 changes: 8 additions & 3 deletions src/rqt_console/filters/list_filter_widget.py
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,8 @@
# POSSIBILITY OF SUCH DAMAGE.

import os
import rospkg

from ament_index_python.resources import get_resource

from python_qt_binding import loadUi
from python_qt_binding.QtCore import Qt
Expand All @@ -48,15 +49,19 @@ class ListFilterWidget(QWidget):
limited dynamic selections
"""

def __init__(self, parentfilter, rospack, item_provider):
def __init__(self, parentfilter, item_provider):
"""
:param parentfilter: The filter object, must implement set_list and
contain _list ''QObject''
:param item_provider: a function designed to provide a list or dict
"""
super(ListFilterWidget, self).__init__()

pkg_name = 'rqt_console'
_, package_path = get_resource('packages', pkg_name)
ui_file = os.path.join(
rospack.get_path('rqt_console'), 'resource/filters', 'list_filter_widget.ui')
package_path, 'share', pkg_name, 'resource', 'filters', 'list_filter_widget.ui')

loadUi(ui_file, self)
self.setObjectName('ListFilterWidget')
# When data is changed we need to store it in the parent filter
Expand Down
Loading

0 comments on commit a13b10b

Please sign in to comment.