diff --git a/rviz_common/include/rviz_common/properties/ros_topic_property.hpp b/rviz_common/include/rviz_common/properties/ros_topic_property.hpp index c55303e6d..339ef898c 100644 --- a/rviz_common/include/rviz_common/properties/ros_topic_property.hpp +++ b/rviz_common/include/rviz_common/properties/ros_topic_property.hpp @@ -30,6 +30,7 @@ #define RVIZ_COMMON__PROPERTIES__ROS_TOPIC_PROPERTY_HPP_ #include +#include #include "rviz_common/properties/editable_enum_property.hpp" #include "rviz_common/ros_integration/ros_node_abstraction_iface.hpp" @@ -58,8 +59,13 @@ class RVIZ_COMMON_PUBLIC RosTopicProperty : public EditableEnumProperty void setMessageType(const QString & message_type); + void setMessageTypes(const std::vector & message_types); + QString getMessageType() const - {return message_type_;} + {return message_types_.empty() ? QString() : message_types_.front();} + + std::vector getMessageTypes() const + {return message_types_;} QString getTopic() const {return getValue().toString();} @@ -75,7 +81,7 @@ protected Q_SLOTS: private: ros_integration::RosNodeAbstractionIface::WeakPtr rviz_ros_node_; - QString message_type_; + std::vector message_types_; }; class RVIZ_COMMON_PUBLIC RosFilteredTopicProperty diff --git a/rviz_common/src/rviz_common/properties/ros_topic_property.cpp b/rviz_common/src/rviz_common/properties/ros_topic_property.cpp index 6a1fab396..80dcae744 100644 --- a/rviz_common/src/rviz_common/properties/ros_topic_property.cpp +++ b/rviz_common/src/rviz_common/properties/ros_topic_property.cpp @@ -51,7 +51,7 @@ RosTopicProperty::RosTopicProperty( QObject * receiver) : EditableEnumProperty(name, default_value, description, parent, changed_slot, receiver), rviz_ros_node_(), - message_type_(message_type) + message_types_({message_type}) { connect( this, SIGNAL(requestOptions(EditableEnumProperty*)), @@ -65,7 +65,13 @@ void RosTopicProperty::initialize(ros_integration::RosNodeAbstractionIface::Weak void RosTopicProperty::setMessageType(const QString & message_type) { - message_type_ = message_type; + message_types_.clear(); + message_types_.push_back(message_type); +} + +void RosTopicProperty::setMessageTypes(const std::vector & message_types) +{ + message_types_ = message_types; } void RosTopicProperty::fillTopicList() @@ -73,15 +79,17 @@ void RosTopicProperty::fillTopicList() QApplication::setOverrideCursor(QCursor(Qt::WaitCursor)); clearOptions(); - std::string std_message_type = message_type_.toStdString(); std::map> published_topics = rviz_ros_node_.lock()->get_topic_names_and_types(); for (const auto & topic : published_topics) { - // Only add topics whose type matches. for (const auto & type : topic.second) { - if (type == std_message_type) { - addOptionStd(topic.first); + for (const auto & message_type : message_types_) { + std::string std_message_type = message_type.toStdString(); + if (type == std_message_type) { + addOptionStd(topic.first); + break; + } } } } diff --git a/rviz_default_plugins/include/rviz_default_plugins/displays/image/image_transport_display.hpp b/rviz_default_plugins/include/rviz_default_plugins/displays/image/image_transport_display.hpp index f1a193c94..c6bcaede3 100644 --- a/rviz_default_plugins/include/rviz_default_plugins/displays/image/image_transport_display.hpp +++ b/rviz_default_plugins/include/rviz_default_plugins/displays/image/image_transport_display.hpp @@ -60,7 +60,14 @@ class ImageTransportDisplay : public rviz_common::_RosTopicDisplay : messages_received_(0) { QString message_type = QString::fromStdString(rosidl_generator_traits::name()); - topic_property_->setMessageType(message_type); + std::vector supported_types = { + message_type, + "sensor_msgs/msg/CompressedImage", + "ffmpeg_image_transport/msg/FFMPEGPacket", + "theora_image_transport/msg/Packet" + }; + + topic_property_->setMessageTypes(supported_types); topic_property_->setDescription(message_type + " topic to subscribe to."); } diff --git a/rviz_default_plugins/include/rviz_default_plugins/displays/pointcloud/point_cloud_transport_display.hpp b/rviz_default_plugins/include/rviz_default_plugins/displays/pointcloud/point_cloud_transport_display.hpp index 8a682d7b8..c6451dd82 100644 --- a/rviz_default_plugins/include/rviz_default_plugins/displays/pointcloud/point_cloud_transport_display.hpp +++ b/rviz_default_plugins/include/rviz_default_plugins/displays/pointcloud/point_cloud_transport_display.hpp @@ -58,7 +58,12 @@ class PointCloud2TransportDisplay : public rviz_common::_RosTopicDisplay : messages_received_(0) { QString message_type = QString::fromStdString(rosidl_generator_traits::name()); - topic_property_->setMessageType(message_type); + std::vector supported_types = { + message_type, + "point_cloud_interfaces/msg/CompressedPointCloud2" + }; + + topic_property_->setMessageTypes(supported_types); topic_property_->setDescription(message_type + " topic to subscribe to."); } diff --git a/rviz_default_plugins/plugins_description.xml b/rviz_default_plugins/plugins_description.xml index 6b0b581f6..24a7c5f47 100644 --- a/rviz_default_plugins/plugins_description.xml +++ b/rviz_default_plugins/plugins_description.xml @@ -31,8 +31,10 @@ Displays an image from a camera, with the visualized world rendered behind it. <a href="http://www.ros.org/wiki/rviz/DisplayTypes/Camera">More Information</a>. - sensor_msgs/msg/Image + ffmpeg_image_transport_msgs/msg/FFMPEGPacket sensor_msgs/msg/CompressedImage + sensor_msgs/msg/Image + theora_image_transport/msg/Packet The Image display creates a new rendering window with an image. + ffmpeg_image_transport_msgs/msg/FFMPEGPacket + sensor_msgs/msg/CompressedImage sensor_msgs/msg/Image + theora_image_transport/msg/Packet The Point Cloud2 display shows data from a (recommended) sensor_msgs/PointCloud2 message. + point_cloud_interfaces/msg/CompressedPointCloud2 sensor_msgs/msg/PointCloud2