Skip to content

Commit 67bd776

Browse files
authored
Add burst-mode to Player (ros2#977)
Signed-off-by: Geoffrey Biggs <[email protected]>
1 parent 9880894 commit 67bd776

File tree

6 files changed

+412
-0
lines changed

6 files changed

+412
-0
lines changed

rosbag2_interfaces/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ find_package(builtin_interfaces REQUIRED)
1313
find_package(rosidl_default_generators REQUIRED)
1414

1515
rosidl_generate_interfaces(${PROJECT_NAME}
16+
"srv/Burst.srv"
1617
"srv/GetRate.srv"
1718
"srv/IsPaused.srv"
1819
"srv/Pause.srv"

rosbag2_interfaces/srv/Burst.srv

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
uint64 num_messages # Number of messages to burst
2+
---
3+
uint64 actually_burst # Number of messages actually burst

rosbag2_transport/CMakeLists.txt

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -144,6 +144,12 @@ function(create_tests_for_rmw_implementation)
144144
LINK_LIBS rosbag2_transport
145145
AMENT_DEPS test_msgs rosbag2_test_common)
146146

147+
rosbag2_transport_add_gmock(test_burst
148+
test/rosbag2_transport/test_burst.cpp
149+
INCLUDE_DIRS $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/src/rosbag2_transport>
150+
LINK_LIBS rosbag2_transport
151+
AMENT_DEPS test_msgs rosbag2_test_common)
152+
147153
rosbag2_transport_add_gmock(test_qos
148154
test/rosbag2_transport/test_qos.cpp
149155
INCLUDE_DIRS $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>

rosbag2_transport/include/rosbag2_transport/player.hpp

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@
3636
#include "rosbag2_interfaces/srv/is_paused.hpp"
3737
#include "rosbag2_interfaces/srv/pause.hpp"
3838
#include "rosbag2_interfaces/srv/play_next.hpp"
39+
#include "rosbag2_interfaces/srv/burst.hpp"
3940
#include "rosbag2_interfaces/srv/resume.hpp"
4041
#include "rosbag2_interfaces/srv/set_rate.hpp"
4142
#include "rosbag2_interfaces/srv/seek.hpp"
@@ -129,6 +130,16 @@ class Player : public rclcpp::Node
129130
ROSBAG2_TRANSPORT_PUBLIC
130131
virtual bool play_next();
131132

133+
/// \brief Burst the next \p num_messages messages from the queue when paused.
134+
/// \param num_messages The number of messages to burst from the queue.
135+
/// \details This call will play the next \p num_messages from the queue in burst mode. The
136+
/// timing of the messages is ignored.
137+
/// \note If internal player queue is starving and storage has not been completely loaded,
138+
/// this method will wait until new element will be pushed to the queue.
139+
/// \return The number of messages that was played.
140+
ROSBAG2_TRANSPORT_PUBLIC
141+
virtual size_t burst(const size_t num_messages);
142+
132143
/// \brief Advance player to the message with closest timestamp >= time_point.
133144
/// \details This is blocking call and it will wait until current message will be published
134145
/// and message queue will be refilled.
@@ -193,6 +204,7 @@ class Player : public rclcpp::Node
193204
rclcpp::Service<rosbag2_interfaces::srv::GetRate>::SharedPtr srv_get_rate_;
194205
rclcpp::Service<rosbag2_interfaces::srv::SetRate>::SharedPtr srv_set_rate_;
195206
rclcpp::Service<rosbag2_interfaces::srv::PlayNext>::SharedPtr srv_play_next_;
207+
rclcpp::Service<rosbag2_interfaces::srv::Burst>::SharedPtr srv_burst_;
196208
rclcpp::Service<rosbag2_interfaces::srv::Seek>::SharedPtr srv_seek_;
197209

198210
// defaults

rosbag2_transport/src/rosbag2_transport/player.cpp

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -349,6 +349,21 @@ bool Player::play_next()
349349
return next_message_published;
350350
}
351351

352+
size_t Player::burst(const size_t num_messages)
353+
{
354+
uint64_t messages_played = 0;
355+
356+
for (auto ii = 0u; ii < num_messages; ++ii) {
357+
if (play_next()) {
358+
++messages_played;
359+
} else {
360+
break;
361+
}
362+
}
363+
364+
return messages_played;
365+
}
366+
352367
void Player::seek(rcutils_time_point_value_t time_point)
353368
{
354369
// Temporary stop playback in play_messages_from_queue() and block play_next()
@@ -658,6 +673,14 @@ void Player::create_control_services()
658673
{
659674
response->success = play_next();
660675
});
676+
srv_burst_ = create_service<rosbag2_interfaces::srv::Burst>(
677+
"~/burst",
678+
[this](
679+
rosbag2_interfaces::srv::Burst::Request::ConstSharedPtr request,
680+
rosbag2_interfaces::srv::Burst::Response::SharedPtr response)
681+
{
682+
response->actually_burst = burst(request->num_messages);
683+
});
661684
srv_seek_ = create_service<rosbag2_interfaces::srv::Seek>(
662685
"~/seek",
663686
[this](

0 commit comments

Comments
 (0)