10 #include <QHBoxLayout> 11 #include <QVBoxLayout> 12 #include <QDialogButtonBox> 13 #include <QScrollArea> 14 #include <QPushButton> 16 #include <QRadioButton> 18 #include <std_msgs/Header.h> 19 #include <unordered_map> 20 #include <rosgraph_msgs/Clock.h> 21 #include <QMessageBox> 29 , _publish_clock(true)
32 _publish_clock = settings.value(
"TopicPublisherROS/publish_clock",
true).toBool();
53 if (!
_node && to_enable)
100 if (all_topics.empty()){
106 std::map<std::string, QCheckBox*> checkbox;
108 for (
const auto&
topic : all_topics)
110 auto cb =
new QCheckBox(dialog);
114 cb->setChecked(
true);
118 cb->setChecked(filter_it->second);
120 cb->setFocusPolicy(Qt::NoFocus);
121 dialog->
ui()->formLayout->addRow(
new QLabel(QString::fromStdString(*
topic)), cb);
122 checkbox.insert(std::make_pair(*
topic, cb));
123 connect(dialog->
ui()->pushButtonSelect, &QPushButton::pressed, [cb]() { cb->setChecked(
true); });
124 connect(dialog->
ui()->pushButtonDeselect, &QPushButton::pressed, [cb]() { cb->setChecked(
false); });
132 if (autoconfirm || dialog->result() == QDialog::Accepted)
135 for (
const auto&
it : checkbox)
143 const std::string& topic_name =
it->first;
165 dialog->deleteLater();
168 settings.setValue(
"TopicPublisherROS/publish_clock",
_publish_clock);
174 using StringPair = std::pair<std::string, std::string>;
176 std::map<StringPair, geometry_msgs::TransformStamped> transforms;
177 std::map<StringPair, geometry_msgs::TransformStamped> static_transforms;
181 const std::string& topic_name = data_it.first;
189 if (topic_name !=
"/tf_static" && topic_name !=
"/tf")
201 auto transforms_ptr = (topic_name ==
"/tf_static") ? & static_transforms : &transforms;
203 std::vector<uint8_t> raw_buffer;
205 int initial_index = tf_data->
getIndexFromX(current_time - 2.0);
207 if (_previous_play_index < last_index && _previous_play_index > initial_index)
212 for (
size_t index = std::max(0, initial_index);
index <= last_index;
index++)
214 const std::any& any_value = tf_data->
at(
index).y;
218 if (!isRosbagMessage)
225 raw_buffer.resize(msg_instance.size());
227 msg_instance.write(ostream);
229 tf2_msgs::TFMessage tf_msg;
233 for (
const auto& stamped_transform : tf_msg.transforms)
235 const auto& parent_id = stamped_transform.header.frame_id;
236 const auto& child_id = stamped_transform.child_frame_id;
237 StringPair trans_id = std::make_pair(parent_id, child_id);
238 auto it = transforms_ptr->find(trans_id);
239 if (
it == transforms_ptr->end())
241 transforms_ptr->insert({ trans_id, stamped_transform });
243 else if (
it->second.header.stamp <= stamped_transform.header.stamp)
245 it->second = stamped_transform;
250 std::vector<geometry_msgs::TransformStamped> transforms_vector;
251 transforms_vector.reserve(transforms_ptr->size());
254 for (
auto& trans : *transforms_ptr)
258 trans.second.header.stamp = now;
260 transforms_vector.emplace_back(std::move(trans.second));
262 if( transforms_vector.size() > 0)
264 if( transforms_ptr == &transforms ){
291 const auto& topic_name = msg_instance.
getTopic();
299 std::vector<uint8_t> raw_buffer;
300 raw_buffer.resize(msg_instance.
size());
302 msg_instance.
write(ostream);
310 if (first_field->type().baseName() ==
"std_msgs/Header")
312 std_msgs::Header
msg;
323 shapeshifted->
read(istream);
329 publisher_it = res.first;
333 publisher.
publish(*shapeshifted);
343 QMessageBox::warning(
nullptr, tr(
"Disconnected!"),
344 "The roscore master cannot be detected.\n" 345 "The publisher will be disabled.");
357 const PlotDataAny& continuous_msgs = data_it->second;
364 const std::string& topic_name = data_it.first;
384 const auto& any_value = plot_any.
at(last_index).y;
395 rosgraph_msgs::Clock clock;
398 clock.clock.fromSec(current_time);
403 qDebug() <<
"error: " << current_time;
415 QMessageBox::warning(
nullptr, tr(
"Disconnected!"),
416 "The roscore master cannot be detected.\n" 417 "The publisher will be disabled.");
427 const PlotDataAny& continuous_msgs = data_it->second;
428 int current_index = continuous_msgs.
getIndexFromX(current_time);
438 const PlotDataAny& consecutive_msg = data_it->second;
441 const auto& any_value = consecutive_msg.
at(
index).y;
456 rosgraph_msgs::Clock clock;
457 clock.clock = msg_instance.getTime();
const PlotDataMapRef * _datamap
bool toPublish(const std::string &topic_name)
void filterDialog(bool autoconfirm)
const TreeNode< T > * croot() const
Constant pointer to the root of the tree.
QAction * _select_topics_to_publish
std::pair< std::string, std::string > StringPair
std::string const & getDataType() const
const std::vector< QAction * > & availableActions() override
std::shared_ptr< tf2_ros::TransformBroadcaster > _tf_broadcaster
The ShapeShifter class is a type erased container for ROS Messages. It can be used also to create gen...
int getIndexFromX(double x) const
static RosIntrospectionFactory & get()
void broadcastTF(double current_time)
ros::Publisher _clock_publisher
void read(Stream &stream)
void publish(const boost::shared_ptr< M > &message) const
void serialize(Stream &stream, const T &t)
static RosIntrospection::Parser & parser()
static std::vector< const std::string * > getTopicList()
std::shared_ptr< tf2_ros::StaticTransformBroadcaster > _tf_static_broadcaster
virtual ~TopicPublisherROS() override
virtual void updateState(double current_time) override
static ros::NodeHandlePtr getNode()
std::unordered_map< std::string, bool > _topics_to_publish
std::map< std::string, ros::Publisher > _publishers
const Point & at(size_t index) const
virtual void setEnabled(bool enabled) override
Ui::PublisherSelect * ui()
static RosIntrospection::ShapeShifter * getShapeShifter(const std::string &topic_name)
AnySeriesMap user_defined
void write(Stream &stream) const
const ROSMessageInfo * getMessageInfo(const std::string &msg_identifier) const
getMessageInfo provides some metadata amout a registered ROSMessage.
std::string const & getTopic() const
virtual void play(double interval) override
void publishAnyMsg(const rosbag::MessageInstance &msg_instance)
void deserialize(Stream &stream, T &t)
ros::Publisher advertise(ros::NodeHandle &nh, const std::string &topic, uint32_t queue_size, bool latch=false, const ros::SubscriberStatusCallback &connect_cb=ros::SubscriberStatusCallback()) const
std::vector< QAction * > _available_actions