6 #include <tf2_msgs/TFMessage.h>
10 #include <condition_variable>
23 bool tf2StaticPredicate(
const BagReader::Connection& con)
25 return con.topicInBag ==
"/tf_static" && con.type ==
"tf2_msgs/TFMessage";
32 explicit Private(
const std::vector<BagReader*>& readers)
34 for(
auto& reader : readers)
51 m_cond.wait(lock, [&]() ->
bool {
89 tf2_msgs::TFMessage
msg;
94 std::unordered_map<std::string, geometry_msgs::TransformStamped> transforms;
101 auto msg = pmsg.msg->instantiate<tf2_msgs::TFMessage>();
105 bool changed =
false;
106 for(
auto& transform : msg->transforms)
108 auto [it, inserted] = transforms.try_emplace(transform.child_frame_id, transform);
113 if(it->second != transform)
115 it->second = transform;
123 std::unique_lock lock{
m_mutex};
125 auto& entry =
m_msgs.emplace_back();
126 entry.stamp = pmsg.msg->stamp;
127 entry.msg.transforms.reserve(transforms.size());
128 for(
auto& [_, transform] : transforms)
129 entry.msg.transforms.push_back(transform);
138 std::unique_lock lock{
m_mutex};
164 : m_d{std::make_unique<Private>(readers)}
174 return m_d->fetchUpdate(time);
186 char bagfileName[] =
"/tmp/rosbag_fancy_test_XXXXXX";
188 int fd = mkstemp(bagfileName);
192 rosbag::Bag bag{bagfileName, rosbag::BagMode::Write};
195 std_msgs::Header msg;
200 std_msgs::Header msg;
202 bag.write(
"/topicB",
ros::Time(1001, 0), msg);
205 tf2_msgs::TFMessage msg;
206 msg.transforms.resize(2);
207 msg.transforms[0].header.frame_id =
"base_link";
208 msg.transforms[0].child_frame_id =
"arm_link";
209 msg.transforms[0].transform.translation.x = 1.0;
210 msg.transforms[1].header.frame_id =
"base_link";
211 msg.transforms[1].child_frame_id =
"leg_link";
212 msg.transforms[1].transform.translation.x = 4.0;
213 bag.write(
"/tf_static",
ros::Time(1002, 0), msg);
216 tf2_msgs::TFMessage msg;
217 msg.transforms.resize(1);
218 msg.transforms[0].header.frame_id =
"base_link";
219 msg.transforms[0].child_frame_id =
"arm_link";
220 msg.transforms[0].transform.translation.x = 2.0;
221 bag.write(
"/tf_static",
ros::Time(1010, 0), msg);
235 CHECK(msg->transforms.size() == 0);
238 auto msg = scanner.fetchUpdate(
ros::Time(1005));
241 REQUIRE(msg->transforms.size() == 2);
243 auto it = std::find_if(msg->transforms.begin(), msg->transforms.end(), [&](
auto& trans){ return trans.child_frame_id ==
"arm_link"; });
244 REQUIRE(it != msg->transforms.end());
248 auto msg = scanner.fetchUpdate(
ros::Time(1006));
252 auto msg = scanner.fetchUpdate(
ros::Time(1012));
255 REQUIRE(msg->transforms.size() == 2);
257 auto it = std::find_if(msg->transforms.begin(), msg->transforms.end(), [&](
auto& trans){ return trans.child_frame_id ==
"arm_link"; });
258 REQUIRE(it != msg->transforms.end());
263 auto msg = scanner.fetchUpdate(
ros::Time(1015));
268 auto msg = scanner.fetchUpdate(
ros::Time(1005));
271 REQUIRE(msg->transforms.size() == 2);
273 auto it = std::find_if(msg->transforms.begin(), msg->transforms.end(), [&](
auto& trans){ return trans.child_frame_id ==
"arm_link"; });
274 REQUIRE(it != msg->transforms.end());