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)
223 const auto& msg_instance = std::any_cast<rosbag::MessageInstance>(any_value);
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;
388 const auto& msg_instance = std::any_cast<rosbag::MessageInstance>(any_value);
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;
444 const auto& msg_instance = std::any_cast<rosbag::MessageInstance>(any_value);
456 rosgraph_msgs::Clock clock;
457 clock.clock = msg_instance.getTime();