From 2aff04b627e14232ac92558a2a9a3a46a2f77ae3 Mon Sep 17 00:00:00 2001 From: Mabel Zhang Date: Thu, 30 Apr 2020 00:01:47 -0400 Subject: [PATCH 01/30] change workflow to autotest feature branch Signed-off-by: Mabel Zhang --- .github/workflows/test.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 07cf8d6185..23470df314 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -3,7 +3,7 @@ on: pull_request: push: branches: - - master + - fix_unstable_play_test schedule: # Run every hour. This helps detect flakiness, # and broken external dependencies. From 668a98832f2731b4a8fbf0aa83e65a55597ada8f Mon Sep 17 00:00:00 2001 From: Mabel Zhang Date: Thu, 30 Apr 2020 00:05:40 -0400 Subject: [PATCH 02/30] revert workflow Signed-off-by: Mabel Zhang --- .github/workflows/test.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 23470df314..07cf8d6185 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -3,7 +3,7 @@ on: pull_request: push: branches: - - fix_unstable_play_test + - master schedule: # Run every hour. This helps detect flakiness, # and broken external dependencies. From c3e211d6c880e3f0d9a43fdb8092d82fa7556339 Mon Sep 17 00:00:00 2001 From: Mabel Zhang Date: Thu, 21 May 2020 04:09:11 -0400 Subject: [PATCH 03/30] command line pause option Signed-off-by: Mabel Zhang --- ros2bag/ros2bag/verb/play.py | 4 ++++ .../include/rosbag2_transport/play_options.hpp | 1 + rosbag2_transport/src/rosbag2_transport/player.cpp | 3 +++ .../src/rosbag2_transport/rosbag2_transport_python.cpp | 6 +++++- 4 files changed, 13 insertions(+), 1 deletion(-) diff --git a/ros2bag/ros2bag/verb/play.py b/ros2bag/ros2bag/verb/play.py index 147f2fd44b..1ea7e8849d 100644 --- a/ros2bag/ros2bag/verb/play.py +++ b/ros2bag/ros2bag/verb/play.py @@ -52,6 +52,9 @@ def add_arguments(self, parser, cli_name): # noqa: D102 '-l', '--loop', action='store_true', help='enables loop playback when playing a bagfile: it starts back at the beginning ' 'on reaching the end and plays indefinitely.') + parser.add_argument( + '-p', '--paused', action='store_true', + help='start rosbag2 in paused mode. No messages are played at startup.') parser.add_argument( '--remap', '-m', default='', nargs='+', help='list of topics to be remapped: in the form ' @@ -82,4 +85,5 @@ def main(self, *, args): # noqa: D102 topics=args.topics, qos_profile_overrides=qos_profile_overrides, loop=args.loop, + paused=args.paused, topic_remapping=args.remap) diff --git a/rosbag2_transport/include/rosbag2_transport/play_options.hpp b/rosbag2_transport/include/rosbag2_transport/play_options.hpp index b616a76591..208cb77a34 100644 --- a/rosbag2_transport/include/rosbag2_transport/play_options.hpp +++ b/rosbag2_transport/include/rosbag2_transport/play_options.hpp @@ -39,6 +39,7 @@ struct PlayOptions std::unordered_map topic_qos_profile_overrides = {}; bool loop = false; + bool paused = false; std::vector topic_remapping_options = {}; }; diff --git a/rosbag2_transport/src/rosbag2_transport/player.cpp b/rosbag2_transport/src/rosbag2_transport/player.cpp index 4309e46053..4bc04b9a6b 100644 --- a/rosbag2_transport/src/rosbag2_transport/player.cpp +++ b/rosbag2_transport/src/rosbag2_transport/player.cpp @@ -178,12 +178,15 @@ void Player::play_messages_until_queue_empty(const PlayOptions & options) rate = options.rate; } + static size_t counter = 0; while (message_queue_.try_dequeue(message) && rclcpp::ok()) { std::this_thread::sleep_until( start_time_ + std::chrono::duration_cast( 1.0 / rate * message.time_since_start)); if (rclcpp::ok()) { publishers_[message.message->topic_name]->publish(message.message->serialized_data); + // TODO(mabelzhang) TEMPORARY, remove when done debugging. And counter above. + fprintf(stderr, "publishing message %zu\n", (++counter)); } } } diff --git a/rosbag2_transport/src/rosbag2_transport/rosbag2_transport_python.cpp b/rosbag2_transport/src/rosbag2_transport/rosbag2_transport_python.cpp index 6c40ed2dbb..54528d8954 100644 --- a/rosbag2_transport/src/rosbag2_transport/rosbag2_transport_python.cpp +++ b/rosbag2_transport/src/rosbag2_transport/rosbag2_transport_python.cpp @@ -232,6 +232,7 @@ rosbag2_transport_play(PyObject * Py_UNUSED(self), PyObject * args, PyObject * k "topics", "qos_profile_overrides", "loop", + "paused", "topic_remapping", nullptr }; @@ -244,9 +245,10 @@ rosbag2_transport_play(PyObject * Py_UNUSED(self), PyObject * args, PyObject * k PyObject * topics = nullptr; PyObject * qos_profile_overrides{nullptr}; bool loop = false; + bool paused = false; PyObject * topic_remapping = nullptr; if (!PyArg_ParseTupleAndKeywords( - args, kwargs, "sss|kfOObO", const_cast(kwlist), + args, kwargs, "sss|kfOObbO", const_cast(kwlist), &uri, &storage_id, &node_prefix, @@ -255,6 +257,7 @@ rosbag2_transport_play(PyObject * Py_UNUSED(self), PyObject * args, PyObject * k &topics, &qos_profile_overrides, &loop, + &paused, &topic_remapping)) { return nullptr; @@ -267,6 +270,7 @@ rosbag2_transport_play(PyObject * Py_UNUSED(self), PyObject * args, PyObject * k play_options.read_ahead_queue_size = read_ahead_queue_size; play_options.rate = rate; play_options.loop = loop; + play_options.paused = paused; if (topics) { PyObject * topic_iterator = PyObject_GetIter(topics); From ef9a4c2341a6f7ccb75b9f22a919c3e23bca4ab6 Mon Sep 17 00:00:00 2001 From: Emerson Knapp <537409+emersonknapp@users.noreply.github.com> Date: Tue, 26 May 2020 10:33:41 -0700 Subject: [PATCH 04/30] Fix playback of compressed bagfiles (#417) Signed-off-by: Emerson Knapp Signed-off-by: Mabel Zhang --- .../sequential_compression_reader.cpp | 1 + .../test_sequential_compression_reader.cpp | 58 +++++++++++++------ .../rosbag2_cpp/readers/sequential_reader.hpp | 5 ++ .../rosbag2_cpp/readers/sequential_reader.cpp | 26 ++++----- 4 files changed, 59 insertions(+), 31 deletions(-) diff --git a/rosbag2_compression/src/rosbag2_compression/sequential_compression_reader.cpp b/rosbag2_compression/src/rosbag2_compression/sequential_compression_reader.cpp index e0782efadb..922bfc1822 100644 --- a/rosbag2_compression/src/rosbag2_compression/sequential_compression_reader.cpp +++ b/rosbag2_compression/src/rosbag2_compression/sequential_compression_reader.cpp @@ -90,6 +90,7 @@ void SequentialCompressionReader::open( ROSBAG2_COMPRESSION_LOG_WARN("No topics were listed in metadata."); return; } + fill_topics_metadata(); // Currently a bag file can only be played if all topics have the same serialization format. check_topics_serialization_formats(topics); diff --git a/rosbag2_compression/test/rosbag2_compression/test_sequential_compression_reader.cpp b/rosbag2_compression/test/rosbag2_compression/test_sequential_compression_reader.cpp index 409e07e25e..4a142f723b 100644 --- a/rosbag2_compression/test/rosbag2_compression/test_sequential_compression_reader.cpp +++ b/rosbag2_compression/test/rosbag2_compression/test_sequential_compression_reader.cpp @@ -54,6 +54,17 @@ class SequentialCompressionReaderTest : public Test ON_CALL(*storage_factory_, open_read_only(_, _)).WillByDefault(Return(storage_)); } + rosbag2_storage::BagMetadata construct_default_bag_metadata() const + { + rosbag2_storage::BagMetadata metadata; + metadata.relative_file_paths = {"/path/to/storage"}; + metadata.topics_with_message_count.push_back({{topic_with_type_}, 1}); + metadata.compression_format = "zstd"; + metadata.compression_mode = + rosbag2_compression::compression_mode_to_string(rosbag2_compression::CompressionMode::FILE); + return metadata; + } + std::unique_ptr> storage_factory_; std::shared_ptr> storage_; std::shared_ptr> converter_factory_; @@ -65,12 +76,8 @@ class SequentialCompressionReaderTest : public Test TEST_F(SequentialCompressionReaderTest, open_throws_if_unsupported_compressor) { - rosbag2_storage::BagMetadata metadata; - metadata.relative_file_paths = {"/path/to/storage"}; - metadata.topics_with_message_count.push_back({{topic_with_type_}, 1}); + rosbag2_storage::BagMetadata metadata = construct_default_bag_metadata(); metadata.compression_format = "bad_format"; - metadata.compression_mode = - rosbag2_compression::compression_mode_to_string(rosbag2_compression::CompressionMode::FILE); EXPECT_CALL(*metadata_io_, read_metadata(_)).WillRepeatedly(Return(metadata)); EXPECT_CALL(*metadata_io_, metadata_file_exists(_)).WillRepeatedly(Return(true)); auto compression_factory = std::make_unique(); @@ -87,14 +94,36 @@ TEST_F(SequentialCompressionReaderTest, open_throws_if_unsupported_compressor) std::invalid_argument); } +TEST_F(SequentialCompressionReaderTest, returns_all_topics_and_types) +{ + rosbag2_storage::BagMetadata metadata = construct_default_bag_metadata(); + ON_CALL(*metadata_io_, read_metadata(_)).WillByDefault(Return(metadata)); + ON_CALL(*metadata_io_, metadata_file_exists(_)).WillByDefault(Return(true)); + + auto decompressor = std::make_unique>(); + auto compression_factory = std::make_unique>(); + + ON_CALL(*compression_factory, create_decompressor(_)) + .WillByDefault(Return(ByMove(std::move(decompressor)))); + EXPECT_CALL(*compression_factory, create_decompressor(_)).Times(1); + EXPECT_CALL(*storage_factory_, open_read_only(_, _)).Times(1); + + auto compression_reader = std::make_unique( + std::move(compression_factory), + std::move(storage_factory_), + converter_factory_, + std::move(metadata_io_)); + + compression_reader->open( + rosbag2_cpp::StorageOptions(), {"", storage_serialization_format_}); + + auto topics_and_types = compression_reader->get_all_topics_and_types(); + EXPECT_FALSE(topics_and_types.empty()); +} + TEST_F(SequentialCompressionReaderTest, open_supports_zstd_compressor) { - rosbag2_storage::BagMetadata metadata; - metadata.relative_file_paths = {"/path/to/storage"}; - metadata.topics_with_message_count.push_back({{topic_with_type_}, 1}); - metadata.compression_format = "zstd"; - metadata.compression_mode = - rosbag2_compression::compression_mode_to_string(rosbag2_compression::CompressionMode::FILE); + rosbag2_storage::BagMetadata metadata = construct_default_bag_metadata(); ON_CALL(*metadata_io_, read_metadata(_)).WillByDefault(Return(metadata)); ON_CALL(*metadata_io_, metadata_file_exists(_)).WillByDefault(Return(true)); auto compression_factory = std::make_unique(); @@ -114,12 +143,7 @@ TEST_F(SequentialCompressionReaderTest, open_supports_zstd_compressor) TEST_F(SequentialCompressionReaderTest, reader_calls_create_decompressor) { - rosbag2_storage::BagMetadata metadata; - metadata.relative_file_paths = {"/path/to/storage"}; - metadata.topics_with_message_count.push_back({{topic_with_type_}, 1}); - metadata.compression_format = "zstd"; - metadata.compression_mode = - rosbag2_compression::compression_mode_to_string(rosbag2_compression::CompressionMode::FILE); + rosbag2_storage::BagMetadata metadata = construct_default_bag_metadata(); ON_CALL(*metadata_io_, read_metadata(_)).WillByDefault(Return(metadata)); ON_CALL(*metadata_io_, metadata_file_exists(_)).WillByDefault(Return(true)); diff --git a/rosbag2_cpp/include/rosbag2_cpp/readers/sequential_reader.hpp b/rosbag2_cpp/include/rosbag2_cpp/readers/sequential_reader.hpp index 1744cd2375..b2cfabec97 100644 --- a/rosbag2_cpp/include/rosbag2_cpp/readers/sequential_reader.hpp +++ b/rosbag2_cpp/include/rosbag2_cpp/readers/sequential_reader.hpp @@ -127,6 +127,11 @@ class ROSBAG2_CPP_PUBLIC SequentialReader const std::string & converter_serialization_format, const std::string & storage_serialization_format); + /** + * Fill topics_metadata_ cache vector with information from metadata_ + */ + virtual void fill_topics_metadata(); + std::unique_ptr storage_factory_{}; std::shared_ptr storage_{}; std::unique_ptr converter_{}; diff --git a/rosbag2_cpp/src/rosbag2_cpp/readers/sequential_reader.cpp b/rosbag2_cpp/src/rosbag2_cpp/readers/sequential_reader.cpp index 3086074864..f8926469cf 100644 --- a/rosbag2_cpp/src/rosbag2_cpp/readers/sequential_reader.cpp +++ b/rosbag2_cpp/src/rosbag2_cpp/readers/sequential_reader.cpp @@ -24,19 +24,6 @@ #include "rosbag2_cpp/logging.hpp" #include "rosbag2_cpp/readers/sequential_reader.hpp" -namespace -{ -void fill_topics_and_types( - const rosbag2_storage::BagMetadata & metadata, - std::vector & topics_and_types) -{ - topics_and_types.clear(); - topics_and_types.reserve(metadata.topics_with_message_count.size()); - for (const auto & topic_information : metadata.topics_with_message_count) { - topics_and_types.push_back(topic_information.topic_metadata); - } -} -} // unnamed namespace namespace rosbag2_cpp { @@ -133,7 +120,7 @@ void SequentialReader::open( ROSBAG2_CPP_LOG_WARN("No topics were listed in metadata."); return; } - fill_topics_and_types(metadata_, topics_metadata_); + fill_topics_metadata(); // Currently a bag file can only be played if all topics have the same serialization format. check_topics_serialization_formats(topics); @@ -251,5 +238,16 @@ void SequentialReader::check_converter_serialization_format( } } } + +void SequentialReader::fill_topics_metadata() +{ + rcpputils::check_true(storage_ != nullptr, "Bag is not open. Call open() before reading."); + topics_metadata_.clear(); + topics_metadata_.reserve(metadata_.topics_with_message_count.size()); + for (const auto & topic_information : metadata_.topics_with_message_count) { + topics_metadata_.push_back(topic_information.topic_metadata); + } +} + } // namespace readers } // namespace rosbag2_cpp From 50594ca5ee73474988b7effe9dcd00a498892d8e Mon Sep 17 00:00:00 2001 From: Jacob Perron Date: Tue, 26 May 2020 20:17:48 -0700 Subject: [PATCH 05/30] 0.3.0 Signed-off-by: Mabel Zhang --- ros2bag/CHANGELOG.rst | 6 ++++++ ros2bag/package.xml | 2 +- ros2bag/setup.py | 2 +- rosbag2/CHANGELOG.rst | 3 +++ rosbag2/package.xml | 2 +- rosbag2_compression/CHANGELOG.rst | 6 ++++++ rosbag2_compression/package.xml | 2 +- rosbag2_converter_default_plugins/CHANGELOG.rst | 3 +++ rosbag2_converter_default_plugins/package.xml | 2 +- rosbag2_cpp/CHANGELOG.rst | 6 ++++++ rosbag2_cpp/package.xml | 2 +- rosbag2_storage/CHANGELOG.rst | 5 +++++ rosbag2_storage/package.xml | 2 +- rosbag2_storage_default_plugins/CHANGELOG.rst | 3 +++ rosbag2_storage_default_plugins/package.xml | 2 +- rosbag2_test_common/CHANGELOG.rst | 5 +++++ rosbag2_test_common/package.xml | 2 +- rosbag2_tests/CHANGELOG.rst | 5 +++++ rosbag2_tests/package.xml | 2 +- rosbag2_transport/CHANGELOG.rst | 3 +++ rosbag2_transport/package.xml | 2 +- shared_queues_vendor/CHANGELOG.rst | 5 +++++ shared_queues_vendor/package.xml | 2 +- sqlite3_vendor/CHANGELOG.rst | 5 +++++ sqlite3_vendor/package.xml | 2 +- zstd_vendor/CHANGELOG.rst | 5 +++++ zstd_vendor/package.xml | 2 +- 27 files changed, 74 insertions(+), 14 deletions(-) diff --git a/ros2bag/CHANGELOG.rst b/ros2bag/CHANGELOG.rst index 8ee563d091..ee2d91e34b 100644 --- a/ros2bag/CHANGELOG.rst +++ b/ros2bag/CHANGELOG.rst @@ -2,6 +2,12 @@ Changelog for package ros2bag ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +0.3.0 (2020-05-26) +------------------ +* Don't allow user to specify unimplemented compression mode 'message' (`#415 `_) +* Use consistent quotes in help messages (`#416 `_) +* Contributors: Dirk Thomas, Emerson Knapp + 0.2.8 (2020-05-18) ------------------ diff --git a/ros2bag/package.xml b/ros2bag/package.xml index e7990c4830..a39df8c734 100644 --- a/ros2bag/package.xml +++ b/ros2bag/package.xml @@ -2,7 +2,7 @@ ros2bag - 0.2.8 + 0.3.0 Entry point for rosbag in ROS 2 diff --git a/ros2bag/setup.py b/ros2bag/setup.py index 5c40ca2804..1d25efc0e4 100644 --- a/ros2bag/setup.py +++ b/ros2bag/setup.py @@ -5,7 +5,7 @@ setup( name=package_name, - version='0.2.8', + version='0.3.0', packages=find_packages(exclude=['test']), data_files=[ ('share/' + package_name, ['package.xml']), diff --git a/rosbag2/CHANGELOG.rst b/rosbag2/CHANGELOG.rst index b971bd5972..9946ea9fe0 100644 --- a/rosbag2/CHANGELOG.rst +++ b/rosbag2/CHANGELOG.rst @@ -2,6 +2,9 @@ Changelog for package rosbag2 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +0.3.0 (2020-05-26) +------------------ + 0.2.8 (2020-05-18) ------------------ diff --git a/rosbag2/package.xml b/rosbag2/package.xml index d385a917c4..a9ddb1e820 100644 --- a/rosbag2/package.xml +++ b/rosbag2/package.xml @@ -1,7 +1,7 @@ rosbag2 - 0.2.8 + 0.3.0 Meta package for rosbag2 related packages Karsten Knese ROS Tooling Working Group diff --git a/rosbag2_compression/CHANGELOG.rst b/rosbag2_compression/CHANGELOG.rst index 36c53f1b72..3794c530d7 100644 --- a/rosbag2_compression/CHANGELOG.rst +++ b/rosbag2_compression/CHANGELOG.rst @@ -2,6 +2,12 @@ Changelog for package rosbag2_compression ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +0.3.0 (2020-05-26) +------------------ +* Fix playback of compressed bagfiles (`#417 `_) +* Export targets (`#403 `_) +* Contributors: Emerson Knapp, Karsten Knese + 0.2.8 (2020-05-18) ------------------ diff --git a/rosbag2_compression/package.xml b/rosbag2_compression/package.xml index 051b3b9722..8833775625 100644 --- a/rosbag2_compression/package.xml +++ b/rosbag2_compression/package.xml @@ -2,7 +2,7 @@ rosbag2_compression - 0.2.8 + 0.3.0 Compression implementations for rosbag2 bags and messages. ROS Tooling Working Group Apache License 2.0 diff --git a/rosbag2_converter_default_plugins/CHANGELOG.rst b/rosbag2_converter_default_plugins/CHANGELOG.rst index 9c6dfcd321..e42896d813 100644 --- a/rosbag2_converter_default_plugins/CHANGELOG.rst +++ b/rosbag2_converter_default_plugins/CHANGELOG.rst @@ -3,6 +3,9 @@ Changelog for package rosbag2_converter_default_plugins ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +0.3.0 (2020-05-26) +------------------ + 0.2.8 (2020-05-18) ------------------ diff --git a/rosbag2_converter_default_plugins/package.xml b/rosbag2_converter_default_plugins/package.xml index 6eff56204c..1b070c655a 100644 --- a/rosbag2_converter_default_plugins/package.xml +++ b/rosbag2_converter_default_plugins/package.xml @@ -1,7 +1,7 @@ rosbag2_converter_default_plugins - 0.2.8 + 0.3.0 Package containing default plugins for format converters Karsten Knese ROS Tooling Working Group diff --git a/rosbag2_cpp/CHANGELOG.rst b/rosbag2_cpp/CHANGELOG.rst index ab5f0b1e0f..9b22cb67d4 100644 --- a/rosbag2_cpp/CHANGELOG.rst +++ b/rosbag2_cpp/CHANGELOG.rst @@ -3,6 +3,12 @@ Changelog for package rosbag2 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +0.3.0 (2020-05-26) +------------------ +* Fix playback of compressed bagfiles (`#417 `_) +* Export targets (`#403 `_) +* Contributors: Emerson Knapp, Karsten Knese + 0.2.8 (2020-05-18) ------------------ diff --git a/rosbag2_cpp/package.xml b/rosbag2_cpp/package.xml index d4c484104a..5b04dbe1d6 100644 --- a/rosbag2_cpp/package.xml +++ b/rosbag2_cpp/package.xml @@ -1,7 +1,7 @@ rosbag2_cpp - 0.2.8 + 0.3.0 C++ ROSBag2 client library Karsten Knese ROS Tooling Working Group diff --git a/rosbag2_storage/CHANGELOG.rst b/rosbag2_storage/CHANGELOG.rst index 26c624c1f6..9b2cdbe7f1 100644 --- a/rosbag2_storage/CHANGELOG.rst +++ b/rosbag2_storage/CHANGELOG.rst @@ -3,6 +3,11 @@ Changelog for package rosbag2_storage ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +0.3.0 (2020-05-26) +------------------ +* Export targets (`#403 `_) +* Contributors: Karsten Knese + 0.2.8 (2020-05-18) ------------------ diff --git a/rosbag2_storage/package.xml b/rosbag2_storage/package.xml index de8ebca749..5f0b74629b 100644 --- a/rosbag2_storage/package.xml +++ b/rosbag2_storage/package.xml @@ -1,7 +1,7 @@ rosbag2_storage - 0.2.8 + 0.3.0 ROS2 independent storage format to store serialized ROS2 messages Karsten Knese ROS Tooling Working Group diff --git a/rosbag2_storage_default_plugins/CHANGELOG.rst b/rosbag2_storage_default_plugins/CHANGELOG.rst index 68882cd454..1a77918e34 100644 --- a/rosbag2_storage_default_plugins/CHANGELOG.rst +++ b/rosbag2_storage_default_plugins/CHANGELOG.rst @@ -3,6 +3,9 @@ Changelog for package rosbag2_storage_default_plugins ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +0.3.0 (2020-05-26) +------------------ + 0.2.8 (2020-05-18) ------------------ diff --git a/rosbag2_storage_default_plugins/package.xml b/rosbag2_storage_default_plugins/package.xml index e177572807..ec1912721e 100644 --- a/rosbag2_storage_default_plugins/package.xml +++ b/rosbag2_storage_default_plugins/package.xml @@ -1,7 +1,7 @@ rosbag2_storage_default_plugins - 0.2.8 + 0.3.0 ROSBag2 SQLite3 storage plugin Karsten Knese ROS Tooling Working Group diff --git a/rosbag2_test_common/CHANGELOG.rst b/rosbag2_test_common/CHANGELOG.rst index 7ad6fd3fb7..8018a985d8 100644 --- a/rosbag2_test_common/CHANGELOG.rst +++ b/rosbag2_test_common/CHANGELOG.rst @@ -2,6 +2,11 @@ Changelog for package rosbag2_test_common ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +0.3.0 (2020-05-26) +------------------ +* Export targets (`#403 `_) +* Contributors: Karsten Knese + 0.2.8 (2020-05-18) ------------------ diff --git a/rosbag2_test_common/package.xml b/rosbag2_test_common/package.xml index b3374e2c45..15f0402d3e 100644 --- a/rosbag2_test_common/package.xml +++ b/rosbag2_test_common/package.xml @@ -2,7 +2,7 @@ rosbag2_test_common - 0.2.8 + 0.3.0 Commonly used test helper classes and fixtures for rosbag2 Karsten Knese ROS Tooling Working Group diff --git a/rosbag2_tests/CHANGELOG.rst b/rosbag2_tests/CHANGELOG.rst index 6ff861f3d1..f9c959fc58 100644 --- a/rosbag2_tests/CHANGELOG.rst +++ b/rosbag2_tests/CHANGELOG.rst @@ -3,6 +3,11 @@ Changelog for package rosbag2_tests ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +0.3.0 (2020-05-26) +------------------ +* Export targets (`#403 `_) +* Contributors: Karsten Knese + 0.2.8 (2020-05-18) ------------------ * Disable play_filters_by_topic test (`#410 `_) diff --git a/rosbag2_tests/package.xml b/rosbag2_tests/package.xml index 4ae4c9a7a6..6724cf9781 100644 --- a/rosbag2_tests/package.xml +++ b/rosbag2_tests/package.xml @@ -2,7 +2,7 @@ rosbag2_tests - 0.2.8 + 0.3.0 Tests package for rosbag2 Karsten Knese ROS Tooling Working Group diff --git a/rosbag2_transport/CHANGELOG.rst b/rosbag2_transport/CHANGELOG.rst index a4c9ba04fd..c26a4d4303 100644 --- a/rosbag2_transport/CHANGELOG.rst +++ b/rosbag2_transport/CHANGELOG.rst @@ -3,6 +3,9 @@ Changelog for package rosbag2_transport ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +0.3.0 (2020-05-26) +------------------ + 0.2.8 (2020-05-18) ------------------ * Explicitly add DLL directories for Windows before importing (`#411 `_) diff --git a/rosbag2_transport/package.xml b/rosbag2_transport/package.xml index 334a803b9f..a9f414e705 100644 --- a/rosbag2_transport/package.xml +++ b/rosbag2_transport/package.xml @@ -2,7 +2,7 @@ rosbag2_transport - 0.2.8 + 0.3.0 Layer encapsulating ROS middleware to allow rosbag2 to be used with or without middleware Karsten Knese ROS Tooling Working Group diff --git a/shared_queues_vendor/CHANGELOG.rst b/shared_queues_vendor/CHANGELOG.rst index 7baf96d6b7..71c44fde75 100644 --- a/shared_queues_vendor/CHANGELOG.rst +++ b/shared_queues_vendor/CHANGELOG.rst @@ -3,6 +3,11 @@ Changelog for package shared_queues_vendor ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +0.3.0 (2020-05-26) +------------------ +* Export targets (`#403 `_) +* Contributors: Karsten Knese + 0.2.8 (2020-05-18) ------------------ diff --git a/shared_queues_vendor/package.xml b/shared_queues_vendor/package.xml index c618e7548a..540782ddc6 100644 --- a/shared_queues_vendor/package.xml +++ b/shared_queues_vendor/package.xml @@ -2,7 +2,7 @@ shared_queues_vendor - 0.2.8 + 0.3.0 Vendor package for concurrent queues from moodycamel Karsten Knese ROS Tooling Working Group diff --git a/sqlite3_vendor/CHANGELOG.rst b/sqlite3_vendor/CHANGELOG.rst index 1f733f05d7..3073ff98a7 100644 --- a/sqlite3_vendor/CHANGELOG.rst +++ b/sqlite3_vendor/CHANGELOG.rst @@ -3,6 +3,11 @@ Changelog for package sqlite3_vendor ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +0.3.0 (2020-05-26) +------------------ +* Export targets (`#403 `_) +* Contributors: Karsten Knese + 0.2.8 (2020-05-18) ------------------ diff --git a/sqlite3_vendor/package.xml b/sqlite3_vendor/package.xml index e30b44f4c7..d205fa27b4 100644 --- a/sqlite3_vendor/package.xml +++ b/sqlite3_vendor/package.xml @@ -2,7 +2,7 @@ sqlite3_vendor - 0.2.8 + 0.3.0 SQLite 3 vendor package Karsten Knese ROS Tooling Working Group diff --git a/zstd_vendor/CHANGELOG.rst b/zstd_vendor/CHANGELOG.rst index ca658e1873..2f42c40812 100644 --- a/zstd_vendor/CHANGELOG.rst +++ b/zstd_vendor/CHANGELOG.rst @@ -2,6 +2,11 @@ Changelog for package zstd_vendor ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +0.3.0 (2020-05-26) +------------------ +* Export targets (`#403 `_) +* Contributors: Karsten Knese + 0.2.8 (2020-05-18) ------------------ diff --git a/zstd_vendor/package.xml b/zstd_vendor/package.xml index ec67e27c4f..4f12bc04b8 100644 --- a/zstd_vendor/package.xml +++ b/zstd_vendor/package.xml @@ -2,7 +2,7 @@ zstd_vendor - 0.2.8 + 0.3.0 Zstd compression vendor package, providing a dependency for Zstd. ROS Tooling Working Group Apache License 2.0 From e321f051b30bfe84b0e103c4eff9e165c0d9bd51 Mon Sep 17 00:00:00 2001 From: Chris Lalancette Date: Thu, 28 May 2020 15:48:07 -0400 Subject: [PATCH 06/30] Shared publisher handle. (#420) Signed-off-by: Chris Lalancette Signed-off-by: Mabel Zhang --- rosbag2_transport/src/rosbag2_transport/generic_publisher.cpp | 2 +- zstd_vendor/CMakeLists.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/rosbag2_transport/src/rosbag2_transport/generic_publisher.cpp b/rosbag2_transport/src/rosbag2_transport/generic_publisher.cpp index 16b14b6c47..ac741a035d 100644 --- a/rosbag2_transport/src/rosbag2_transport/generic_publisher.cpp +++ b/rosbag2_transport/src/rosbag2_transport/generic_publisher.cpp @@ -41,7 +41,7 @@ GenericPublisher::GenericPublisher( void GenericPublisher::publish(std::shared_ptr message) { auto return_code = rcl_publish_serialized_message( - get_publisher_handle(), message.get(), NULL); + get_publisher_handle().get(), message.get(), NULL); if (return_code != RCL_RET_OK) { rclcpp::exceptions::throw_from_rcl_error(return_code, "failed to publish serialized message"); diff --git a/zstd_vendor/CMakeLists.txt b/zstd_vendor/CMakeLists.txt index 954704b7d4..d614cac5ba 100644 --- a/zstd_vendor/CMakeLists.txt +++ b/zstd_vendor/CMakeLists.txt @@ -28,7 +28,7 @@ macro(build_zstd) include(ExternalProject) # The CMakeLists.txt file for zstd is in a subdirectory. - # We need to configure the CMake command to build from there instead. + # We need to configure the CMake command to build from there instead. ExternalProject_Add(zstd-1.4.4 URL https://github.com/facebook/zstd/archive/v1.4.4.zip URL_MD5 3a5c3a535280b7f4dfdbd739fcc7173f From cf8a53a834933f3d1f8ff241fa2a5a44da8e26fc Mon Sep 17 00:00:00 2001 From: Mabel Zhang Date: Sat, 6 Jun 2020 07:03:10 -0400 Subject: [PATCH 07/30] make rosbag2_transport lifecycle node; start playback paused feature Signed-off-by: Mabel Zhang --- rosbag2_transport/CMakeLists.txt | 5 +++ rosbag2_transport/package.xml | 1 + .../src/rosbag2_transport/player.cpp | 32 +++++++++++++++++-- .../src/rosbag2_transport/player.hpp | 1 + .../src/rosbag2_transport/recorder.cpp | 6 +++- .../src/rosbag2_transport/rosbag2_node.cpp | 4 +-- .../src/rosbag2_transport/rosbag2_node.hpp | 5 +-- .../rosbag2_transport/test_rosbag2_node.cpp | 6 ++-- 8 files changed, 51 insertions(+), 9 deletions(-) diff --git a/rosbag2_transport/CMakeLists.txt b/rosbag2_transport/CMakeLists.txt index 812afb7a64..0bc9dd745f 100644 --- a/rosbag2_transport/CMakeLists.txt +++ b/rosbag2_transport/CMakeLists.txt @@ -24,6 +24,7 @@ find_package(ament_cmake REQUIRED) find_package(ament_cmake_ros REQUIRED) find_package(rcl REQUIRED) find_package(rclcpp REQUIRED) +find_package(rclcpp_lifecycle REQUIRED) find_package(rcutils REQUIRED) find_package(rmw REQUIRED) find_package(rosbag2_compression REQUIRED) @@ -46,8 +47,10 @@ target_include_directories(${PROJECT_NAME} PUBLIC $) ament_target_dependencies(${PROJECT_NAME} + lifecycle_msgs rcl rclcpp + rclcpp_lifecycle rcutils rmw rosbag2_compression @@ -120,7 +123,9 @@ function(create_tests_for_rmw_implementation) $ AMENT_DEPS ament_index_cpp + lifecycle_msgs rclcpp + rclcpp_lifecycle rosbag2_cpp rosbag2_test_common test_msgs diff --git a/rosbag2_transport/package.xml b/rosbag2_transport/package.xml index a9f414e705..a3b5a45368 100644 --- a/rosbag2_transport/package.xml +++ b/rosbag2_transport/package.xml @@ -12,6 +12,7 @@ python_cmake_module rclcpp + rclcpp_lifecycle rosbag2_compression rosbag2_cpp rmw diff --git a/rosbag2_transport/src/rosbag2_transport/player.cpp b/rosbag2_transport/src/rosbag2_transport/player.cpp index 4bc04b9a6b..69d0a8e9a2 100644 --- a/rosbag2_transport/src/rosbag2_transport/player.cpp +++ b/rosbag2_transport/src/rosbag2_transport/player.cpp @@ -25,6 +25,7 @@ #include "rcl/graph.h" #include "rclcpp/rclcpp.hpp" +#include "lifecycle_msgs/msg/state.hpp" #include "rcutils/time.h" @@ -102,6 +103,14 @@ void Player::play(const PlayOptions & options) wait_for_filled_queue(options); + rosbag2_transport_->configure(); + // If playback should not be paused in the beginning, activate lifecycle node right away. + // If playback should be paused, move on. + // Playback will detect when node is activated, either from here or externally. + if (!options.paused) { + rosbag2_transport_->activate(); + } + play_messages_from_queue(options); } @@ -157,9 +166,29 @@ void Player::enqueue_up_to_boundary(const TimePoint & time_first_message, uint64 void Player::play_messages_from_queue(const PlayOptions & options) { + if (rosbag2_transport_->get_current_state().id() != + lifecycle_msgs::msg::State::PRIMARY_STATE_ACTIVE) + { + ROSBAG2_TRANSPORT_LOG_INFO("Paused"); + getc(stdin); + rosbag2_transport_->activate(); + } + start_time_ = std::chrono::system_clock::now(); + paused_duration_ = std::chrono::nanoseconds(0); do { + // This block is not reached yet, because cannot pause during play yet + if (rosbag2_transport_->get_current_state().id() != + lifecycle_msgs::msg::State::PRIMARY_STATE_ACTIVE) + { + std::chrono::time_point pause_start = + std::chrono::system_clock::now(); + getc(stdin); + paused_duration_ += std::chrono::system_clock::now() - pause_start; + rosbag2_transport_->activate(); + } play_messages_until_queue_empty(options); + if (!is_storage_completely_loaded() && rclcpp::ok()) { ROSBAG2_TRANSPORT_LOG_WARN( "Message queue starved. Messages will be delayed. Consider " @@ -182,7 +211,7 @@ void Player::play_messages_until_queue_empty(const PlayOptions & options) while (message_queue_.try_dequeue(message) && rclcpp::ok()) { std::this_thread::sleep_until( start_time_ + std::chrono::duration_cast( - 1.0 / rate * message.time_since_start)); + 1.0 / rate * message.time_since_start + paused_duration_)); if (rclcpp::ok()) { publishers_[message.message->topic_name]->publish(message.message->serialized_data); // TODO(mabelzhang) TEMPORARY, remove when done debugging. And counter above. @@ -206,5 +235,4 @@ void Player::prepare_publishers(const PlayOptions & options) topic.name, topic.type, topic_qos))); } } - } // namespace rosbag2_transport diff --git a/rosbag2_transport/src/rosbag2_transport/player.hpp b/rosbag2_transport/src/rosbag2_transport/player.hpp index cc7a612ae1..0a21390cd4 100644 --- a/rosbag2_transport/src/rosbag2_transport/player.hpp +++ b/rosbag2_transport/src/rosbag2_transport/player.hpp @@ -66,6 +66,7 @@ class Player std::shared_ptr reader_; moodycamel::ReaderWriterQueue message_queue_; std::chrono::time_point start_time_; + std::chrono::nanoseconds paused_duration_; mutable std::future storage_loading_future_; std::shared_ptr rosbag2_transport_; std::unordered_map> publishers_; diff --git a/rosbag2_transport/src/rosbag2_transport/recorder.cpp b/rosbag2_transport/src/rosbag2_transport/recorder.cpp index 8bdf39a504..3081ce5701 100644 --- a/rosbag2_transport/src/rosbag2_transport/recorder.cpp +++ b/rosbag2_transport/src/rosbag2_transport/recorder.cpp @@ -23,6 +23,8 @@ #include #include +#include "lifecycle_msgs/msg/state.hpp" + #include "rosbag2_cpp/writer.hpp" #include "rosbag2_transport/logging.hpp" @@ -184,7 +186,9 @@ Recorder::create_subscription( void Recorder::record_messages() const { - spin(node_); + rclcpp::executors::MultiThreadedExecutor exe; + exe.add_node(node_->get_node_base_interface()); + exe.spin(); } std::string Recorder::serialized_offered_qos_profiles_for_topic(const std::string & topic_name) diff --git a/rosbag2_transport/src/rosbag2_transport/rosbag2_node.cpp b/rosbag2_transport/src/rosbag2_transport/rosbag2_node.cpp index 6a2b92dd6b..4256bcace8 100644 --- a/rosbag2_transport/src/rosbag2_transport/rosbag2_node.cpp +++ b/rosbag2_transport/src/rosbag2_transport/rosbag2_node.cpp @@ -34,11 +34,11 @@ namespace rosbag2_transport { Rosbag2Node::Rosbag2Node(const std::string & node_name) -: rclcpp::Node(node_name) +: rclcpp_lifecycle::LifecycleNode(node_name) {} Rosbag2Node::Rosbag2Node(const std::string & node_name, const rclcpp::NodeOptions & options) -: rclcpp::Node(node_name, options) +: rclcpp_lifecycle::LifecycleNode(node_name, options) {} std::shared_ptr Rosbag2Node::create_generic_publisher( diff --git a/rosbag2_transport/src/rosbag2_transport/rosbag2_node.hpp b/rosbag2_transport/src/rosbag2_transport/rosbag2_node.hpp index 785f8688d2..96a2bac578 100644 --- a/rosbag2_transport/src/rosbag2_transport/rosbag2_node.hpp +++ b/rosbag2_transport/src/rosbag2_transport/rosbag2_node.hpp @@ -21,9 +21,10 @@ #include #include -#include "rclcpp/node.hpp" +#include "rclcpp/rclcpp.hpp" #include "rclcpp/serialized_message.hpp" #include "rclcpp/node_options.hpp" +#include "rclcpp_lifecycle/lifecycle_node.hpp" #include "rcpputils/shared_library.hpp" #include "rcutils/types.h" @@ -33,7 +34,7 @@ namespace rosbag2_transport { -class Rosbag2Node : public rclcpp::Node +class Rosbag2Node : public rclcpp_lifecycle::LifecycleNode { public: explicit Rosbag2Node(const std::string & node_name); diff --git a/rosbag2_transport/test/rosbag2_transport/test_rosbag2_node.cpp b/rosbag2_transport/test/rosbag2_transport/test_rosbag2_node.cpp index 961ca08ace..546deb9e49 100644 --- a/rosbag2_transport/test/rosbag2_transport/test_rosbag2_node.cpp +++ b/rosbag2_transport/test/rosbag2_transport/test_rosbag2_node.cpp @@ -46,6 +46,7 @@ class RosBag2NodeFixture : public Test RosBag2NodeFixture() { node_ = std::make_shared("rosbag2"); + exe_.add_node(node_->get_node_base_interface()); publisher_node_ = std::make_shared( "publisher_node", rclcpp::NodeOptions().start_parameter_event_publisher(false)); @@ -83,7 +84,7 @@ class RosBag2NodeFixture : public Test }); while (counter < expected_messages_number) { - rclcpp::spin_some(node_); + exe_.spin_some(); } return messages; } @@ -110,13 +111,14 @@ class RosBag2NodeFixture : public Test if ((clock::now() - start) > timeout) { return false; } - rclcpp::spin_some(node_); + exe_.spin_some(); } return true; } MemoryManagement memory_management_; std::shared_ptr node_; + rclcpp::executors::MultiThreadedExecutor exe_; rclcpp::Node::SharedPtr publisher_node_; std::vector> publishers_; }; From bad9ca1f22f217720d540ff479a32be253abdf51 Mon Sep 17 00:00:00 2001 From: Karsten Knese Date: Mon, 1 Jun 2020 08:50:04 -0700 Subject: [PATCH 08/30] find rosbag2_cpp (tinyxml2) before rcl (#423) Signed-off-by: Karsten Knese Signed-off-by: Mabel Zhang --- rosbag2_transport/CMakeLists.txt | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/rosbag2_transport/CMakeLists.txt b/rosbag2_transport/CMakeLists.txt index 0bc9dd745f..d0d7707b79 100644 --- a/rosbag2_transport/CMakeLists.txt +++ b/rosbag2_transport/CMakeLists.txt @@ -22,13 +22,15 @@ endif() find_package(ament_cmake REQUIRED) find_package(ament_cmake_ros REQUIRED) +# TODO(Karsten1987) rosbag2_cpp has to be found first here +# See https://github.com/ros2/ros2/issues/927 +find_package(rosbag2_cpp REQUIRED) find_package(rcl REQUIRED) find_package(rclcpp REQUIRED) find_package(rclcpp_lifecycle REQUIRED) find_package(rcutils REQUIRED) find_package(rmw REQUIRED) find_package(rosbag2_compression REQUIRED) -find_package(rosbag2_cpp REQUIRED) find_package(rmw_implementation_cmake REQUIRED) find_package(shared_queues_vendor REQUIRED) find_package(yaml_cpp_vendor REQUIRED) From 50a2c07facc77fbabd6d5849167ebd2011d8052b Mon Sep 17 00:00:00 2001 From: Jacob Perron Date: Mon, 1 Jun 2020 11:19:53 -0700 Subject: [PATCH 09/30] 0.3.1 Signed-off-by: Mabel Zhang --- ros2bag/CHANGELOG.rst | 3 +++ ros2bag/package.xml | 2 +- ros2bag/setup.py | 2 +- rosbag2/CHANGELOG.rst | 3 +++ rosbag2/package.xml | 2 +- rosbag2_compression/CHANGELOG.rst | 3 +++ rosbag2_compression/package.xml | 2 +- rosbag2_converter_default_plugins/CHANGELOG.rst | 3 +++ rosbag2_converter_default_plugins/package.xml | 2 +- rosbag2_cpp/CHANGELOG.rst | 3 +++ rosbag2_cpp/package.xml | 2 +- rosbag2_storage/CHANGELOG.rst | 3 +++ rosbag2_storage/package.xml | 2 +- rosbag2_storage_default_plugins/CHANGELOG.rst | 3 +++ rosbag2_storage_default_plugins/package.xml | 2 +- rosbag2_test_common/CHANGELOG.rst | 3 +++ rosbag2_test_common/package.xml | 2 +- rosbag2_tests/CHANGELOG.rst | 3 +++ rosbag2_tests/package.xml | 2 +- rosbag2_transport/CHANGELOG.rst | 6 ++++++ rosbag2_transport/package.xml | 2 +- shared_queues_vendor/CHANGELOG.rst | 3 +++ shared_queues_vendor/package.xml | 2 +- sqlite3_vendor/CHANGELOG.rst | 3 +++ sqlite3_vendor/package.xml | 2 +- zstd_vendor/CHANGELOG.rst | 5 +++++ zstd_vendor/package.xml | 2 +- 27 files changed, 58 insertions(+), 14 deletions(-) diff --git a/ros2bag/CHANGELOG.rst b/ros2bag/CHANGELOG.rst index ee2d91e34b..87894bd779 100644 --- a/ros2bag/CHANGELOG.rst +++ b/ros2bag/CHANGELOG.rst @@ -2,6 +2,9 @@ Changelog for package ros2bag ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +0.3.1 (2020-06-01) +------------------ + 0.3.0 (2020-05-26) ------------------ * Don't allow user to specify unimplemented compression mode 'message' (`#415 `_) diff --git a/ros2bag/package.xml b/ros2bag/package.xml index a39df8c734..e6fe27ee49 100644 --- a/ros2bag/package.xml +++ b/ros2bag/package.xml @@ -2,7 +2,7 @@ ros2bag - 0.3.0 + 0.3.1 Entry point for rosbag in ROS 2 diff --git a/ros2bag/setup.py b/ros2bag/setup.py index 1d25efc0e4..0261120b28 100644 --- a/ros2bag/setup.py +++ b/ros2bag/setup.py @@ -5,7 +5,7 @@ setup( name=package_name, - version='0.3.0', + version='0.3.1', packages=find_packages(exclude=['test']), data_files=[ ('share/' + package_name, ['package.xml']), diff --git a/rosbag2/CHANGELOG.rst b/rosbag2/CHANGELOG.rst index 9946ea9fe0..d7f92e40fd 100644 --- a/rosbag2/CHANGELOG.rst +++ b/rosbag2/CHANGELOG.rst @@ -2,6 +2,9 @@ Changelog for package rosbag2 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +0.3.1 (2020-06-01) +------------------ + 0.3.0 (2020-05-26) ------------------ diff --git a/rosbag2/package.xml b/rosbag2/package.xml index a9ddb1e820..2c3f07bcc8 100644 --- a/rosbag2/package.xml +++ b/rosbag2/package.xml @@ -1,7 +1,7 @@ rosbag2 - 0.3.0 + 0.3.1 Meta package for rosbag2 related packages Karsten Knese ROS Tooling Working Group diff --git a/rosbag2_compression/CHANGELOG.rst b/rosbag2_compression/CHANGELOG.rst index 3794c530d7..a91a32a4b7 100644 --- a/rosbag2_compression/CHANGELOG.rst +++ b/rosbag2_compression/CHANGELOG.rst @@ -2,6 +2,9 @@ Changelog for package rosbag2_compression ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +0.3.1 (2020-06-01) +------------------ + 0.3.0 (2020-05-26) ------------------ * Fix playback of compressed bagfiles (`#417 `_) diff --git a/rosbag2_compression/package.xml b/rosbag2_compression/package.xml index 8833775625..aedd83f73e 100644 --- a/rosbag2_compression/package.xml +++ b/rosbag2_compression/package.xml @@ -2,7 +2,7 @@ rosbag2_compression - 0.3.0 + 0.3.1 Compression implementations for rosbag2 bags and messages. ROS Tooling Working Group Apache License 2.0 diff --git a/rosbag2_converter_default_plugins/CHANGELOG.rst b/rosbag2_converter_default_plugins/CHANGELOG.rst index e42896d813..d0e431f4d6 100644 --- a/rosbag2_converter_default_plugins/CHANGELOG.rst +++ b/rosbag2_converter_default_plugins/CHANGELOG.rst @@ -3,6 +3,9 @@ Changelog for package rosbag2_converter_default_plugins ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +0.3.1 (2020-06-01) +------------------ + 0.3.0 (2020-05-26) ------------------ diff --git a/rosbag2_converter_default_plugins/package.xml b/rosbag2_converter_default_plugins/package.xml index 1b070c655a..05f9bb0667 100644 --- a/rosbag2_converter_default_plugins/package.xml +++ b/rosbag2_converter_default_plugins/package.xml @@ -1,7 +1,7 @@ rosbag2_converter_default_plugins - 0.3.0 + 0.3.1 Package containing default plugins for format converters Karsten Knese ROS Tooling Working Group diff --git a/rosbag2_cpp/CHANGELOG.rst b/rosbag2_cpp/CHANGELOG.rst index 9b22cb67d4..7c83f2f1ce 100644 --- a/rosbag2_cpp/CHANGELOG.rst +++ b/rosbag2_cpp/CHANGELOG.rst @@ -3,6 +3,9 @@ Changelog for package rosbag2 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +0.3.1 (2020-06-01) +------------------ + 0.3.0 (2020-05-26) ------------------ * Fix playback of compressed bagfiles (`#417 `_) diff --git a/rosbag2_cpp/package.xml b/rosbag2_cpp/package.xml index 5b04dbe1d6..957b8446a1 100644 --- a/rosbag2_cpp/package.xml +++ b/rosbag2_cpp/package.xml @@ -1,7 +1,7 @@ rosbag2_cpp - 0.3.0 + 0.3.1 C++ ROSBag2 client library Karsten Knese ROS Tooling Working Group diff --git a/rosbag2_storage/CHANGELOG.rst b/rosbag2_storage/CHANGELOG.rst index 9b2cdbe7f1..ed75ab2175 100644 --- a/rosbag2_storage/CHANGELOG.rst +++ b/rosbag2_storage/CHANGELOG.rst @@ -3,6 +3,9 @@ Changelog for package rosbag2_storage ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +0.3.1 (2020-06-01) +------------------ + 0.3.0 (2020-05-26) ------------------ * Export targets (`#403 `_) diff --git a/rosbag2_storage/package.xml b/rosbag2_storage/package.xml index 5f0b74629b..107b754395 100644 --- a/rosbag2_storage/package.xml +++ b/rosbag2_storage/package.xml @@ -1,7 +1,7 @@ rosbag2_storage - 0.3.0 + 0.3.1 ROS2 independent storage format to store serialized ROS2 messages Karsten Knese ROS Tooling Working Group diff --git a/rosbag2_storage_default_plugins/CHANGELOG.rst b/rosbag2_storage_default_plugins/CHANGELOG.rst index 1a77918e34..b75b3b31b9 100644 --- a/rosbag2_storage_default_plugins/CHANGELOG.rst +++ b/rosbag2_storage_default_plugins/CHANGELOG.rst @@ -3,6 +3,9 @@ Changelog for package rosbag2_storage_default_plugins ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +0.3.1 (2020-06-01) +------------------ + 0.3.0 (2020-05-26) ------------------ diff --git a/rosbag2_storage_default_plugins/package.xml b/rosbag2_storage_default_plugins/package.xml index ec1912721e..5f6c52f65b 100644 --- a/rosbag2_storage_default_plugins/package.xml +++ b/rosbag2_storage_default_plugins/package.xml @@ -1,7 +1,7 @@ rosbag2_storage_default_plugins - 0.3.0 + 0.3.1 ROSBag2 SQLite3 storage plugin Karsten Knese ROS Tooling Working Group diff --git a/rosbag2_test_common/CHANGELOG.rst b/rosbag2_test_common/CHANGELOG.rst index 8018a985d8..c30f9610e7 100644 --- a/rosbag2_test_common/CHANGELOG.rst +++ b/rosbag2_test_common/CHANGELOG.rst @@ -2,6 +2,9 @@ Changelog for package rosbag2_test_common ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +0.3.1 (2020-06-01) +------------------ + 0.3.0 (2020-05-26) ------------------ * Export targets (`#403 `_) diff --git a/rosbag2_test_common/package.xml b/rosbag2_test_common/package.xml index 15f0402d3e..98ed07d43e 100644 --- a/rosbag2_test_common/package.xml +++ b/rosbag2_test_common/package.xml @@ -2,7 +2,7 @@ rosbag2_test_common - 0.3.0 + 0.3.1 Commonly used test helper classes and fixtures for rosbag2 Karsten Knese ROS Tooling Working Group diff --git a/rosbag2_tests/CHANGELOG.rst b/rosbag2_tests/CHANGELOG.rst index f9c959fc58..9bc15ee0a1 100644 --- a/rosbag2_tests/CHANGELOG.rst +++ b/rosbag2_tests/CHANGELOG.rst @@ -3,6 +3,9 @@ Changelog for package rosbag2_tests ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +0.3.1 (2020-06-01) +------------------ + 0.3.0 (2020-05-26) ------------------ * Export targets (`#403 `_) diff --git a/rosbag2_tests/package.xml b/rosbag2_tests/package.xml index 6724cf9781..334c1a50fa 100644 --- a/rosbag2_tests/package.xml +++ b/rosbag2_tests/package.xml @@ -2,7 +2,7 @@ rosbag2_tests - 0.3.0 + 0.3.1 Tests package for rosbag2 Karsten Knese ROS Tooling Working Group diff --git a/rosbag2_transport/CHANGELOG.rst b/rosbag2_transport/CHANGELOG.rst index c26a4d4303..049db8f70f 100644 --- a/rosbag2_transport/CHANGELOG.rst +++ b/rosbag2_transport/CHANGELOG.rst @@ -3,6 +3,12 @@ Changelog for package rosbag2_transport ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +0.3.1 (2020-06-01) +------------------ +* Find rosbag2_cpp (tinyxml2) before rcl (`#423 `_) +* Shared publisher handle (`#420 `_) +* Contributors: Chris Lalancette, Karsten Knese + 0.3.0 (2020-05-26) ------------------ diff --git a/rosbag2_transport/package.xml b/rosbag2_transport/package.xml index a3b5a45368..c6c990f7d9 100644 --- a/rosbag2_transport/package.xml +++ b/rosbag2_transport/package.xml @@ -2,7 +2,7 @@ rosbag2_transport - 0.3.0 + 0.3.1 Layer encapsulating ROS middleware to allow rosbag2 to be used with or without middleware Karsten Knese ROS Tooling Working Group diff --git a/shared_queues_vendor/CHANGELOG.rst b/shared_queues_vendor/CHANGELOG.rst index 71c44fde75..0cfc8e51a7 100644 --- a/shared_queues_vendor/CHANGELOG.rst +++ b/shared_queues_vendor/CHANGELOG.rst @@ -3,6 +3,9 @@ Changelog for package shared_queues_vendor ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +0.3.1 (2020-06-01) +------------------ + 0.3.0 (2020-05-26) ------------------ * Export targets (`#403 `_) diff --git a/shared_queues_vendor/package.xml b/shared_queues_vendor/package.xml index 540782ddc6..d29bce707d 100644 --- a/shared_queues_vendor/package.xml +++ b/shared_queues_vendor/package.xml @@ -2,7 +2,7 @@ shared_queues_vendor - 0.3.0 + 0.3.1 Vendor package for concurrent queues from moodycamel Karsten Knese ROS Tooling Working Group diff --git a/sqlite3_vendor/CHANGELOG.rst b/sqlite3_vendor/CHANGELOG.rst index 3073ff98a7..e92302421e 100644 --- a/sqlite3_vendor/CHANGELOG.rst +++ b/sqlite3_vendor/CHANGELOG.rst @@ -3,6 +3,9 @@ Changelog for package sqlite3_vendor ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +0.3.1 (2020-06-01) +------------------ + 0.3.0 (2020-05-26) ------------------ * Export targets (`#403 `_) diff --git a/sqlite3_vendor/package.xml b/sqlite3_vendor/package.xml index d205fa27b4..8f25ba501d 100644 --- a/sqlite3_vendor/package.xml +++ b/sqlite3_vendor/package.xml @@ -2,7 +2,7 @@ sqlite3_vendor - 0.3.0 + 0.3.1 SQLite 3 vendor package Karsten Knese ROS Tooling Working Group diff --git a/zstd_vendor/CHANGELOG.rst b/zstd_vendor/CHANGELOG.rst index 2f42c40812..149aa79723 100644 --- a/zstd_vendor/CHANGELOG.rst +++ b/zstd_vendor/CHANGELOG.rst @@ -2,6 +2,11 @@ Changelog for package zstd_vendor ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +0.3.1 (2020-06-01) +------------------ +* Shared publisher handle (`#420 `_) +* Contributors: Chris Lalancette + 0.3.0 (2020-05-26) ------------------ * Export targets (`#403 `_) diff --git a/zstd_vendor/package.xml b/zstd_vendor/package.xml index 4f12bc04b8..3d12234024 100644 --- a/zstd_vendor/package.xml +++ b/zstd_vendor/package.xml @@ -2,7 +2,7 @@ zstd_vendor - 0.3.0 + 0.3.1 Zstd compression vendor package, providing a dependency for Zstd. ROS Tooling Working Group Apache License 2.0 From d995789d90e6c2f6ac50fbbbb31ac7e4f0904346 Mon Sep 17 00:00:00 2001 From: Anas Abou Allaban Date: Wed, 3 Jun 2020 13:48:58 -0400 Subject: [PATCH 10/30] Make split size error clearer (#428) Signed-off-by: Anas Abou Allaban Signed-off-by: Mabel Zhang --- .../rosbag2_compression/sequential_compression_writer.cpp | 6 ++++-- rosbag2_cpp/src/rosbag2_cpp/writers/sequential_writer.cpp | 6 ++++-- rosbag2_cpp/test/rosbag2_cpp/test_sequential_writer.cpp | 2 +- 3 files changed, 9 insertions(+), 5 deletions(-) diff --git a/rosbag2_compression/src/rosbag2_compression/sequential_compression_writer.cpp b/rosbag2_compression/src/rosbag2_compression/sequential_compression_writer.cpp index 37fd95fa32..78ee9946d3 100644 --- a/rosbag2_compression/src/rosbag2_compression/sequential_compression_writer.cpp +++ b/rosbag2_compression/src/rosbag2_compression/sequential_compression_writer.cpp @@ -121,8 +121,10 @@ void SequentialCompressionWriter::open( if (storage_options.max_bagfile_size != 0 && storage_options.max_bagfile_size < storage_->get_minimum_split_file_size()) { - throw std::invalid_argument{ - "Invalid bag splitting size given. Please provide a different value."}; + std::stringstream error; + error << "Invalid bag splitting size given. Please provide a value greater than " << + storage_->get_minimum_split_file_size(); + throw std::runtime_error{error.str()}; } setup_compression(); diff --git a/rosbag2_cpp/src/rosbag2_cpp/writers/sequential_writer.cpp b/rosbag2_cpp/src/rosbag2_cpp/writers/sequential_writer.cpp index 63da817f06..9fd5bdda73 100644 --- a/rosbag2_cpp/src/rosbag2_cpp/writers/sequential_writer.cpp +++ b/rosbag2_cpp/src/rosbag2_cpp/writers/sequential_writer.cpp @@ -105,8 +105,10 @@ void SequentialWriter::open( if (max_bagfile_size_ != 0 && max_bagfile_size_ < storage_->get_minimum_split_file_size()) { - throw std::runtime_error( - "Invalid bag splitting size given. Please provide a different value."); + std::stringstream error; + error << "Invalid bag splitting size given. Please provide a value greater than " << + storage_->get_minimum_split_file_size(); + throw std::runtime_error{error.str()}; } init_metadata(); diff --git a/rosbag2_cpp/test/rosbag2_cpp/test_sequential_writer.cpp b/rosbag2_cpp/test/rosbag2_cpp/test_sequential_writer.cpp index d0ac834921..aa3665dfbf 100644 --- a/rosbag2_cpp/test/rosbag2_cpp/test_sequential_writer.cpp +++ b/rosbag2_cpp/test/rosbag2_cpp/test_sequential_writer.cpp @@ -154,7 +154,7 @@ TEST_F(SequentialWriterTest, open_throws_error_on_invalid_splitting_size) { ON_CALL(*storage_, get_minimum_split_file_size()).WillByDefault(Return(min_split_file_size)); storage_options_.max_bagfile_size = max_bagfile_size; - EXPECT_CALL(*storage_, get_minimum_split_file_size).Times(1); + EXPECT_CALL(*storage_, get_minimum_split_file_size).Times(2); std::string rmw_format = "rmw_format"; From f22fe44db271a6aebfd0dab2b06329922e10e0e3 Mon Sep 17 00:00:00 2001 From: Anas Abou Allaban Date: Wed, 3 Jun 2020 17:46:00 -0400 Subject: [PATCH 11/30] Add user provided split size to error (#430) * Add user provided split size to error Signed-off-by: Anas Abou Allaban Signed-off-by: Mabel Zhang --- .../sequential_compression_writer.cpp | 3 ++- .../test_sequential_compression_writer.cpp | 26 +++++++++++++++++++ .../rosbag2_cpp/writers/sequential_writer.cpp | 3 ++- .../rosbag2_cpp/test_sequential_writer.cpp | 2 +- 4 files changed, 31 insertions(+), 3 deletions(-) diff --git a/rosbag2_compression/src/rosbag2_compression/sequential_compression_writer.cpp b/rosbag2_compression/src/rosbag2_compression/sequential_compression_writer.cpp index 78ee9946d3..bd756a2156 100644 --- a/rosbag2_compression/src/rosbag2_compression/sequential_compression_writer.cpp +++ b/rosbag2_compression/src/rosbag2_compression/sequential_compression_writer.cpp @@ -123,7 +123,8 @@ void SequentialCompressionWriter::open( { std::stringstream error; error << "Invalid bag splitting size given. Please provide a value greater than " << - storage_->get_minimum_split_file_size(); + storage_->get_minimum_split_file_size() << ". Specified value of " << + storage_options.max_bagfile_size; throw std::runtime_error{error.str()}; } diff --git a/rosbag2_compression/test/rosbag2_compression/test_sequential_compression_writer.cpp b/rosbag2_compression/test/rosbag2_compression/test_sequential_compression_writer.cpp index de2d0a12ae..b1b9c7c763 100644 --- a/rosbag2_compression/test/rosbag2_compression/test_sequential_compression_writer.cpp +++ b/rosbag2_compression/test/rosbag2_compression/test_sequential_compression_writer.cpp @@ -77,6 +77,32 @@ TEST_F(SequentialCompressionWriterTest, open_throws_on_bad_compression_format) std::invalid_argument); } +TEST_F(SequentialCompressionWriterTest, open_throws_on_invalid_splitting_size) +{ + rosbag2_compression::CompressionOptions compression_options{ + "zstd", rosbag2_compression::CompressionMode::FILE}; + auto compression_factory = std::make_unique(); + + // Set minimum file size greater than max bagfile size option + const uint64_t min_split_file_size = 10; + const uint64_t max_bagfile_size = 5; + ON_CALL(*storage_, get_minimum_split_file_size()).WillByDefault(Return(min_split_file_size)); + auto storage_options = rosbag2_cpp::StorageOptions{}; + storage_options.max_bagfile_size = max_bagfile_size; + + auto sequential_writer = std::make_unique( + compression_options, + std::move(compression_factory), + std::move(storage_factory_), + converter_factory_, + std::move(metadata_io_)); + writer_ = std::make_unique(std::move(sequential_writer)); + + EXPECT_THROW( + writer_->open(storage_options, {serialization_format_, serialization_format_}), + std::runtime_error); +} + TEST_F(SequentialCompressionWriterTest, open_succeeds_on_supported_compression_format) { rosbag2_compression::CompressionOptions compression_options{ diff --git a/rosbag2_cpp/src/rosbag2_cpp/writers/sequential_writer.cpp b/rosbag2_cpp/src/rosbag2_cpp/writers/sequential_writer.cpp index 9fd5bdda73..e995126edb 100644 --- a/rosbag2_cpp/src/rosbag2_cpp/writers/sequential_writer.cpp +++ b/rosbag2_cpp/src/rosbag2_cpp/writers/sequential_writer.cpp @@ -107,7 +107,8 @@ void SequentialWriter::open( { std::stringstream error; error << "Invalid bag splitting size given. Please provide a value greater than " << - storage_->get_minimum_split_file_size(); + storage_->get_minimum_split_file_size() << ". Specified value of " << + storage_options.max_bagfile_size; throw std::runtime_error{error.str()}; } diff --git a/rosbag2_cpp/test/rosbag2_cpp/test_sequential_writer.cpp b/rosbag2_cpp/test/rosbag2_cpp/test_sequential_writer.cpp index aa3665dfbf..c9631662ad 100644 --- a/rosbag2_cpp/test/rosbag2_cpp/test_sequential_writer.cpp +++ b/rosbag2_cpp/test/rosbag2_cpp/test_sequential_writer.cpp @@ -158,7 +158,7 @@ TEST_F(SequentialWriterTest, open_throws_error_on_invalid_splitting_size) { std::string rmw_format = "rmw_format"; - EXPECT_ANY_THROW(writer_->open(storage_options_, {rmw_format, rmw_format})); + EXPECT_THROW(writer_->open(storage_options_, {rmw_format, rmw_format}), std::runtime_error); } TEST_F(SequentialWriterTest, bagfile_size_is_checked_on_every_write) { From a44d5c32b147551a3cff0f667d1bc28e6aea478d Mon Sep 17 00:00:00 2001 From: Jacob Perron Date: Wed, 3 Jun 2020 15:13:56 -0700 Subject: [PATCH 12/30] Improve help message for CLI verbs (#427) * Improve help message for CLI verbs Signed-off-by: Jacob Perron * Apply suggestion from review Signed-off-by: Jacob Perron Signed-off-by: Mabel Zhang --- ros2bag/ros2bag/verb/info.py | 2 +- ros2bag/ros2bag/verb/play.py | 2 +- ros2bag/ros2bag/verb/record.py | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/ros2bag/ros2bag/verb/info.py b/ros2bag/ros2bag/verb/info.py index 210ac76781..eaf7566306 100644 --- a/ros2bag/ros2bag/verb/info.py +++ b/ros2bag/ros2bag/verb/info.py @@ -18,7 +18,7 @@ class InfoVerb(VerbExtension): - """ros2 bag info.""" + """Print information about a bag to the screen.""" def add_arguments(self, parser, cli_name): # noqa: D102 parser.add_argument( diff --git a/ros2bag/ros2bag/verb/play.py b/ros2bag/ros2bag/verb/play.py index 1ea7e8849d..2a7f2fc0da 100644 --- a/ros2bag/ros2bag/verb/play.py +++ b/ros2bag/ros2bag/verb/play.py @@ -25,7 +25,7 @@ class PlayVerb(VerbExtension): - """ros2 bag play.""" + """Play back ROS data from a bag.""" def add_arguments(self, parser, cli_name): # noqa: D102 parser.add_argument( diff --git a/ros2bag/ros2bag/verb/record.py b/ros2bag/ros2bag/verb/record.py index 211a4eefdc..a76fa2452b 100644 --- a/ros2bag/ros2bag/verb/record.py +++ b/ros2bag/ros2bag/verb/record.py @@ -26,7 +26,7 @@ class RecordVerb(VerbExtension): - """ros2 bag record.""" + """Record ROS data to a bag.""" def add_arguments(self, parser, cli_name): # noqa: D102 parser.add_argument( From bac141ddced8ecc31c542ebc4d2b328e9ca8393f Mon Sep 17 00:00:00 2001 From: Karsten Knese Date: Wed, 3 Jun 2020 15:31:24 -0700 Subject: [PATCH 13/30] generate changelog Signed-off-by: Karsten Knese Signed-off-by: Mabel Zhang --- ros2bag/CHANGELOG.rst | 5 +++++ rosbag2/CHANGELOG.rst | 3 +++ rosbag2_compression/CHANGELOG.rst | 5 +++++ rosbag2_converter_default_plugins/CHANGELOG.rst | 3 +++ rosbag2_cpp/CHANGELOG.rst | 9 +++++++++ rosbag2_storage/CHANGELOG.rst | 3 +++ rosbag2_storage_default_plugins/CHANGELOG.rst | 3 +++ rosbag2_test_common/CHANGELOG.rst | 3 +++ rosbag2_tests/CHANGELOG.rst | 3 +++ rosbag2_transport/CHANGELOG.rst | 3 +++ shared_queues_vendor/CHANGELOG.rst | 3 +++ sqlite3_vendor/CHANGELOG.rst | 3 +++ zstd_vendor/CHANGELOG.rst | 3 +++ 13 files changed, 49 insertions(+) diff --git a/ros2bag/CHANGELOG.rst b/ros2bag/CHANGELOG.rst index 87894bd779..e5467ce5c8 100644 --- a/ros2bag/CHANGELOG.rst +++ b/ros2bag/CHANGELOG.rst @@ -2,6 +2,11 @@ Changelog for package ros2bag ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Forthcoming +----------- +* Improve help message for CLI verbs (`#427 `_) +* Contributors: Jacob Perron + 0.3.1 (2020-06-01) ------------------ diff --git a/rosbag2/CHANGELOG.rst b/rosbag2/CHANGELOG.rst index d7f92e40fd..926d4c8703 100644 --- a/rosbag2/CHANGELOG.rst +++ b/rosbag2/CHANGELOG.rst @@ -2,6 +2,9 @@ Changelog for package rosbag2 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Forthcoming +----------- + 0.3.1 (2020-06-01) ------------------ diff --git a/rosbag2_compression/CHANGELOG.rst b/rosbag2_compression/CHANGELOG.rst index a91a32a4b7..5fab47cf8f 100644 --- a/rosbag2_compression/CHANGELOG.rst +++ b/rosbag2_compression/CHANGELOG.rst @@ -2,6 +2,11 @@ Changelog for package rosbag2_compression ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Forthcoming +----------- +* Add user provided split size to error message (`#430 `_) +* Contributors: Anas Abou Allaban + 0.3.1 (2020-06-01) ------------------ diff --git a/rosbag2_converter_default_plugins/CHANGELOG.rst b/rosbag2_converter_default_plugins/CHANGELOG.rst index d0e431f4d6..0628415ee2 100644 --- a/rosbag2_converter_default_plugins/CHANGELOG.rst +++ b/rosbag2_converter_default_plugins/CHANGELOG.rst @@ -3,6 +3,9 @@ Changelog for package rosbag2_converter_default_plugins ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Forthcoming +----------- + 0.3.1 (2020-06-01) ------------------ diff --git a/rosbag2_cpp/CHANGELOG.rst b/rosbag2_cpp/CHANGELOG.rst index 7c83f2f1ce..2a39ed623e 100644 --- a/rosbag2_cpp/CHANGELOG.rst +++ b/rosbag2_cpp/CHANGELOG.rst @@ -3,6 +3,15 @@ Changelog for package rosbag2 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Forthcoming +----------- +* Add user provided split size to error (`#430 `_) + * Add user provided split size to error + Signed-off-by: Anas Abou Allaban +* Make split size error clearer (`#428 `_) + Signed-off-by: Anas Abou Allaban +* Contributors: Anas Abou Allaban + 0.3.1 (2020-06-01) ------------------ diff --git a/rosbag2_storage/CHANGELOG.rst b/rosbag2_storage/CHANGELOG.rst index ed75ab2175..9fc1dd685c 100644 --- a/rosbag2_storage/CHANGELOG.rst +++ b/rosbag2_storage/CHANGELOG.rst @@ -3,6 +3,9 @@ Changelog for package rosbag2_storage ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Forthcoming +----------- + 0.3.1 (2020-06-01) ------------------ diff --git a/rosbag2_storage_default_plugins/CHANGELOG.rst b/rosbag2_storage_default_plugins/CHANGELOG.rst index b75b3b31b9..9f43687ded 100644 --- a/rosbag2_storage_default_plugins/CHANGELOG.rst +++ b/rosbag2_storage_default_plugins/CHANGELOG.rst @@ -3,6 +3,9 @@ Changelog for package rosbag2_storage_default_plugins ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Forthcoming +----------- + 0.3.1 (2020-06-01) ------------------ diff --git a/rosbag2_test_common/CHANGELOG.rst b/rosbag2_test_common/CHANGELOG.rst index c30f9610e7..16230cadbc 100644 --- a/rosbag2_test_common/CHANGELOG.rst +++ b/rosbag2_test_common/CHANGELOG.rst @@ -2,6 +2,9 @@ Changelog for package rosbag2_test_common ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Forthcoming +----------- + 0.3.1 (2020-06-01) ------------------ diff --git a/rosbag2_tests/CHANGELOG.rst b/rosbag2_tests/CHANGELOG.rst index 9bc15ee0a1..c0d79bc8ba 100644 --- a/rosbag2_tests/CHANGELOG.rst +++ b/rosbag2_tests/CHANGELOG.rst @@ -3,6 +3,9 @@ Changelog for package rosbag2_tests ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Forthcoming +----------- + 0.3.1 (2020-06-01) ------------------ diff --git a/rosbag2_transport/CHANGELOG.rst b/rosbag2_transport/CHANGELOG.rst index 049db8f70f..1746b5e42d 100644 --- a/rosbag2_transport/CHANGELOG.rst +++ b/rosbag2_transport/CHANGELOG.rst @@ -3,6 +3,9 @@ Changelog for package rosbag2_transport ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Forthcoming +----------- + 0.3.1 (2020-06-01) ------------------ * Find rosbag2_cpp (tinyxml2) before rcl (`#423 `_) diff --git a/shared_queues_vendor/CHANGELOG.rst b/shared_queues_vendor/CHANGELOG.rst index 0cfc8e51a7..8bc4d1b3cc 100644 --- a/shared_queues_vendor/CHANGELOG.rst +++ b/shared_queues_vendor/CHANGELOG.rst @@ -3,6 +3,9 @@ Changelog for package shared_queues_vendor ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Forthcoming +----------- + 0.3.1 (2020-06-01) ------------------ diff --git a/sqlite3_vendor/CHANGELOG.rst b/sqlite3_vendor/CHANGELOG.rst index e92302421e..5b7ff8c6d7 100644 --- a/sqlite3_vendor/CHANGELOG.rst +++ b/sqlite3_vendor/CHANGELOG.rst @@ -3,6 +3,9 @@ Changelog for package sqlite3_vendor ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Forthcoming +----------- + 0.3.1 (2020-06-01) ------------------ diff --git a/zstd_vendor/CHANGELOG.rst b/zstd_vendor/CHANGELOG.rst index 149aa79723..ff1f20cc78 100644 --- a/zstd_vendor/CHANGELOG.rst +++ b/zstd_vendor/CHANGELOG.rst @@ -2,6 +2,9 @@ Changelog for package zstd_vendor ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Forthcoming +----------- + 0.3.1 (2020-06-01) ------------------ * Shared publisher handle (`#420 `_) From 335d031ca618aade80fe0bdc08e463f29672968d Mon Sep 17 00:00:00 2001 From: Karsten Knese Date: Wed, 3 Jun 2020 15:32:04 -0700 Subject: [PATCH 14/30] 0.3.2 Signed-off-by: Mabel Zhang --- ros2bag/CHANGELOG.rst | 4 ++-- ros2bag/package.xml | 2 +- rosbag2/CHANGELOG.rst | 4 ++-- rosbag2/package.xml | 2 +- rosbag2_compression/CHANGELOG.rst | 4 ++-- rosbag2_compression/package.xml | 2 +- rosbag2_converter_default_plugins/CHANGELOG.rst | 4 ++-- rosbag2_converter_default_plugins/package.xml | 2 +- rosbag2_cpp/CHANGELOG.rst | 4 ++-- rosbag2_cpp/package.xml | 2 +- rosbag2_storage/CHANGELOG.rst | 4 ++-- rosbag2_storage/package.xml | 2 +- rosbag2_storage_default_plugins/CHANGELOG.rst | 4 ++-- rosbag2_storage_default_plugins/package.xml | 2 +- rosbag2_test_common/CHANGELOG.rst | 4 ++-- rosbag2_test_common/package.xml | 2 +- rosbag2_tests/CHANGELOG.rst | 4 ++-- rosbag2_tests/package.xml | 2 +- rosbag2_transport/CHANGELOG.rst | 4 ++-- rosbag2_transport/package.xml | 2 +- shared_queues_vendor/CHANGELOG.rst | 4 ++-- shared_queues_vendor/package.xml | 2 +- sqlite3_vendor/CHANGELOG.rst | 4 ++-- sqlite3_vendor/package.xml | 2 +- zstd_vendor/CHANGELOG.rst | 4 ++-- zstd_vendor/package.xml | 2 +- 26 files changed, 39 insertions(+), 39 deletions(-) diff --git a/ros2bag/CHANGELOG.rst b/ros2bag/CHANGELOG.rst index e5467ce5c8..4348c14fab 100644 --- a/ros2bag/CHANGELOG.rst +++ b/ros2bag/CHANGELOG.rst @@ -2,8 +2,8 @@ Changelog for package ros2bag ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -Forthcoming ------------ +0.3.2 (2020-06-03) +------------------ * Improve help message for CLI verbs (`#427 `_) * Contributors: Jacob Perron diff --git a/ros2bag/package.xml b/ros2bag/package.xml index e6fe27ee49..b256dca717 100644 --- a/ros2bag/package.xml +++ b/ros2bag/package.xml @@ -2,7 +2,7 @@ ros2bag - 0.3.1 + 0.3.2 Entry point for rosbag in ROS 2 diff --git a/rosbag2/CHANGELOG.rst b/rosbag2/CHANGELOG.rst index 926d4c8703..c39ba0bc32 100644 --- a/rosbag2/CHANGELOG.rst +++ b/rosbag2/CHANGELOG.rst @@ -2,8 +2,8 @@ Changelog for package rosbag2 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -Forthcoming ------------ +0.3.2 (2020-06-03) +------------------ 0.3.1 (2020-06-01) ------------------ diff --git a/rosbag2/package.xml b/rosbag2/package.xml index 2c3f07bcc8..16f9370b4e 100644 --- a/rosbag2/package.xml +++ b/rosbag2/package.xml @@ -1,7 +1,7 @@ rosbag2 - 0.3.1 + 0.3.2 Meta package for rosbag2 related packages Karsten Knese ROS Tooling Working Group diff --git a/rosbag2_compression/CHANGELOG.rst b/rosbag2_compression/CHANGELOG.rst index 5fab47cf8f..e0d92bff1d 100644 --- a/rosbag2_compression/CHANGELOG.rst +++ b/rosbag2_compression/CHANGELOG.rst @@ -2,8 +2,8 @@ Changelog for package rosbag2_compression ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -Forthcoming ------------ +0.3.2 (2020-06-03) +------------------ * Add user provided split size to error message (`#430 `_) * Contributors: Anas Abou Allaban diff --git a/rosbag2_compression/package.xml b/rosbag2_compression/package.xml index aedd83f73e..b6c208ae62 100644 --- a/rosbag2_compression/package.xml +++ b/rosbag2_compression/package.xml @@ -2,7 +2,7 @@ rosbag2_compression - 0.3.1 + 0.3.2 Compression implementations for rosbag2 bags and messages. ROS Tooling Working Group Apache License 2.0 diff --git a/rosbag2_converter_default_plugins/CHANGELOG.rst b/rosbag2_converter_default_plugins/CHANGELOG.rst index 0628415ee2..42b6171e9f 100644 --- a/rosbag2_converter_default_plugins/CHANGELOG.rst +++ b/rosbag2_converter_default_plugins/CHANGELOG.rst @@ -3,8 +3,8 @@ Changelog for package rosbag2_converter_default_plugins ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -Forthcoming ------------ +0.3.2 (2020-06-03) +------------------ 0.3.1 (2020-06-01) ------------------ diff --git a/rosbag2_converter_default_plugins/package.xml b/rosbag2_converter_default_plugins/package.xml index 05f9bb0667..3feb26f314 100644 --- a/rosbag2_converter_default_plugins/package.xml +++ b/rosbag2_converter_default_plugins/package.xml @@ -1,7 +1,7 @@ rosbag2_converter_default_plugins - 0.3.1 + 0.3.2 Package containing default plugins for format converters Karsten Knese ROS Tooling Working Group diff --git a/rosbag2_cpp/CHANGELOG.rst b/rosbag2_cpp/CHANGELOG.rst index 2a39ed623e..c306da9a3a 100644 --- a/rosbag2_cpp/CHANGELOG.rst +++ b/rosbag2_cpp/CHANGELOG.rst @@ -3,8 +3,8 @@ Changelog for package rosbag2 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -Forthcoming ------------ +0.3.2 (2020-06-03) +------------------ * Add user provided split size to error (`#430 `_) * Add user provided split size to error Signed-off-by: Anas Abou Allaban diff --git a/rosbag2_cpp/package.xml b/rosbag2_cpp/package.xml index 957b8446a1..e28858619e 100644 --- a/rosbag2_cpp/package.xml +++ b/rosbag2_cpp/package.xml @@ -1,7 +1,7 @@ rosbag2_cpp - 0.3.1 + 0.3.2 C++ ROSBag2 client library Karsten Knese ROS Tooling Working Group diff --git a/rosbag2_storage/CHANGELOG.rst b/rosbag2_storage/CHANGELOG.rst index 9fc1dd685c..812d4ec5bd 100644 --- a/rosbag2_storage/CHANGELOG.rst +++ b/rosbag2_storage/CHANGELOG.rst @@ -3,8 +3,8 @@ Changelog for package rosbag2_storage ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -Forthcoming ------------ +0.3.2 (2020-06-03) +------------------ 0.3.1 (2020-06-01) ------------------ diff --git a/rosbag2_storage/package.xml b/rosbag2_storage/package.xml index 107b754395..7644b3cbdd 100644 --- a/rosbag2_storage/package.xml +++ b/rosbag2_storage/package.xml @@ -1,7 +1,7 @@ rosbag2_storage - 0.3.1 + 0.3.2 ROS2 independent storage format to store serialized ROS2 messages Karsten Knese ROS Tooling Working Group diff --git a/rosbag2_storage_default_plugins/CHANGELOG.rst b/rosbag2_storage_default_plugins/CHANGELOG.rst index 9f43687ded..fe41fb0d30 100644 --- a/rosbag2_storage_default_plugins/CHANGELOG.rst +++ b/rosbag2_storage_default_plugins/CHANGELOG.rst @@ -3,8 +3,8 @@ Changelog for package rosbag2_storage_default_plugins ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -Forthcoming ------------ +0.3.2 (2020-06-03) +------------------ 0.3.1 (2020-06-01) ------------------ diff --git a/rosbag2_storage_default_plugins/package.xml b/rosbag2_storage_default_plugins/package.xml index 5f6c52f65b..943e329b88 100644 --- a/rosbag2_storage_default_plugins/package.xml +++ b/rosbag2_storage_default_plugins/package.xml @@ -1,7 +1,7 @@ rosbag2_storage_default_plugins - 0.3.1 + 0.3.2 ROSBag2 SQLite3 storage plugin Karsten Knese ROS Tooling Working Group diff --git a/rosbag2_test_common/CHANGELOG.rst b/rosbag2_test_common/CHANGELOG.rst index 16230cadbc..9508bb0823 100644 --- a/rosbag2_test_common/CHANGELOG.rst +++ b/rosbag2_test_common/CHANGELOG.rst @@ -2,8 +2,8 @@ Changelog for package rosbag2_test_common ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -Forthcoming ------------ +0.3.2 (2020-06-03) +------------------ 0.3.1 (2020-06-01) ------------------ diff --git a/rosbag2_test_common/package.xml b/rosbag2_test_common/package.xml index 98ed07d43e..a83006d109 100644 --- a/rosbag2_test_common/package.xml +++ b/rosbag2_test_common/package.xml @@ -2,7 +2,7 @@ rosbag2_test_common - 0.3.1 + 0.3.2 Commonly used test helper classes and fixtures for rosbag2 Karsten Knese ROS Tooling Working Group diff --git a/rosbag2_tests/CHANGELOG.rst b/rosbag2_tests/CHANGELOG.rst index c0d79bc8ba..737d987fca 100644 --- a/rosbag2_tests/CHANGELOG.rst +++ b/rosbag2_tests/CHANGELOG.rst @@ -3,8 +3,8 @@ Changelog for package rosbag2_tests ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -Forthcoming ------------ +0.3.2 (2020-06-03) +------------------ 0.3.1 (2020-06-01) ------------------ diff --git a/rosbag2_tests/package.xml b/rosbag2_tests/package.xml index 334c1a50fa..39612875aa 100644 --- a/rosbag2_tests/package.xml +++ b/rosbag2_tests/package.xml @@ -2,7 +2,7 @@ rosbag2_tests - 0.3.1 + 0.3.2 Tests package for rosbag2 Karsten Knese ROS Tooling Working Group diff --git a/rosbag2_transport/CHANGELOG.rst b/rosbag2_transport/CHANGELOG.rst index 1746b5e42d..b6922b6852 100644 --- a/rosbag2_transport/CHANGELOG.rst +++ b/rosbag2_transport/CHANGELOG.rst @@ -3,8 +3,8 @@ Changelog for package rosbag2_transport ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -Forthcoming ------------ +0.3.2 (2020-06-03) +------------------ 0.3.1 (2020-06-01) ------------------ diff --git a/rosbag2_transport/package.xml b/rosbag2_transport/package.xml index c6c990f7d9..abbad7bea0 100644 --- a/rosbag2_transport/package.xml +++ b/rosbag2_transport/package.xml @@ -2,7 +2,7 @@ rosbag2_transport - 0.3.1 + 0.3.2 Layer encapsulating ROS middleware to allow rosbag2 to be used with or without middleware Karsten Knese ROS Tooling Working Group diff --git a/shared_queues_vendor/CHANGELOG.rst b/shared_queues_vendor/CHANGELOG.rst index 8bc4d1b3cc..e8a9a317e8 100644 --- a/shared_queues_vendor/CHANGELOG.rst +++ b/shared_queues_vendor/CHANGELOG.rst @@ -3,8 +3,8 @@ Changelog for package shared_queues_vendor ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -Forthcoming ------------ +0.3.2 (2020-06-03) +------------------ 0.3.1 (2020-06-01) ------------------ diff --git a/shared_queues_vendor/package.xml b/shared_queues_vendor/package.xml index d29bce707d..10b37c3bb9 100644 --- a/shared_queues_vendor/package.xml +++ b/shared_queues_vendor/package.xml @@ -2,7 +2,7 @@ shared_queues_vendor - 0.3.1 + 0.3.2 Vendor package for concurrent queues from moodycamel Karsten Knese ROS Tooling Working Group diff --git a/sqlite3_vendor/CHANGELOG.rst b/sqlite3_vendor/CHANGELOG.rst index 5b7ff8c6d7..db61367549 100644 --- a/sqlite3_vendor/CHANGELOG.rst +++ b/sqlite3_vendor/CHANGELOG.rst @@ -3,8 +3,8 @@ Changelog for package sqlite3_vendor ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -Forthcoming ------------ +0.3.2 (2020-06-03) +------------------ 0.3.1 (2020-06-01) ------------------ diff --git a/sqlite3_vendor/package.xml b/sqlite3_vendor/package.xml index 8f25ba501d..21aec0f19d 100644 --- a/sqlite3_vendor/package.xml +++ b/sqlite3_vendor/package.xml @@ -2,7 +2,7 @@ sqlite3_vendor - 0.3.1 + 0.3.2 SQLite 3 vendor package Karsten Knese ROS Tooling Working Group diff --git a/zstd_vendor/CHANGELOG.rst b/zstd_vendor/CHANGELOG.rst index ff1f20cc78..3647cd20ee 100644 --- a/zstd_vendor/CHANGELOG.rst +++ b/zstd_vendor/CHANGELOG.rst @@ -2,8 +2,8 @@ Changelog for package zstd_vendor ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -Forthcoming ------------ +0.3.2 (2020-06-03) +------------------ 0.3.1 (2020-06-01) ------------------ diff --git a/zstd_vendor/package.xml b/zstd_vendor/package.xml index 3d12234024..393e31a929 100644 --- a/zstd_vendor/package.xml +++ b/zstd_vendor/package.xml @@ -2,7 +2,7 @@ zstd_vendor - 0.3.1 + 0.3.2 Zstd compression vendor package, providing a dependency for Zstd. ROS Tooling Working Group Apache License 2.0 From 4499ab73ac48eb118b07713e6ead389e0e25d429 Mon Sep 17 00:00:00 2001 From: Mabel Zhang Date: Sat, 13 Jun 2020 00:39:44 -0400 Subject: [PATCH 15/30] test_play_timing pause test passes with two threads Signed-off-by: Mabel Zhang --- .../rosbag2_transport/rosbag2_transport.hpp | 12 +++ .../src/rosbag2_transport/player.cpp | 62 +++++++++++++++- .../rosbag2_transport/rosbag2_transport.cpp | 22 ++++++ .../test/rosbag2_transport/test_play.cpp | 73 +++++++++++++++++++ .../rosbag2_transport/test_play_timing.cpp | 66 +++++++++++++++++ 5 files changed, 231 insertions(+), 4 deletions(-) diff --git a/rosbag2_transport/include/rosbag2_transport/rosbag2_transport.hpp b/rosbag2_transport/include/rosbag2_transport/rosbag2_transport.hpp index 02bcb37e00..5a610c4608 100644 --- a/rosbag2_transport/include/rosbag2_transport/rosbag2_transport.hpp +++ b/rosbag2_transport/include/rosbag2_transport/rosbag2_transport.hpp @@ -84,6 +84,18 @@ class Rosbag2Transport ROSBAG2_TRANSPORT_PUBLIC void print_bag_info(const std::string & uri, const std::string & storage_id); + /** + * Activate underlying lifecycle node. + */ + ROSBAG2_TRANSPORT_PUBLIC + void activate_lifecycle(); + + /** + * Deactivate underlying lifecycle node. + */ + ROSBAG2_TRANSPORT_PUBLIC + void deactivate_lifecycle(); + private: std::shared_ptr setup_node( std::string node_prefix = "", diff --git a/rosbag2_transport/src/rosbag2_transport/player.cpp b/rosbag2_transport/src/rosbag2_transport/player.cpp index 69d0a8e9a2..48ecc2a8f0 100644 --- a/rosbag2_transport/src/rosbag2_transport/player.cpp +++ b/rosbag2_transport/src/rosbag2_transport/player.cpp @@ -103,6 +103,8 @@ void Player::play(const PlayOptions & options) wait_for_filled_queue(options); + std::cerr << "1111111111111111111111111\n"; + rosbag2_transport_->configure(); // If playback should not be paused in the beginning, activate lifecycle node right away. // If playback should be paused, move on. @@ -111,6 +113,43 @@ void Player::play(const PlayOptions & options) rosbag2_transport_->activate(); } + /* + std::future lifecycle_spin_future = std::async( + std::launch::async, [this]() { + std::cerr << "44444444444444444444444\n"; + rclcpp::init(0, nullptr); + std::cerr << "55555555555555555555555\n"; + rclcpp::executors::MultiThreadedExecutor exe; + exe.add_node(rosbag2_transport_->get_node_base_interface()); + std::cerr << "Spinning lifecycle node\n"; + exe.spin(); + std::cerr << "spin() returned\n"; + std::cerr << "666666666666666666666\n"; + }); + std::cerr << "Got out of thread\n"; + */ + + /* + std::future play_future = std::async( + std::launch::async, [this, options]() { + std::cerr << "222222222222222222222222\n"; + play_messages_from_queue(options); + std::cerr << "333333333333333333333333\n"; + }); + */ + + /* + std::cerr << "44444444444444444444444\n"; + // rclcpp::init(0, nullptr); + rclcpp::executors::MultiThreadedExecutor exe; + exe.add_node(rosbag2_transport_->get_node_base_interface()); + std::cerr << "55555555555555555555555\n"; + std::cerr << "Spinning lifecycle node\n"; + exe.spin(); + std::cerr << "spin() returned\n"; + std::cerr << "666666666666666666666\n"; + */ + play_messages_from_queue(options); } @@ -170,8 +209,9 @@ void Player::play_messages_from_queue(const PlayOptions & options) lifecycle_msgs::msg::State::PRIMARY_STATE_ACTIVE) { ROSBAG2_TRANSPORT_LOG_INFO("Paused"); - getc(stdin); - rosbag2_transport_->activate(); + // TODO(mabelzhang) Find a way to get keyboard input without blocking + // getc(stdin); + // rosbag2_transport_->activate(); } start_time_ = std::chrono::system_clock::now(); @@ -183,9 +223,22 @@ void Player::play_messages_from_queue(const PlayOptions & options) { std::chrono::time_point pause_start = std::chrono::system_clock::now(); - getc(stdin); + + std::cerr << "sleeping to wait for wakeup call\n"; + // Sleep until activated externally + while (rosbag2_transport_->get_current_state().id() != + lifecycle_msgs::msg::State::PRIMARY_STATE_ACTIVE) + { + std::cerr << rosbag2_transport_->get_current_state().id() << std::endl; + std::cerr << lifecycle_msgs::msg::State::PRIMARY_STATE_ACTIVE << std::endl; + std::this_thread::sleep_for(std::chrono::milliseconds(100)); + } + std::cerr << "waking up\n"; + + // TODO(mabelzhang) Find a way to get keyboard input without blocking + // getc(stdin); paused_duration_ += std::chrono::system_clock::now() - pause_start; - rosbag2_transport_->activate(); + // rosbag2_transport_->activate(); } play_messages_until_queue_empty(options); @@ -216,6 +269,7 @@ void Player::play_messages_until_queue_empty(const PlayOptions & options) publishers_[message.message->topic_name]->publish(message.message->serialized_data); // TODO(mabelzhang) TEMPORARY, remove when done debugging. And counter above. fprintf(stderr, "publishing message %zu\n", (++counter)); + // TODO(mabelzhang) Add a detection for deactivate state } } } diff --git a/rosbag2_transport/src/rosbag2_transport/rosbag2_transport.cpp b/rosbag2_transport/src/rosbag2_transport/rosbag2_transport.cpp index c46144ff39..136a985b5b 100644 --- a/rosbag2_transport/src/rosbag2_transport/rosbag2_transport.cpp +++ b/rosbag2_transport/src/rosbag2_transport/rosbag2_transport.cpp @@ -126,4 +126,26 @@ void Rosbag2Transport::print_bag_info(const std::string & uri, const std::string Formatter::format_bag_meta_data(metadata); } +void Rosbag2Transport::activate_lifecycle() +{ + std::cerr << "Rosbag2Transport::activate_lifecycle()\n"; + if (transport_node_) { + transport_node_->activate(); + } else { + ROSBAG2_TRANSPORT_LOG_ERROR( + "transport_node_ not initialized. Call play() before activating lifecycle node."); + } +} + +void Rosbag2Transport::deactivate_lifecycle() +{ + std::cerr << "Rosbag2Transport::deactivate_lifecycle()\n"; + if (transport_node_) { + transport_node_->deactivate(); + } else { + ROSBAG2_TRANSPORT_LOG_ERROR( + "transport_node_ not initialized. Call play() before deactivating lifecycle node."); + } +} + } // namespace rosbag2_transport diff --git a/rosbag2_transport/test/rosbag2_transport/test_play.cpp b/rosbag2_transport/test/rosbag2_transport/test_play.cpp index 58e47a4e36..74980b6869 100644 --- a/rosbag2_transport/test/rosbag2_transport/test_play.cpp +++ b/rosbag2_transport/test/rosbag2_transport/test_play.cpp @@ -202,6 +202,79 @@ TEST_F(RosBag2PlayTestFixture, recorded_messages_are_played_for_filtered_topics) EXPECT_THAT(replayed_test_arrays, SizeIs(Ge(2u))); } +TEST_F(RosBag2PlayTestFixture, starting_paused_receives_all_messages) +{ + auto primitive_message1 = get_messages_basic_types()[0]; + primitive_message1->int32_value = 42; + + auto complex_message1 = get_messages_arrays()[0]; + complex_message1->float32_values = {{40.0f, 2.0f, 0.0f}}; + complex_message1->bool_values = {{true, false, true}}; + + auto topic_types = std::vector{ + {"topic1", "test_msgs/BasicTypes", "", ""}, + {"topic2", "test_msgs/Arrays", "", ""}, + }; + + // 3 messages of each type to be played + std::vector> messages = + {serialize_test_message("topic1", 500, primitive_message1), + serialize_test_message("topic1", 700, primitive_message1), + serialize_test_message("topic1", 900, primitive_message1), + serialize_test_message("topic2", 550, complex_message1), + serialize_test_message("topic2", 750, complex_message1), + serialize_test_message("topic2", 950, complex_message1)}; + + auto prepared_mock_reader = std::make_unique(); + prepared_mock_reader->prepare(messages, topic_types); + reader_ = std::make_unique(std::move(prepared_mock_reader)); + + // Expect to receive 3 messages of each type, as many messages as published, + // as opposed to fewer. Pause feature should allow publishers to start after + // subscribers are ready. + sub_->add_subscription("/topic1", 3); + sub_->add_subscription("/topic2", 3); + + auto await_received_messages = sub_->spin_subscriptions(); + + // Start playback paused + play_options_.paused = true; + + Rosbag2Transport rosbag2_transport(reader_, writer_, info_); + rosbag2_transport.play(storage_options_, play_options_); + + // Activate lifecycle node after pausing + std::cerr << "Test script test_play calling activate_lifecycle()\n"; + rosbag2_transport.activate_lifecycle(); + + await_received_messages.get(); + + auto replayed_test_primitives = sub_->get_received_messages( + "/topic1"); + EXPECT_THAT(replayed_test_primitives, SizeIs(Ge(3u))); + EXPECT_THAT( + replayed_test_primitives, + Each(Pointee(Field(&test_msgs::msg::BasicTypes::int32_value, 42)))); + + auto replayed_test_arrays = sub_->get_received_messages( + "/topic2"); + EXPECT_THAT(replayed_test_arrays, SizeIs(Ge(3u))); + EXPECT_THAT( + replayed_test_arrays, + Each( + Pointee( + Field( + &test_msgs::msg::Arrays::bool_values, + ElementsAre(true, false, true))))); + EXPECT_THAT( + replayed_test_arrays, + Each( + Pointee( + Field( + &test_msgs::msg::Arrays::float32_values, + ElementsAre(40.0f, 2.0f, 0.0f))))); +} + class RosBag2PlayQosOverrideTestFixture : public RosBag2PlayTestFixture { public: diff --git a/rosbag2_transport/test/rosbag2_transport/test_play_timing.cpp b/rosbag2_transport/test/rosbag2_transport/test_play_timing.cpp index 695830eebf..86788e9bff 100644 --- a/rosbag2_transport/test/rosbag2_transport/test_play_timing.cpp +++ b/rosbag2_transport/test/rosbag2_transport/test_play_timing.cpp @@ -156,3 +156,69 @@ TEST_F(Rosbag2TransportTestFixture, playing_respects_rate) rclcpp::shutdown(); } + +TEST_F(Rosbag2TransportTestFixture, playing_starts_paused) +{ + rclcpp::init(0, nullptr); + auto primitive_message1 = get_messages_strings()[0]; + primitive_message1->string_value = "Hello World 1"; + + auto primitive_message2 = get_messages_strings()[0]; + primitive_message2->string_value = "Hello World 2"; + + auto message_time_difference = std::chrono::seconds(1); + auto topics_and_types = + std::vector{{"topic1", "test_msgs/Strings", "", ""}}; + std::vector> messages = + {serialize_test_message("topic1", 0, primitive_message1), + serialize_test_message("topic1", 0, primitive_message2)}; + + messages[0]->time_stamp = 100; + messages[1]->time_stamp = + messages[0]->time_stamp + std::chrono::nanoseconds(message_time_difference).count(); + + // Start unpaused normally + std::cerr << "Test 11111111111111111111111111111 Test\n"; + auto prepared_mock_reader = std::make_unique(); + prepared_mock_reader->prepare(messages, topics_and_types); + reader_ = std::make_unique(std::move(prepared_mock_reader)); + + play_options_.paused = false; + + auto start = std::chrono::steady_clock::now(); + Rosbag2Transport rosbag2_transport(reader_, writer_, info_); + rosbag2_transport.play(storage_options_, play_options_); + auto replay_time = std::chrono::steady_clock::now() - start; + + ASSERT_THAT(replay_time, Gt(message_time_difference)); + + // Start paused + std::cerr << "Test 22222222222222222222222222222 Test\n"; + prepared_mock_reader = std::make_unique(); + prepared_mock_reader->prepare(messages, topics_and_types); + reader_ = std::make_unique(std::move(prepared_mock_reader)); + + play_options_.paused = true; + + start = std::chrono::steady_clock::now(); + rosbag2_transport = Rosbag2Transport(reader_, writer_, info_); + + // Activate lifecycle node after pausing for some time + // Pass node by reference so that it is initialized by play() in the test + // before activate() call in the thread + std::future play_future = std::async( + std::launch::async, [&rosbag2_transport]() mutable { + std::this_thread::sleep_for(std::chrono::seconds(1)); + std::cerr << "Test script test_play_timing calling activate_lifecycle()\n"; + rosbag2_transport.activate_lifecycle(); + }); + + // Call play() to initialize the node and wait for activation + rosbag2_transport.play(storage_options_, play_options_); + // Time the play after full execution of play() + replay_time = std::chrono::steady_clock::now() - start; + + ASSERT_THAT(replay_time, Gt(std::chrono::seconds(2))); + + rclcpp::shutdown(); +} From 9889f94fe2aea2d881f751506c46d24bb7a3ba8e Mon Sep 17 00:00:00 2001 From: Mabel Zhang Date: Sat, 13 Jun 2020 04:47:47 -0400 Subject: [PATCH 16/30] move pause logic. add test case for pausing and unpausing mid-playback. Signed-off-by: Mabel Zhang --- .../src/rosbag2_transport/player.cpp | 97 +++++-------------- .../rosbag2_transport/test_play_timing.cpp | 53 ++++++++-- 2 files changed, 72 insertions(+), 78 deletions(-) diff --git a/rosbag2_transport/src/rosbag2_transport/player.cpp b/rosbag2_transport/src/rosbag2_transport/player.cpp index 48ecc2a8f0..d74de171b4 100644 --- a/rosbag2_transport/src/rosbag2_transport/player.cpp +++ b/rosbag2_transport/src/rosbag2_transport/player.cpp @@ -113,43 +113,6 @@ void Player::play(const PlayOptions & options) rosbag2_transport_->activate(); } - /* - std::future lifecycle_spin_future = std::async( - std::launch::async, [this]() { - std::cerr << "44444444444444444444444\n"; - rclcpp::init(0, nullptr); - std::cerr << "55555555555555555555555\n"; - rclcpp::executors::MultiThreadedExecutor exe; - exe.add_node(rosbag2_transport_->get_node_base_interface()); - std::cerr << "Spinning lifecycle node\n"; - exe.spin(); - std::cerr << "spin() returned\n"; - std::cerr << "666666666666666666666\n"; - }); - std::cerr << "Got out of thread\n"; - */ - - /* - std::future play_future = std::async( - std::launch::async, [this, options]() { - std::cerr << "222222222222222222222222\n"; - play_messages_from_queue(options); - std::cerr << "333333333333333333333333\n"; - }); - */ - - /* - std::cerr << "44444444444444444444444\n"; - // rclcpp::init(0, nullptr); - rclcpp::executors::MultiThreadedExecutor exe; - exe.add_node(rosbag2_transport_->get_node_base_interface()); - std::cerr << "55555555555555555555555\n"; - std::cerr << "Spinning lifecycle node\n"; - exe.spin(); - std::cerr << "spin() returned\n"; - std::cerr << "666666666666666666666\n"; - */ - play_messages_from_queue(options); } @@ -205,41 +168,9 @@ void Player::enqueue_up_to_boundary(const TimePoint & time_first_message, uint64 void Player::play_messages_from_queue(const PlayOptions & options) { - if (rosbag2_transport_->get_current_state().id() != - lifecycle_msgs::msg::State::PRIMARY_STATE_ACTIVE) - { - ROSBAG2_TRANSPORT_LOG_INFO("Paused"); - // TODO(mabelzhang) Find a way to get keyboard input without blocking - // getc(stdin); - // rosbag2_transport_->activate(); - } - start_time_ = std::chrono::system_clock::now(); paused_duration_ = std::chrono::nanoseconds(0); do { - // This block is not reached yet, because cannot pause during play yet - if (rosbag2_transport_->get_current_state().id() != - lifecycle_msgs::msg::State::PRIMARY_STATE_ACTIVE) - { - std::chrono::time_point pause_start = - std::chrono::system_clock::now(); - - std::cerr << "sleeping to wait for wakeup call\n"; - // Sleep until activated externally - while (rosbag2_transport_->get_current_state().id() != - lifecycle_msgs::msg::State::PRIMARY_STATE_ACTIVE) - { - std::cerr << rosbag2_transport_->get_current_state().id() << std::endl; - std::cerr << lifecycle_msgs::msg::State::PRIMARY_STATE_ACTIVE << std::endl; - std::this_thread::sleep_for(std::chrono::milliseconds(100)); - } - std::cerr << "waking up\n"; - - // TODO(mabelzhang) Find a way to get keyboard input without blocking - // getc(stdin); - paused_duration_ += std::chrono::system_clock::now() - pause_start; - // rosbag2_transport_->activate(); - } play_messages_until_queue_empty(options); if (!is_storage_completely_loaded() && rclcpp::ok()) { @@ -262,14 +193,38 @@ void Player::play_messages_until_queue_empty(const PlayOptions & options) static size_t counter = 0; while (message_queue_.try_dequeue(message) && rclcpp::ok()) { + std::this_thread::sleep_until( start_time_ + std::chrono::duration_cast( 1.0 / rate * message.time_since_start + paused_duration_)); - if (rclcpp::ok()) { + + if (rosbag2_transport_->get_current_state().id() != + lifecycle_msgs::msg::State::PRIMARY_STATE_ACTIVE) + { + ROSBAG2_TRANSPORT_LOG_INFO("Paused"); + std::chrono::time_point pause_start = + std::chrono::system_clock::now(); + + // Sleep until activated externally + while (rosbag2_transport_->get_current_state().id() != + lifecycle_msgs::msg::State::PRIMARY_STATE_ACTIVE) + { + std::cerr << rosbag2_transport_->get_current_state().id() << std::endl; + std::this_thread::sleep_for(std::chrono::milliseconds(100)); + } + ROSBAG2_TRANSPORT_LOG_INFO("Resumed"); + + // TODO(mabelzhang) Find a way to get keyboard input without blocking + // getc(stdin); + paused_duration_ += std::chrono::system_clock::now() - pause_start; + // rosbag2_transport_->activate(); + } + + if (rclcpp::ok()) + { publishers_[message.message->topic_name]->publish(message.message->serialized_data); // TODO(mabelzhang) TEMPORARY, remove when done debugging. And counter above. fprintf(stderr, "publishing message %zu\n", (++counter)); - // TODO(mabelzhang) Add a detection for deactivate state } } } diff --git a/rosbag2_transport/test/rosbag2_transport/test_play_timing.cpp b/rosbag2_transport/test/rosbag2_transport/test_play_timing.cpp index 86788e9bff..6996524202 100644 --- a/rosbag2_transport/test/rosbag2_transport/test_play_timing.cpp +++ b/rosbag2_transport/test/rosbag2_transport/test_play_timing.cpp @@ -178,7 +178,6 @@ TEST_F(Rosbag2TransportTestFixture, playing_starts_paused) messages[0]->time_stamp + std::chrono::nanoseconds(message_time_difference).count(); // Start unpaused normally - std::cerr << "Test 11111111111111111111111111111 Test\n"; auto prepared_mock_reader = std::make_unique(); prepared_mock_reader->prepare(messages, topics_and_types); reader_ = std::make_unique(std::move(prepared_mock_reader)); @@ -192,8 +191,7 @@ TEST_F(Rosbag2TransportTestFixture, playing_starts_paused) ASSERT_THAT(replay_time, Gt(message_time_difference)); - // Start paused - std::cerr << "Test 22222222222222222222222222222 Test\n"; + // Start paused, unpause after some time prepared_mock_reader = std::make_unique(); prepared_mock_reader->prepare(messages, topics_and_types); reader_ = std::make_unique(std::move(prepared_mock_reader)); @@ -203,12 +201,14 @@ TEST_F(Rosbag2TransportTestFixture, playing_starts_paused) start = std::chrono::steady_clock::now(); rosbag2_transport = Rosbag2Transport(reader_, writer_, info_); + auto pause_time = std::chrono::seconds(1); + // Activate lifecycle node after pausing for some time // Pass node by reference so that it is initialized by play() in the test // before activate() call in the thread - std::future play_future = std::async( - std::launch::async, [&rosbag2_transport]() mutable { - std::this_thread::sleep_for(std::chrono::seconds(1)); + std::future future_handle = std::async( + std::launch::async, [&rosbag2_transport, pause_time]() mutable { + std::this_thread::sleep_for(pause_time); std::cerr << "Test script test_play_timing calling activate_lifecycle()\n"; rosbag2_transport.activate_lifecycle(); }); @@ -218,7 +218,46 @@ TEST_F(Rosbag2TransportTestFixture, playing_starts_paused) // Time the play after full execution of play() replay_time = std::chrono::steady_clock::now() - start; - ASSERT_THAT(replay_time, Gt(std::chrono::seconds(2))); + ASSERT_THAT(replay_time, Gt(message_time_difference + pause_time)); + + // Start unpaused, pause, unpause again + auto primitive_message3 = get_messages_strings()[0]; + primitive_message3->string_value = "Hello World 3"; + messages.push_back(serialize_test_message("topic1", 0, primitive_message3)); + messages[2]->time_stamp = + messages[1]->time_stamp + std::chrono::nanoseconds(message_time_difference).count(); + + prepared_mock_reader = std::make_unique(); + prepared_mock_reader->prepare(messages, topics_and_types); + reader_ = std::make_unique(std::move(prepared_mock_reader)); + + play_options_.paused = false; + + start = std::chrono::steady_clock::now(); + rosbag2_transport = Rosbag2Transport(reader_, writer_, info_); + + // Pass node by reference so that it is initialized by play(). + future_handle = std::async( + std::launch::async, [&rosbag2_transport, message_time_difference]() mutable { + // Wait for node to initialize, deactivate to pause + std::this_thread::sleep_for(message_time_difference); + std::cerr << "Test script test_play_timing calling deactivate_lifecycle()\n"; + rosbag2_transport.deactivate_lifecycle(); + + // Wait, re-activate to unpause + std::this_thread::sleep_for(message_time_difference); + std::cerr << "Test script test_play_timing calling activate_lifecycle()\n"; + rosbag2_transport.activate_lifecycle(); + }); + + rosbag2_transport.play(storage_options_, play_options_); + replay_time = std::chrono::steady_clock::now() - start; + + std::cerr << replay_time.count() << std::endl; + std::cerr << (3 * message_time_difference).count() << std::endl; + // 1 second for message 0 and 1 in parallel to initialization wait, + // 1 second for pause, and 1 second for message 2. + ASSERT_THAT(replay_time, Gt(3 * message_time_difference)); rclcpp::shutdown(); } From 7b60a7eac8217fefa04fdd82704eaa9a76d87ecc Mon Sep 17 00:00:00 2001 From: Mabel Zhang Date: Sat, 13 Jun 2020 04:57:52 -0400 Subject: [PATCH 17/30] fix test_play with unpause in a thread Signed-off-by: Mabel Zhang --- .../test/rosbag2_transport/test_play.cpp | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/rosbag2_transport/test/rosbag2_transport/test_play.cpp b/rosbag2_transport/test/rosbag2_transport/test_play.cpp index 74980b6869..5baaf508f7 100644 --- a/rosbag2_transport/test/rosbag2_transport/test_play.cpp +++ b/rosbag2_transport/test/rosbag2_transport/test_play.cpp @@ -229,9 +229,9 @@ TEST_F(RosBag2PlayTestFixture, starting_paused_receives_all_messages) prepared_mock_reader->prepare(messages, topic_types); reader_ = std::make_unique(std::move(prepared_mock_reader)); - // Expect to receive 3 messages of each type, as many messages as published, - // as opposed to fewer. Pause feature should allow publishers to start after - // subscribers are ready. + // Expect to receive all 3 messages of each type, as many as published. + // Pause feature should allow time for subscribers to start up and catch all + // published messages. sub_->add_subscription("/topic1", 3); sub_->add_subscription("/topic2", 3); @@ -241,11 +241,15 @@ TEST_F(RosBag2PlayTestFixture, starting_paused_receives_all_messages) play_options_.paused = true; Rosbag2Transport rosbag2_transport(reader_, writer_, info_); - rosbag2_transport.play(storage_options_, play_options_); - // Activate lifecycle node after pausing - std::cerr << "Test script test_play calling activate_lifecycle()\n"; - rosbag2_transport.activate_lifecycle(); + std::future future_handle = std::async( + std::launch::async, [&rosbag2_transport]() mutable { + // Wait for node initialization and subscribers to get ready, then unpause + std::this_thread::sleep_for(std::chrono::milliseconds(500)); + rosbag2_transport.activate_lifecycle(); + }); + + rosbag2_transport.play(storage_options_, play_options_); await_received_messages.get(); From b7bc1037e9c9bf0a7933b28e9c4af98dff49814f Mon Sep 17 00:00:00 2001 From: Mabel Zhang Date: Sat, 13 Jun 2020 05:40:47 -0400 Subject: [PATCH 18/30] longer wait in test_play. style. Signed-off-by: Mabel Zhang --- rosbag2_transport/src/rosbag2_transport/player.cpp | 4 +--- rosbag2_transport/test/rosbag2_transport/test_play.cpp | 4 ++-- rosbag2_transport/test/rosbag2_transport/test_play_timing.cpp | 4 ++-- 3 files changed, 5 insertions(+), 7 deletions(-) diff --git a/rosbag2_transport/src/rosbag2_transport/player.cpp b/rosbag2_transport/src/rosbag2_transport/player.cpp index d74de171b4..5de39f8709 100644 --- a/rosbag2_transport/src/rosbag2_transport/player.cpp +++ b/rosbag2_transport/src/rosbag2_transport/player.cpp @@ -193,7 +193,6 @@ void Player::play_messages_until_queue_empty(const PlayOptions & options) static size_t counter = 0; while (message_queue_.try_dequeue(message) && rclcpp::ok()) { - std::this_thread::sleep_until( start_time_ + std::chrono::duration_cast( 1.0 / rate * message.time_since_start + paused_duration_)); @@ -220,8 +219,7 @@ void Player::play_messages_until_queue_empty(const PlayOptions & options) // rosbag2_transport_->activate(); } - if (rclcpp::ok()) - { + if (rclcpp::ok()) { publishers_[message.message->topic_name]->publish(message.message->serialized_data); // TODO(mabelzhang) TEMPORARY, remove when done debugging. And counter above. fprintf(stderr, "publishing message %zu\n", (++counter)); diff --git a/rosbag2_transport/test/rosbag2_transport/test_play.cpp b/rosbag2_transport/test/rosbag2_transport/test_play.cpp index 5baaf508f7..6584d8ee58 100644 --- a/rosbag2_transport/test/rosbag2_transport/test_play.cpp +++ b/rosbag2_transport/test/rosbag2_transport/test_play.cpp @@ -245,9 +245,9 @@ TEST_F(RosBag2PlayTestFixture, starting_paused_receives_all_messages) std::future future_handle = std::async( std::launch::async, [&rosbag2_transport]() mutable { // Wait for node initialization and subscribers to get ready, then unpause - std::this_thread::sleep_for(std::chrono::milliseconds(500)); + std::this_thread::sleep_for(std::chrono::milliseconds(1000)); rosbag2_transport.activate_lifecycle(); - }); + }); rosbag2_transport.play(storage_options_, play_options_); diff --git a/rosbag2_transport/test/rosbag2_transport/test_play_timing.cpp b/rosbag2_transport/test/rosbag2_transport/test_play_timing.cpp index 6996524202..58746643d1 100644 --- a/rosbag2_transport/test/rosbag2_transport/test_play_timing.cpp +++ b/rosbag2_transport/test/rosbag2_transport/test_play_timing.cpp @@ -211,7 +211,7 @@ TEST_F(Rosbag2TransportTestFixture, playing_starts_paused) std::this_thread::sleep_for(pause_time); std::cerr << "Test script test_play_timing calling activate_lifecycle()\n"; rosbag2_transport.activate_lifecycle(); - }); + }); // Call play() to initialize the node and wait for activation rosbag2_transport.play(storage_options_, play_options_); @@ -248,7 +248,7 @@ TEST_F(Rosbag2TransportTestFixture, playing_starts_paused) std::this_thread::sleep_for(message_time_difference); std::cerr << "Test script test_play_timing calling activate_lifecycle()\n"; rosbag2_transport.activate_lifecycle(); - }); + }); rosbag2_transport.play(storage_options_, play_options_); replay_time = std::chrono::steady_clock::now() - start; From fa155cef0bdee3d206b2652e756317353465c304 Mon Sep 17 00:00:00 2001 From: Mabel Zhang Date: Sat, 13 Jun 2020 06:55:05 -0400 Subject: [PATCH 19/30] decrease number msgs expected in test_play Signed-off-by: Mabel Zhang --- .../test/rosbag2_transport/test_play.cpp | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/rosbag2_transport/test/rosbag2_transport/test_play.cpp b/rosbag2_transport/test/rosbag2_transport/test_play.cpp index 6584d8ee58..4d7f36bb24 100644 --- a/rosbag2_transport/test/rosbag2_transport/test_play.cpp +++ b/rosbag2_transport/test/rosbag2_transport/test_play.cpp @@ -202,7 +202,7 @@ TEST_F(RosBag2PlayTestFixture, recorded_messages_are_played_for_filtered_topics) EXPECT_THAT(replayed_test_arrays, SizeIs(Ge(2u))); } -TEST_F(RosBag2PlayTestFixture, starting_paused_receives_all_messages) +TEST_F(RosBag2PlayTestFixture, starting_paused_can_resume) { auto primitive_message1 = get_messages_basic_types()[0]; primitive_message1->int32_value = 42; @@ -229,11 +229,10 @@ TEST_F(RosBag2PlayTestFixture, starting_paused_receives_all_messages) prepared_mock_reader->prepare(messages, topic_types); reader_ = std::make_unique(std::move(prepared_mock_reader)); - // Expect to receive all 3 messages of each type, as many as published. - // Pause feature should allow time for subscribers to start up and catch all - // published messages. - sub_->add_subscription("/topic1", 3); - sub_->add_subscription("/topic2", 3); + // Due to a problem related to the subscriber, we play many (3) messages but make the subscriber + // node spin only until 2 have arrived. Hence the 2 as `launch_subscriber()` argument. + sub_->add_subscription("/topic1", 2); + sub_->add_subscription("/topic2", 2); auto await_received_messages = sub_->spin_subscriptions(); @@ -244,8 +243,8 @@ TEST_F(RosBag2PlayTestFixture, starting_paused_receives_all_messages) std::future future_handle = std::async( std::launch::async, [&rosbag2_transport]() mutable { - // Wait for node initialization and subscribers to get ready, then unpause - std::this_thread::sleep_for(std::chrono::milliseconds(1000)); + // Wait for node initialization, then unpause + std::this_thread::sleep_for(std::chrono::milliseconds(500)); rosbag2_transport.activate_lifecycle(); }); @@ -255,14 +254,14 @@ TEST_F(RosBag2PlayTestFixture, starting_paused_receives_all_messages) auto replayed_test_primitives = sub_->get_received_messages( "/topic1"); - EXPECT_THAT(replayed_test_primitives, SizeIs(Ge(3u))); + EXPECT_THAT(replayed_test_primitives, SizeIs(Ge(2u))); EXPECT_THAT( replayed_test_primitives, Each(Pointee(Field(&test_msgs::msg::BasicTypes::int32_value, 42)))); auto replayed_test_arrays = sub_->get_received_messages( "/topic2"); - EXPECT_THAT(replayed_test_arrays, SizeIs(Ge(3u))); + EXPECT_THAT(replayed_test_arrays, SizeIs(Ge(2u))); EXPECT_THAT( replayed_test_arrays, Each( From 092015da00c0426c204743cac63a0e83d6eec42b Mon Sep 17 00:00:00 2001 From: Mabel Zhang Date: Sat, 13 Jun 2020 08:18:07 -0400 Subject: [PATCH 20/30] keyboard spacebar for unpausing Signed-off-by: Mabel Zhang --- .../src/rosbag2_transport/player.cpp | 123 +++++++++++++++++- .../src/rosbag2_transport/player.hpp | 24 ++++ 2 files changed, 140 insertions(+), 7 deletions(-) diff --git a/rosbag2_transport/src/rosbag2_transport/player.cpp b/rosbag2_transport/src/rosbag2_transport/player.cpp index 5de39f8709..d9732986dc 100644 --- a/rosbag2_transport/src/rosbag2_transport/player.cpp +++ b/rosbag2_transport/src/rosbag2_transport/player.cpp @@ -79,9 +79,15 @@ Player::queue_read_wait_period_ = std::chrono::milliseconds(100); Player::Player( std::shared_ptr reader, std::shared_ptr rosbag2_transport) -: reader_(std::move(reader)), rosbag2_transport_(rosbag2_transport) +: reader_(std::move(reader)), rosbag2_transport_(rosbag2_transport), + terminal_modified_(false) {} +Player::~Player() +{ + restore_terminal(); +} + bool Player::is_storage_completely_loaded() const { if (storage_loading_future_.valid() && @@ -113,6 +119,7 @@ void Player::play(const PlayOptions & options) rosbag2_transport_->activate(); } + setup_terminal(); play_messages_from_queue(options); } @@ -206,17 +213,27 @@ void Player::play_messages_until_queue_empty(const PlayOptions & options) // Sleep until activated externally while (rosbag2_transport_->get_current_state().id() != - lifecycle_msgs::msg::State::PRIMARY_STATE_ACTIVE) + lifecycle_msgs::msg::State::PRIMARY_STATE_ACTIVE && rclcpp::ok()) { - std::cerr << rosbag2_transport_->get_current_state().id() << std::endl; + // std::cerr << rosbag2_transport_->get_current_state().id() << std::endl; std::this_thread::sleep_for(std::chrono::milliseconds(100)); + + // TODO(mabelzhang) get keyboard input without blocking + int input = read_char_from_stdin(); + switch (input) { + case ' ': + rosbag2_transport_->activate(); + break; + // default: + // std::cerr << input << std::endl; + } } - ROSBAG2_TRANSPORT_LOG_INFO("Resumed"); - // TODO(mabelzhang) Find a way to get keyboard input without blocking - // getc(stdin); paused_duration_ += std::chrono::system_clock::now() - pause_start; - // rosbag2_transport_->activate(); + + if (rclcpp::ok()) { + ROSBAG2_TRANSPORT_LOG_INFO("Resumed"); + } } if (rclcpp::ok()) { @@ -242,4 +259,96 @@ void Player::prepare_publishers(const PlayOptions & options) topic.name, topic.type, topic_qos))); } } + +void Player::setup_terminal() +{ + if (terminal_modified_) + return; + +#if defined(_MSC_VER) + input_handle = GetStdHandle(STD_INPUT_HANDLE); + if (input_handle == INVALID_HANDLE_VALUE) { + std::cout << "Failed to set up standard input handle." << std::endl; + return; + } + if (!GetConsoleMode(input_handle, &stdin_set)) { + std::cout << "Failed to save the console mode." << std::endl; + return; + } + // don't actually need anything but the default, alternatively try this + //DWORD event_mode = ENABLE_WINDOW_INPUT | ENABLE_MOUSE_INPUT; + //if (!SetConsoleMode(input_handle, event_mode)) { + // std::cout << "Failed to set the console mode." << std::endl; + // return; + //} + terminal_modified_ = true; +#else + const int fd = fileno(stdin); + termios flags; + tcgetattr(fd, &orig_flags_); + flags = orig_flags_; + flags.c_lflag &= ~ICANON; // set raw (unset canonical modes) + flags.c_cc[VMIN] = 0; // i.e. min 1 char for blocking, 0 chars for non-blocking + flags.c_cc[VTIME] = 0; // block if waiting for char + tcsetattr(fd, TCSANOW, &flags); + + FD_ZERO(&stdin_fdset_); + FD_SET(fd, &stdin_fdset_); + maxfd_ = fd + 1; + terminal_modified_ = true; +#endif +} + +void Player::restore_terminal() +{ + if (!terminal_modified_) + return; + +#if defined(_MSC_VER) + SetConsoleMode(input_handle, stdin_set); +#else + const int fd = fileno(stdin); + tcsetattr(fd, TCSANOW, &orig_flags_); +#endif + terminal_modified_ = false; +} + +int Player::read_char_from_stdin() +{ +#ifdef __APPLE__ + fd_set testfd; + FD_COPY(&stdin_fdset_, &testfd); +#elif !defined(_MSC_VER) + fd_set testfd = stdin_fdset_; +#endif + +#if defined(_MSC_VER) + DWORD events = 0; + INPUT_RECORD input_record[1]; + DWORD input_size = 1; + BOOL b = GetNumberOfConsoleInputEvents(input_handle, &events); + if (b && events > 0) { + b = ReadConsoleInput(input_handle, input_record, input_size, &events); + if (b) { + for (unsigned int i = 0; i < events; ++i) { + if (input_record[i].EventType & KEY_EVENT & input_record[i].Event.KeyEvent.bKeyDown) + { + CHAR ch = input_record[i].Event.KeyEvent.uChar.AsciiChar; + return ch; + } + } + } + } + return EOF; +#else + timeval tv; + tv.tv_sec = 0; + tv.tv_usec = 0; + if (select(maxfd_, &testfd, NULL, NULL, &tv) <= 0) { + return EOF; + } + return getc(stdin); +#endif +} + } // namespace rosbag2_transport diff --git a/rosbag2_transport/src/rosbag2_transport/player.hpp b/rosbag2_transport/src/rosbag2_transport/player.hpp index 0a21390cd4..d19786ae0d 100644 --- a/rosbag2_transport/src/rosbag2_transport/player.hpp +++ b/rosbag2_transport/src/rosbag2_transport/player.hpp @@ -22,6 +22,14 @@ #include #include +// Terminal +#if !defined(_MSC_VER) + #include + #include +#else + #include +#endif + #include "moodycamel/readerwriterqueue.h" #include "rclcpp/qos.hpp" @@ -50,6 +58,8 @@ class Player std::shared_ptr reader, std::shared_ptr rosbag2_transport); + ~Player(); + void play(const PlayOptions & options); private: @@ -60,6 +70,9 @@ class Player void play_messages_from_queue(const PlayOptions & options); void play_messages_until_queue_empty(const PlayOptions & options); void prepare_publishers(const PlayOptions & options); + int read_char_from_stdin(); + void setup_terminal(); + void restore_terminal(); static constexpr double read_ahead_lower_bound_percentage_ = 0.9; static const std::chrono::milliseconds queue_read_wait_period_; @@ -71,6 +84,17 @@ class Player std::shared_ptr rosbag2_transport_; std::unordered_map> publishers_; std::unordered_map topic_qos_profile_overrides_; + + // Terminal + bool terminal_modified_; +#if defined(_MSC_VER) + HANDLE input_handle; + DWORD stdin_set; +#else + termios orig_flags_; + fd_set stdin_fdset_; +#endif + int maxfd_; }; } // namespace rosbag2_transport From 6fc2981755afe86e5210e0cba1023dd22fe27677 Mon Sep 17 00:00:00 2001 From: Mabel Zhang Date: Wed, 17 Jun 2020 02:29:00 -0400 Subject: [PATCH 21/30] separate thread for handling keypress (un)pause Signed-off-by: Mabel Zhang --- .../src/rosbag2_transport/player.cpp | 66 +++++++++++-------- .../src/rosbag2_transport/player.hpp | 3 + 2 files changed, 40 insertions(+), 29 deletions(-) diff --git a/rosbag2_transport/src/rosbag2_transport/player.cpp b/rosbag2_transport/src/rosbag2_transport/player.cpp index d9732986dc..c2bcaa7ef6 100644 --- a/rosbag2_transport/src/rosbag2_transport/player.cpp +++ b/rosbag2_transport/src/rosbag2_transport/player.cpp @@ -79,8 +79,8 @@ Player::queue_read_wait_period_ = std::chrono::milliseconds(100); Player::Player( std::shared_ptr reader, std::shared_ptr rosbag2_transport) -: reader_(std::move(reader)), rosbag2_transport_(rosbag2_transport), - terminal_modified_(false) +: reader_(std::move(reader)), paused_(false), played_all_(false), + rosbag2_transport_(rosbag2_transport), terminal_modified_(false) {} Player::~Player() @@ -109,8 +109,6 @@ void Player::play(const PlayOptions & options) wait_for_filled_queue(options); - std::cerr << "1111111111111111111111111\n"; - rosbag2_transport_->configure(); // If playback should not be paused in the beginning, activate lifecycle node right away. // If playback should be paused, move on. @@ -120,6 +118,10 @@ void Player::play(const PlayOptions & options) } setup_terminal(); + std::future keypress_future = std::async( + std::launch::async, + [this]() {handle_keypress();}); + play_messages_from_queue(options); } @@ -186,6 +188,8 @@ void Player::play_messages_from_queue(const PlayOptions & options) "increasing the --read-ahead-queue-size option."); } } while (!is_storage_completely_loaded() && rclcpp::ok()); + + played_all_ = true; } void Player::play_messages_until_queue_empty(const PlayOptions & options) @@ -215,18 +219,7 @@ void Player::play_messages_until_queue_empty(const PlayOptions & options) while (rosbag2_transport_->get_current_state().id() != lifecycle_msgs::msg::State::PRIMARY_STATE_ACTIVE && rclcpp::ok()) { - // std::cerr << rosbag2_transport_->get_current_state().id() << std::endl; - std::this_thread::sleep_for(std::chrono::milliseconds(100)); - - // TODO(mabelzhang) get keyboard input without blocking - int input = read_char_from_stdin(); - switch (input) { - case ' ': - rosbag2_transport_->activate(); - break; - // default: - // std::cerr << input << std::endl; - } + std::this_thread::sleep_for(std::chrono::milliseconds(30)); } paused_duration_ += std::chrono::system_clock::now() - pause_start; @@ -260,10 +253,31 @@ void Player::prepare_publishers(const PlayOptions & options) } } +void Player::handle_keypress() +{ + // Spin keyboard thread until all messages have been played + while (rclcpp::ok() && !played_all_) { + std::this_thread::sleep_for(std::chrono::milliseconds(30)); + + int input = read_char_from_stdin(); + switch (input) { + case ' ': + if (paused_) { + rosbag2_transport_->activate(); + } else { + rosbag2_transport_->deactivate(); + } + paused_ = !paused_; + break; + } + } +} + void Player::setup_terminal() { - if (terminal_modified_) + if (terminal_modified_) { return; + } #if defined(_MSC_VER) input_handle = GetStdHandle(STD_INPUT_HANDLE); @@ -275,12 +289,6 @@ void Player::setup_terminal() std::cout << "Failed to save the console mode." << std::endl; return; } - // don't actually need anything but the default, alternatively try this - //DWORD event_mode = ENABLE_WINDOW_INPUT | ENABLE_MOUSE_INPUT; - //if (!SetConsoleMode(input_handle, event_mode)) { - // std::cout << "Failed to set the console mode." << std::endl; - // return; - //} terminal_modified_ = true; #else const int fd = fileno(stdin); @@ -288,7 +296,7 @@ void Player::setup_terminal() tcgetattr(fd, &orig_flags_); flags = orig_flags_; flags.c_lflag &= ~ICANON; // set raw (unset canonical modes) - flags.c_cc[VMIN] = 0; // i.e. min 1 char for blocking, 0 chars for non-blocking + flags.c_cc[VMIN] = 0; // i.e. min 1 char for blocking, 0 chars for non-blocking flags.c_cc[VTIME] = 0; // block if waiting for char tcsetattr(fd, TCSANOW, &flags); @@ -301,8 +309,9 @@ void Player::setup_terminal() void Player::restore_terminal() { - if (!terminal_modified_) - return; + if (!terminal_modified_) { + return; + } #if defined(_MSC_VER) SetConsoleMode(input_handle, stdin_set); @@ -331,8 +340,7 @@ int Player::read_char_from_stdin() b = ReadConsoleInput(input_handle, input_record, input_size, &events); if (b) { for (unsigned int i = 0; i < events; ++i) { - if (input_record[i].EventType & KEY_EVENT & input_record[i].Event.KeyEvent.bKeyDown) - { + if (input_record[i].EventType & KEY_EVENT & input_record[i].Event.KeyEvent.bKeyDown) { CHAR ch = input_record[i].Event.KeyEvent.uChar.AsciiChar; return ch; } @@ -342,7 +350,7 @@ int Player::read_char_from_stdin() return EOF; #else timeval tv; - tv.tv_sec = 0; + tv.tv_sec = 0; tv.tv_usec = 0; if (select(maxfd_, &testfd, NULL, NULL, &tv) <= 0) { return EOF; diff --git a/rosbag2_transport/src/rosbag2_transport/player.hpp b/rosbag2_transport/src/rosbag2_transport/player.hpp index d19786ae0d..05b032f8b1 100644 --- a/rosbag2_transport/src/rosbag2_transport/player.hpp +++ b/rosbag2_transport/src/rosbag2_transport/player.hpp @@ -71,6 +71,7 @@ class Player void play_messages_until_queue_empty(const PlayOptions & options); void prepare_publishers(const PlayOptions & options); int read_char_from_stdin(); + void handle_keypress(); void setup_terminal(); void restore_terminal(); static constexpr double read_ahead_lower_bound_percentage_ = 0.9; @@ -79,7 +80,9 @@ class Player std::shared_ptr reader_; moodycamel::ReaderWriterQueue message_queue_; std::chrono::time_point start_time_; + bool paused_; std::chrono::nanoseconds paused_duration_; + bool played_all_; mutable std::future storage_loading_future_; std::shared_ptr rosbag2_transport_; std::unordered_map> publishers_; From 7cec0a3aeef18bb9ac628759ff7876f94c401b44 Mon Sep 17 00:00:00 2001 From: Mabel Zhang Date: Wed, 17 Jun 2020 02:32:45 -0400 Subject: [PATCH 22/30] set pause flag if start paused Signed-off-by: Mabel Zhang --- rosbag2_transport/src/rosbag2_transport/player.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/rosbag2_transport/src/rosbag2_transport/player.cpp b/rosbag2_transport/src/rosbag2_transport/player.cpp index c2bcaa7ef6..1077473d95 100644 --- a/rosbag2_transport/src/rosbag2_transport/player.cpp +++ b/rosbag2_transport/src/rosbag2_transport/player.cpp @@ -115,6 +115,8 @@ void Player::play(const PlayOptions & options) // Playback will detect when node is activated, either from here or externally. if (!options.paused) { rosbag2_transport_->activate(); + } else { + paused_ = true; } setup_terminal(); @@ -231,8 +233,6 @@ void Player::play_messages_until_queue_empty(const PlayOptions & options) if (rclcpp::ok()) { publishers_[message.message->topic_name]->publish(message.message->serialized_data); - // TODO(mabelzhang) TEMPORARY, remove when done debugging. And counter above. - fprintf(stderr, "publishing message %zu\n", (++counter)); } } } From f514f5139312002da58f8ab0d76db27ee22422e8 Mon Sep 17 00:00:00 2001 From: Mabel Zhang Date: Wed, 17 Jun 2020 17:20:29 -0400 Subject: [PATCH 23/30] merge cleanup Signed-off-by: Mabel Zhang --- rosbag2_transport/CMakeLists.txt | 4 +--- rosbag2_transport/src/rosbag2_transport/player.cpp | 1 - 2 files changed, 1 insertion(+), 4 deletions(-) diff --git a/rosbag2_transport/CMakeLists.txt b/rosbag2_transport/CMakeLists.txt index a3ea902a0e..24b5437b55 100644 --- a/rosbag2_transport/CMakeLists.txt +++ b/rosbag2_transport/CMakeLists.txt @@ -22,15 +22,13 @@ endif() find_package(ament_cmake REQUIRED) find_package(ament_cmake_ros REQUIRED) -# TODO(Karsten1987) rosbag2_cpp has to be found first here -# See https://github.com/ros2/ros2/issues/927 -find_package(rosbag2_cpp REQUIRED) find_package(rcl REQUIRED) find_package(rclcpp REQUIRED) find_package(rclcpp_lifecycle REQUIRED) find_package(rcutils REQUIRED) find_package(rmw REQUIRED) find_package(rosbag2_compression REQUIRED) +find_package(rosbag2_cpp REQUIRED) find_package(rmw_implementation_cmake REQUIRED) find_package(shared_queues_vendor REQUIRED) find_package(yaml_cpp_vendor REQUIRED) diff --git a/rosbag2_transport/src/rosbag2_transport/player.cpp b/rosbag2_transport/src/rosbag2_transport/player.cpp index 1077473d95..3b1f6c9423 100644 --- a/rosbag2_transport/src/rosbag2_transport/player.cpp +++ b/rosbag2_transport/src/rosbag2_transport/player.cpp @@ -204,7 +204,6 @@ void Player::play_messages_until_queue_empty(const PlayOptions & options) rate = options.rate; } - static size_t counter = 0; while (message_queue_.try_dequeue(message) && rclcpp::ok()) { std::this_thread::sleep_until( start_time_ + std::chrono::duration_cast( From 9c929722c8de1dbd2b7c10a8a9e08be118f25824 Mon Sep 17 00:00:00 2001 From: Mabel Zhang Date: Thu, 25 Jun 2020 17:27:52 -0400 Subject: [PATCH 24/30] remove paused_ var Signed-off-by: Mabel Zhang --- rosbag2_transport/src/rosbag2_transport/player.cpp | 9 ++++----- rosbag2_transport/src/rosbag2_transport/player.hpp | 1 - 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/rosbag2_transport/src/rosbag2_transport/player.cpp b/rosbag2_transport/src/rosbag2_transport/player.cpp index 3b1f6c9423..3fda9e8793 100644 --- a/rosbag2_transport/src/rosbag2_transport/player.cpp +++ b/rosbag2_transport/src/rosbag2_transport/player.cpp @@ -79,7 +79,7 @@ Player::queue_read_wait_period_ = std::chrono::milliseconds(100); Player::Player( std::shared_ptr reader, std::shared_ptr rosbag2_transport) -: reader_(std::move(reader)), paused_(false), played_all_(false), +: reader_(std::move(reader)), played_all_(false), rosbag2_transport_(rosbag2_transport), terminal_modified_(false) {} @@ -115,8 +115,6 @@ void Player::play(const PlayOptions & options) // Playback will detect when node is activated, either from here or externally. if (!options.paused) { rosbag2_transport_->activate(); - } else { - paused_ = true; } setup_terminal(); @@ -261,12 +259,13 @@ void Player::handle_keypress() int input = read_char_from_stdin(); switch (input) { case ' ': - if (paused_) { + if (rosbag2_transport_->get_current_state().id() != + lifecycle_msgs::msg::State::PRIMARY_STATE_ACTIVE) + { rosbag2_transport_->activate(); } else { rosbag2_transport_->deactivate(); } - paused_ = !paused_; break; } } diff --git a/rosbag2_transport/src/rosbag2_transport/player.hpp b/rosbag2_transport/src/rosbag2_transport/player.hpp index 05b032f8b1..628e9bafbd 100644 --- a/rosbag2_transport/src/rosbag2_transport/player.hpp +++ b/rosbag2_transport/src/rosbag2_transport/player.hpp @@ -80,7 +80,6 @@ class Player std::shared_ptr reader_; moodycamel::ReaderWriterQueue message_queue_; std::chrono::time_point start_time_; - bool paused_; std::chrono::nanoseconds paused_duration_; bool played_all_; mutable std::future storage_loading_future_; From fd97872fab462d141ae135e45ac16a65e9565cd8 Mon Sep 17 00:00:00 2001 From: Mabel Zhang Date: Thu, 25 Jun 2020 19:52:34 -0400 Subject: [PATCH 25/30] refactor KeyboardHandler from Player Signed-off-by: Mabel Zhang --- rosbag2_transport/CMakeLists.txt | 1 + .../rosbag2_transport/keyboard_handler.cpp | 118 ++++++++++++++++++ .../rosbag2_transport/keyboard_handler.hpp | 54 ++++++++ .../src/rosbag2_transport/player.cpp | 97 +------------- .../src/rosbag2_transport/player.hpp | 28 +---- 5 files changed, 179 insertions(+), 119 deletions(-) create mode 100644 rosbag2_transport/src/rosbag2_transport/keyboard_handler.cpp create mode 100644 rosbag2_transport/src/rosbag2_transport/keyboard_handler.hpp diff --git a/rosbag2_transport/CMakeLists.txt b/rosbag2_transport/CMakeLists.txt index 24b5437b55..0259224f8b 100644 --- a/rosbag2_transport/CMakeLists.txt +++ b/rosbag2_transport/CMakeLists.txt @@ -38,6 +38,7 @@ add_library(${PROJECT_NAME} SHARED src/rosbag2_transport/formatter.cpp src/rosbag2_transport/generic_publisher.cpp src/rosbag2_transport/generic_subscription.cpp + src/rosbag2_transport/keyboard_handler.cpp src/rosbag2_transport/qos.cpp src/rosbag2_transport/recorder.cpp src/rosbag2_transport/rosbag2_node.cpp diff --git a/rosbag2_transport/src/rosbag2_transport/keyboard_handler.cpp b/rosbag2_transport/src/rosbag2_transport/keyboard_handler.cpp new file mode 100644 index 0000000000..92cef74cae --- /dev/null +++ b/rosbag2_transport/src/rosbag2_transport/keyboard_handler.cpp @@ -0,0 +1,118 @@ +// Copyright 2020 Open Source Robotics Foundation, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include "keyboard_handler.hpp" + +#include + +namespace rosbag2_transport +{ + +KeyboardHandler::KeyboardHandler() +: terminal_modified_(false) +{ +} + +KeyboardHandler::~KeyboardHandler() +{ + restore_terminal(); +} + +void KeyboardHandler::setup_terminal() +{ + if (terminal_modified_) { + return; + } + +#if defined(_MSC_VER) + input_handle = GetStdHandle(STD_INPUT_HANDLE); + if (input_handle == INVALID_HANDLE_VALUE) { + std::cout << "Failed to set up standard input handle." << std::endl; + return; + } + if (!GetConsoleMode(input_handle, &stdin_set)) { + std::cout << "Failed to save the console mode." << std::endl; + return; + } + terminal_modified_ = true; +#else + const int fd = fileno(stdin); + termios flags; + tcgetattr(fd, &orig_flags_); + flags = orig_flags_; + flags.c_lflag &= ~ICANON; // set raw (unset canonical modes) + flags.c_cc[VMIN] = 0; // i.e. min 1 char for blocking, 0 chars for non-blocking + flags.c_cc[VTIME] = 0; // block if waiting for char + tcsetattr(fd, TCSANOW, &flags); + + FD_ZERO(&stdin_fdset_); + FD_SET(fd, &stdin_fdset_); + maxfd_ = fd + 1; + terminal_modified_ = true; +#endif +} + +void KeyboardHandler::restore_terminal() +{ + if (!terminal_modified_) { + return; + } + +#if defined(_MSC_VER) + SetConsoleMode(input_handle, stdin_set); +#else + const int fd = fileno(stdin); + tcsetattr(fd, TCSANOW, &orig_flags_); +#endif + terminal_modified_ = false; +} + +int KeyboardHandler::read_char_from_stdin() +{ +#ifdef __APPLE__ + fd_set testfd; + FD_COPY(&stdin_fdset_, &testfd); +#elif !defined(_MSC_VER) + fd_set testfd = stdin_fdset_; +#endif + +#if defined(_MSC_VER) + DWORD events = 0; + INPUT_RECORD input_record[1]; + DWORD input_size = 1; + BOOL b = GetNumberOfConsoleInputEvents(input_handle, &events); + if (b && events > 0) { + b = ReadConsoleInput(input_handle, input_record, input_size, &events); + if (b) { + for (unsigned int i = 0; i < events; ++i) { + if (input_record[i].EventType & KEY_EVENT & input_record[i].Event.KeyEvent.bKeyDown) { + CHAR ch = input_record[i].Event.KeyEvent.uChar.AsciiChar; + return ch; + } + } + } + } + return EOF; +#else + timeval tv; + tv.tv_sec = 0; + tv.tv_usec = 0; + if (select(maxfd_, &testfd, NULL, NULL, &tv) <= 0) { + return EOF; + } + return getc(stdin); +#endif +} + +} // namespace rosbag2_transport diff --git a/rosbag2_transport/src/rosbag2_transport/keyboard_handler.hpp b/rosbag2_transport/src/rosbag2_transport/keyboard_handler.hpp new file mode 100644 index 0000000000..9800907b81 --- /dev/null +++ b/rosbag2_transport/src/rosbag2_transport/keyboard_handler.hpp @@ -0,0 +1,54 @@ +// Copyright 2020 Open Source Robotics Foundation, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#ifndef ROSBAG2_TRANSPORT__KEYBOARD_HANDLER_HPP_ +#define ROSBAG2_TRANSPORT__KEYBOARD_HANDLER_HPP_ + +#include + +#if !defined(_MSC_VER) + #include + #include +#else + #include +#endif + +namespace rosbag2_transport +{ + +class KeyboardHandler +{ +public: + KeyboardHandler(); + ~KeyboardHandler(); + + void setup_terminal(); + void restore_terminal(); + int read_char_from_stdin(); + +private: + bool terminal_modified_; +#if defined(_MSC_VER) + HANDLE input_handle; + DWORD stdin_set; +#else + termios orig_flags_; + fd_set stdin_fdset_; +#endif + int maxfd_; +}; + +} // namespace rosbag2_transport + +#endif // ROSBAG2_TRANSPORT__KEYBOARD_HANDLER_HPP_ diff --git a/rosbag2_transport/src/rosbag2_transport/player.cpp b/rosbag2_transport/src/rosbag2_transport/player.cpp index 3fda9e8793..9713b09786 100644 --- a/rosbag2_transport/src/rosbag2_transport/player.cpp +++ b/rosbag2_transport/src/rosbag2_transport/player.cpp @@ -80,14 +80,9 @@ Player::queue_read_wait_period_ = std::chrono::milliseconds(100); Player::Player( std::shared_ptr reader, std::shared_ptr rosbag2_transport) : reader_(std::move(reader)), played_all_(false), - rosbag2_transport_(rosbag2_transport), terminal_modified_(false) + rosbag2_transport_(rosbag2_transport) {} -Player::~Player() -{ - restore_terminal(); -} - bool Player::is_storage_completely_loaded() const { if (storage_loading_future_.valid() && @@ -117,7 +112,7 @@ void Player::play(const PlayOptions & options) rosbag2_transport_->activate(); } - setup_terminal(); + kb_handler_.setup_terminal(); std::future keypress_future = std::async( std::launch::async, [this]() {handle_keypress();}); @@ -256,7 +251,7 @@ void Player::handle_keypress() while (rclcpp::ok() && !played_all_) { std::this_thread::sleep_for(std::chrono::milliseconds(30)); - int input = read_char_from_stdin(); + int input = kb_handler_.read_char_from_stdin(); switch (input) { case ' ': if (rosbag2_transport_->get_current_state().id() != @@ -271,90 +266,4 @@ void Player::handle_keypress() } } -void Player::setup_terminal() -{ - if (terminal_modified_) { - return; - } - -#if defined(_MSC_VER) - input_handle = GetStdHandle(STD_INPUT_HANDLE); - if (input_handle == INVALID_HANDLE_VALUE) { - std::cout << "Failed to set up standard input handle." << std::endl; - return; - } - if (!GetConsoleMode(input_handle, &stdin_set)) { - std::cout << "Failed to save the console mode." << std::endl; - return; - } - terminal_modified_ = true; -#else - const int fd = fileno(stdin); - termios flags; - tcgetattr(fd, &orig_flags_); - flags = orig_flags_; - flags.c_lflag &= ~ICANON; // set raw (unset canonical modes) - flags.c_cc[VMIN] = 0; // i.e. min 1 char for blocking, 0 chars for non-blocking - flags.c_cc[VTIME] = 0; // block if waiting for char - tcsetattr(fd, TCSANOW, &flags); - - FD_ZERO(&stdin_fdset_); - FD_SET(fd, &stdin_fdset_); - maxfd_ = fd + 1; - terminal_modified_ = true; -#endif -} - -void Player::restore_terminal() -{ - if (!terminal_modified_) { - return; - } - -#if defined(_MSC_VER) - SetConsoleMode(input_handle, stdin_set); -#else - const int fd = fileno(stdin); - tcsetattr(fd, TCSANOW, &orig_flags_); -#endif - terminal_modified_ = false; -} - -int Player::read_char_from_stdin() -{ -#ifdef __APPLE__ - fd_set testfd; - FD_COPY(&stdin_fdset_, &testfd); -#elif !defined(_MSC_VER) - fd_set testfd = stdin_fdset_; -#endif - -#if defined(_MSC_VER) - DWORD events = 0; - INPUT_RECORD input_record[1]; - DWORD input_size = 1; - BOOL b = GetNumberOfConsoleInputEvents(input_handle, &events); - if (b && events > 0) { - b = ReadConsoleInput(input_handle, input_record, input_size, &events); - if (b) { - for (unsigned int i = 0; i < events; ++i) { - if (input_record[i].EventType & KEY_EVENT & input_record[i].Event.KeyEvent.bKeyDown) { - CHAR ch = input_record[i].Event.KeyEvent.uChar.AsciiChar; - return ch; - } - } - } - } - return EOF; -#else - timeval tv; - tv.tv_sec = 0; - tv.tv_usec = 0; - if (select(maxfd_, &testfd, NULL, NULL, &tv) <= 0) { - return EOF; - } - return getc(stdin); -#endif -} - } // namespace rosbag2_transport diff --git a/rosbag2_transport/src/rosbag2_transport/player.hpp b/rosbag2_transport/src/rosbag2_transport/player.hpp index 628e9bafbd..e19050c5fa 100644 --- a/rosbag2_transport/src/rosbag2_transport/player.hpp +++ b/rosbag2_transport/src/rosbag2_transport/player.hpp @@ -22,20 +22,13 @@ #include #include -// Terminal -#if !defined(_MSC_VER) - #include - #include -#else - #include -#endif - #include "moodycamel/readerwriterqueue.h" #include "rclcpp/qos.hpp" #include "rosbag2_transport/play_options.hpp" +#include "keyboard_handler.hpp" #include "replayable_message.hpp" using TimePoint = std::chrono::time_point; @@ -58,8 +51,6 @@ class Player std::shared_ptr reader, std::shared_ptr rosbag2_transport); - ~Player(); - void play(const PlayOptions & options); private: @@ -70,33 +61,20 @@ class Player void play_messages_from_queue(const PlayOptions & options); void play_messages_until_queue_empty(const PlayOptions & options); void prepare_publishers(const PlayOptions & options); - int read_char_from_stdin(); void handle_keypress(); - void setup_terminal(); - void restore_terminal(); + static constexpr double read_ahead_lower_bound_percentage_ = 0.9; static const std::chrono::milliseconds queue_read_wait_period_; - std::shared_ptr reader_; moodycamel::ReaderWriterQueue message_queue_; std::chrono::time_point start_time_; std::chrono::nanoseconds paused_duration_; bool played_all_; + KeyboardHandler kb_handler_; mutable std::future storage_loading_future_; std::shared_ptr rosbag2_transport_; std::unordered_map> publishers_; std::unordered_map topic_qos_profile_overrides_; - - // Terminal - bool terminal_modified_; -#if defined(_MSC_VER) - HANDLE input_handle; - DWORD stdin_set; -#else - termios orig_flags_; - fd_set stdin_fdset_; -#endif - int maxfd_; }; } // namespace rosbag2_transport From 3f341ff4cd2db21892865897f31fd46d7673e0dc Mon Sep 17 00:00:00 2001 From: Mabel Zhang Date: Sat, 25 Jul 2020 02:41:06 -0400 Subject: [PATCH 26/30] address minor PR comments Signed-off-by: Mabel Zhang --- rosbag2_transport/CMakeLists.txt | 1 + .../rosbag2_transport/rosbag2_transport.hpp | 8 ++++---- rosbag2_transport/package.xml | 1 + .../src/rosbag2_transport/keyboard_handler.cpp | 2 +- .../src/rosbag2_transport/player.cpp | 8 +++++--- .../src/rosbag2_transport/player.hpp | 1 + .../src/rosbag2_transport/rosbag2_transport.cpp | 6 ++---- .../test/rosbag2_transport/test_play.cpp | 4 ++-- .../test/rosbag2_transport/test_play_timing.cpp | 15 ++++++--------- 9 files changed, 23 insertions(+), 23 deletions(-) diff --git a/rosbag2_transport/CMakeLists.txt b/rosbag2_transport/CMakeLists.txt index 0259224f8b..99849afb92 100644 --- a/rosbag2_transport/CMakeLists.txt +++ b/rosbag2_transport/CMakeLists.txt @@ -22,6 +22,7 @@ endif() find_package(ament_cmake REQUIRED) find_package(ament_cmake_ros REQUIRED) +find_package(lifecycle_msgs REQUIRED) find_package(rcl REQUIRED) find_package(rclcpp REQUIRED) find_package(rclcpp_lifecycle REQUIRED) diff --git a/rosbag2_transport/include/rosbag2_transport/rosbag2_transport.hpp b/rosbag2_transport/include/rosbag2_transport/rosbag2_transport.hpp index 5a610c4608..7569dc5bc5 100644 --- a/rosbag2_transport/include/rosbag2_transport/rosbag2_transport.hpp +++ b/rosbag2_transport/include/rosbag2_transport/rosbag2_transport.hpp @@ -85,16 +85,16 @@ class Rosbag2Transport void print_bag_info(const std::string & uri, const std::string & storage_id); /** - * Activate underlying lifecycle node. + * Resume playback. */ ROSBAG2_TRANSPORT_PUBLIC - void activate_lifecycle(); + void resume(); /** - * Deactivate underlying lifecycle node. + * Pause playback. */ ROSBAG2_TRANSPORT_PUBLIC - void deactivate_lifecycle(); + void pause(); private: std::shared_ptr setup_node( diff --git a/rosbag2_transport/package.xml b/rosbag2_transport/package.xml index abbad7bea0..002e001ce8 100644 --- a/rosbag2_transport/package.xml +++ b/rosbag2_transport/package.xml @@ -10,6 +10,7 @@ ament_cmake_ros + lifecycle_msgs python_cmake_module rclcpp rclcpp_lifecycle diff --git a/rosbag2_transport/src/rosbag2_transport/keyboard_handler.cpp b/rosbag2_transport/src/rosbag2_transport/keyboard_handler.cpp index 92cef74cae..6188659851 100644 --- a/rosbag2_transport/src/rosbag2_transport/keyboard_handler.cpp +++ b/rosbag2_transport/src/rosbag2_transport/keyboard_handler.cpp @@ -80,7 +80,7 @@ void KeyboardHandler::restore_terminal() int KeyboardHandler::read_char_from_stdin() { -#ifdef __APPLE__ +#if defined(__APPLE__) fd_set testfd; FD_COPY(&stdin_fdset_, &testfd); #elif !defined(_MSC_VER) diff --git a/rosbag2_transport/src/rosbag2_transport/player.cpp b/rosbag2_transport/src/rosbag2_transport/player.cpp index 9713b09786..986e5045ff 100644 --- a/rosbag2_transport/src/rosbag2_transport/player.cpp +++ b/rosbag2_transport/src/rosbag2_transport/player.cpp @@ -22,10 +22,11 @@ #include #include +#include "lifecycle_msgs/msg/state.hpp" + #include "rcl/graph.h" #include "rclcpp/rclcpp.hpp" -#include "lifecycle_msgs/msg/state.hpp" #include "rcutils/time.h" @@ -76,6 +77,8 @@ namespace rosbag2_transport const std::chrono::milliseconds Player::queue_read_wait_period_ = std::chrono::milliseconds(100); +const std::chrono::milliseconds +Player::pause_sleep_period_ = std::chrono::milliseconds(30); Player::Player( std::shared_ptr reader, std::shared_ptr rosbag2_transport) @@ -176,7 +179,6 @@ void Player::play_messages_from_queue(const PlayOptions & options) paused_duration_ = std::chrono::nanoseconds(0); do { play_messages_until_queue_empty(options); - if (!is_storage_completely_loaded() && rclcpp::ok()) { ROSBAG2_TRANSPORT_LOG_WARN( "Message queue starved. Messages will be delayed. Consider " @@ -213,7 +215,7 @@ void Player::play_messages_until_queue_empty(const PlayOptions & options) while (rosbag2_transport_->get_current_state().id() != lifecycle_msgs::msg::State::PRIMARY_STATE_ACTIVE && rclcpp::ok()) { - std::this_thread::sleep_for(std::chrono::milliseconds(30)); + std::this_thread::sleep_for(pause_sleep_period_); } paused_duration_ += std::chrono::system_clock::now() - pause_start; diff --git a/rosbag2_transport/src/rosbag2_transport/player.hpp b/rosbag2_transport/src/rosbag2_transport/player.hpp index e19050c5fa..56fb44f113 100644 --- a/rosbag2_transport/src/rosbag2_transport/player.hpp +++ b/rosbag2_transport/src/rosbag2_transport/player.hpp @@ -65,6 +65,7 @@ class Player static constexpr double read_ahead_lower_bound_percentage_ = 0.9; static const std::chrono::milliseconds queue_read_wait_period_; + static const std::chrono::milliseconds pause_sleep_period_; std::shared_ptr reader_; moodycamel::ReaderWriterQueue message_queue_; std::chrono::time_point start_time_; diff --git a/rosbag2_transport/src/rosbag2_transport/rosbag2_transport.cpp b/rosbag2_transport/src/rosbag2_transport/rosbag2_transport.cpp index 136a985b5b..df28aad28b 100644 --- a/rosbag2_transport/src/rosbag2_transport/rosbag2_transport.cpp +++ b/rosbag2_transport/src/rosbag2_transport/rosbag2_transport.cpp @@ -126,9 +126,8 @@ void Rosbag2Transport::print_bag_info(const std::string & uri, const std::string Formatter::format_bag_meta_data(metadata); } -void Rosbag2Transport::activate_lifecycle() +void Rosbag2Transport::resume() { - std::cerr << "Rosbag2Transport::activate_lifecycle()\n"; if (transport_node_) { transport_node_->activate(); } else { @@ -137,9 +136,8 @@ void Rosbag2Transport::activate_lifecycle() } } -void Rosbag2Transport::deactivate_lifecycle() +void Rosbag2Transport::pause() { - std::cerr << "Rosbag2Transport::deactivate_lifecycle()\n"; if (transport_node_) { transport_node_->deactivate(); } else { diff --git a/rosbag2_transport/test/rosbag2_transport/test_play.cpp b/rosbag2_transport/test/rosbag2_transport/test_play.cpp index 4d7f36bb24..294f964d67 100644 --- a/rosbag2_transport/test/rosbag2_transport/test_play.cpp +++ b/rosbag2_transport/test/rosbag2_transport/test_play.cpp @@ -243,9 +243,9 @@ TEST_F(RosBag2PlayTestFixture, starting_paused_can_resume) std::future future_handle = std::async( std::launch::async, [&rosbag2_transport]() mutable { - // Wait for node initialization, then unpause + // Wait for node initialization, then resume std::this_thread::sleep_for(std::chrono::milliseconds(500)); - rosbag2_transport.activate_lifecycle(); + rosbag2_transport.resume(); }); rosbag2_transport.play(storage_options_, play_options_); diff --git a/rosbag2_transport/test/rosbag2_transport/test_play_timing.cpp b/rosbag2_transport/test/rosbag2_transport/test_play_timing.cpp index 58746643d1..1051426e7a 100644 --- a/rosbag2_transport/test/rosbag2_transport/test_play_timing.cpp +++ b/rosbag2_transport/test/rosbag2_transport/test_play_timing.cpp @@ -191,7 +191,7 @@ TEST_F(Rosbag2TransportTestFixture, playing_starts_paused) ASSERT_THAT(replay_time, Gt(message_time_difference)); - // Start paused, unpause after some time + // Start paused, resume after some time prepared_mock_reader = std::make_unique(); prepared_mock_reader->prepare(messages, topics_and_types); reader_ = std::make_unique(std::move(prepared_mock_reader)); @@ -209,8 +209,7 @@ TEST_F(Rosbag2TransportTestFixture, playing_starts_paused) std::future future_handle = std::async( std::launch::async, [&rosbag2_transport, pause_time]() mutable { std::this_thread::sleep_for(pause_time); - std::cerr << "Test script test_play_timing calling activate_lifecycle()\n"; - rosbag2_transport.activate_lifecycle(); + rosbag2_transport.resume(); }); // Call play() to initialize the node and wait for activation @@ -239,15 +238,13 @@ TEST_F(Rosbag2TransportTestFixture, playing_starts_paused) // Pass node by reference so that it is initialized by play(). future_handle = std::async( std::launch::async, [&rosbag2_transport, message_time_difference]() mutable { - // Wait for node to initialize, deactivate to pause + // Wait for node to initialize, pause std::this_thread::sleep_for(message_time_difference); - std::cerr << "Test script test_play_timing calling deactivate_lifecycle()\n"; - rosbag2_transport.deactivate_lifecycle(); + rosbag2_transport.pause(); - // Wait, re-activate to unpause + // Wait, resume std::this_thread::sleep_for(message_time_difference); - std::cerr << "Test script test_play_timing calling activate_lifecycle()\n"; - rosbag2_transport.activate_lifecycle(); + rosbag2_transport.resume(); }); rosbag2_transport.play(storage_options_, play_options_); From 2ce8c36ab8839426db6e7bb199f17a9017a53d76 Mon Sep 17 00:00:00 2001 From: Mabel Zhang Date: Tue, 11 Aug 2020 15:41:27 -0400 Subject: [PATCH 27/30] Revert "command line pause option" This reverts commit c3e211d6c880e3f0d9a43fdb8092d82fa7556339. Signed-off-by: Mabel Zhang --- ros2bag/ros2bag/verb/play.py | 4 ---- .../include/rosbag2_transport/play_options.hpp | 1 - .../src/rosbag2_transport/rosbag2_transport_python.cpp | 6 +----- 3 files changed, 1 insertion(+), 10 deletions(-) diff --git a/ros2bag/ros2bag/verb/play.py b/ros2bag/ros2bag/verb/play.py index 2a7f2fc0da..3d66208e1e 100644 --- a/ros2bag/ros2bag/verb/play.py +++ b/ros2bag/ros2bag/verb/play.py @@ -52,9 +52,6 @@ def add_arguments(self, parser, cli_name): # noqa: D102 '-l', '--loop', action='store_true', help='enables loop playback when playing a bagfile: it starts back at the beginning ' 'on reaching the end and plays indefinitely.') - parser.add_argument( - '-p', '--paused', action='store_true', - help='start rosbag2 in paused mode. No messages are played at startup.') parser.add_argument( '--remap', '-m', default='', nargs='+', help='list of topics to be remapped: in the form ' @@ -85,5 +82,4 @@ def main(self, *, args): # noqa: D102 topics=args.topics, qos_profile_overrides=qos_profile_overrides, loop=args.loop, - paused=args.paused, topic_remapping=args.remap) diff --git a/rosbag2_transport/include/rosbag2_transport/play_options.hpp b/rosbag2_transport/include/rosbag2_transport/play_options.hpp index 208cb77a34..b616a76591 100644 --- a/rosbag2_transport/include/rosbag2_transport/play_options.hpp +++ b/rosbag2_transport/include/rosbag2_transport/play_options.hpp @@ -39,7 +39,6 @@ struct PlayOptions std::unordered_map topic_qos_profile_overrides = {}; bool loop = false; - bool paused = false; std::vector topic_remapping_options = {}; }; diff --git a/rosbag2_transport/src/rosbag2_transport/rosbag2_transport_python.cpp b/rosbag2_transport/src/rosbag2_transport/rosbag2_transport_python.cpp index 2772879315..10163ed90b 100644 --- a/rosbag2_transport/src/rosbag2_transport/rosbag2_transport_python.cpp +++ b/rosbag2_transport/src/rosbag2_transport/rosbag2_transport_python.cpp @@ -236,7 +236,6 @@ rosbag2_transport_play(PyObject * Py_UNUSED(self), PyObject * args, PyObject * k "topics", "qos_profile_overrides", "loop", - "paused", "topic_remapping", nullptr }; @@ -249,10 +248,9 @@ rosbag2_transport_play(PyObject * Py_UNUSED(self), PyObject * args, PyObject * k PyObject * topics = nullptr; PyObject * qos_profile_overrides{nullptr}; bool loop = false; - bool paused = false; PyObject * topic_remapping = nullptr; if (!PyArg_ParseTupleAndKeywords( - args, kwargs, "sss|kfOObbO", const_cast(kwlist), + args, kwargs, "sss|kfOObO", const_cast(kwlist), &uri, &storage_id, &node_prefix, @@ -261,7 +259,6 @@ rosbag2_transport_play(PyObject * Py_UNUSED(self), PyObject * args, PyObject * k &topics, &qos_profile_overrides, &loop, - &paused, &topic_remapping)) { return nullptr; @@ -274,7 +271,6 @@ rosbag2_transport_play(PyObject * Py_UNUSED(self), PyObject * args, PyObject * k play_options.read_ahead_queue_size = read_ahead_queue_size; play_options.rate = rate; play_options.loop = loop; - play_options.paused = paused; if (topics) { PyObject * topic_iterator = PyObject_GetIter(topics); From 2401f225bf9a3eddf288fd0b04bd726f5bb3ffa8 Mon Sep 17 00:00:00 2001 From: Mabel Zhang Date: Tue, 11 Aug 2020 15:44:15 -0400 Subject: [PATCH 28/30] add back debug printout Signed-off-by: Mabel Zhang --- rosbag2_transport/src/rosbag2_transport/player.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/rosbag2_transport/src/rosbag2_transport/player.cpp b/rosbag2_transport/src/rosbag2_transport/player.cpp index 986e5045ff..ac3c5b706a 100644 --- a/rosbag2_transport/src/rosbag2_transport/player.cpp +++ b/rosbag2_transport/src/rosbag2_transport/player.cpp @@ -199,6 +199,7 @@ void Player::play_messages_until_queue_empty(const PlayOptions & options) rate = options.rate; } + static size_t counter = 0; while (message_queue_.try_dequeue(message) && rclcpp::ok()) { std::this_thread::sleep_until( start_time_ + std::chrono::duration_cast( @@ -227,6 +228,8 @@ void Player::play_messages_until_queue_empty(const PlayOptions & options) if (rclcpp::ok()) { publishers_[message.message->topic_name]->publish(message.message->serialized_data); + // TODO(mabelzhang) TEMPORARY, remove when done debugging. And counter above. + fprintf(stderr, "publishing message %zu\n", (++counter)); } } } From 9603f501311df287cdb4c0d55f8b396727899a7b Mon Sep 17 00:00:00 2001 From: Mabel Zhang Date: Wed, 12 Aug 2020 02:11:25 -0400 Subject: [PATCH 29/30] remove keyboard handling from this branch Signed-off-by: Mabel Zhang --- rosbag2_transport/CMakeLists.txt | 1 - .../rosbag2_transport/keyboard_handler.cpp | 118 ------------------ .../rosbag2_transport/keyboard_handler.hpp | 54 -------- .../src/rosbag2_transport/player.cpp | 26 ---- .../src/rosbag2_transport/player.hpp | 3 - 5 files changed, 202 deletions(-) delete mode 100644 rosbag2_transport/src/rosbag2_transport/keyboard_handler.cpp delete mode 100644 rosbag2_transport/src/rosbag2_transport/keyboard_handler.hpp diff --git a/rosbag2_transport/CMakeLists.txt b/rosbag2_transport/CMakeLists.txt index 2437240030..5fe56726b2 100644 --- a/rosbag2_transport/CMakeLists.txt +++ b/rosbag2_transport/CMakeLists.txt @@ -40,7 +40,6 @@ add_library(${PROJECT_NAME} SHARED src/rosbag2_transport/formatter.cpp src/rosbag2_transport/generic_publisher.cpp src/rosbag2_transport/generic_subscription.cpp - src/rosbag2_transport/keyboard_handler.cpp src/rosbag2_transport/qos.cpp src/rosbag2_transport/recorder.cpp src/rosbag2_transport/rosbag2_node.cpp diff --git a/rosbag2_transport/src/rosbag2_transport/keyboard_handler.cpp b/rosbag2_transport/src/rosbag2_transport/keyboard_handler.cpp deleted file mode 100644 index 6188659851..0000000000 --- a/rosbag2_transport/src/rosbag2_transport/keyboard_handler.cpp +++ /dev/null @@ -1,118 +0,0 @@ -// Copyright 2020 Open Source Robotics Foundation, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#include "keyboard_handler.hpp" - -#include - -namespace rosbag2_transport -{ - -KeyboardHandler::KeyboardHandler() -: terminal_modified_(false) -{ -} - -KeyboardHandler::~KeyboardHandler() -{ - restore_terminal(); -} - -void KeyboardHandler::setup_terminal() -{ - if (terminal_modified_) { - return; - } - -#if defined(_MSC_VER) - input_handle = GetStdHandle(STD_INPUT_HANDLE); - if (input_handle == INVALID_HANDLE_VALUE) { - std::cout << "Failed to set up standard input handle." << std::endl; - return; - } - if (!GetConsoleMode(input_handle, &stdin_set)) { - std::cout << "Failed to save the console mode." << std::endl; - return; - } - terminal_modified_ = true; -#else - const int fd = fileno(stdin); - termios flags; - tcgetattr(fd, &orig_flags_); - flags = orig_flags_; - flags.c_lflag &= ~ICANON; // set raw (unset canonical modes) - flags.c_cc[VMIN] = 0; // i.e. min 1 char for blocking, 0 chars for non-blocking - flags.c_cc[VTIME] = 0; // block if waiting for char - tcsetattr(fd, TCSANOW, &flags); - - FD_ZERO(&stdin_fdset_); - FD_SET(fd, &stdin_fdset_); - maxfd_ = fd + 1; - terminal_modified_ = true; -#endif -} - -void KeyboardHandler::restore_terminal() -{ - if (!terminal_modified_) { - return; - } - -#if defined(_MSC_VER) - SetConsoleMode(input_handle, stdin_set); -#else - const int fd = fileno(stdin); - tcsetattr(fd, TCSANOW, &orig_flags_); -#endif - terminal_modified_ = false; -} - -int KeyboardHandler::read_char_from_stdin() -{ -#if defined(__APPLE__) - fd_set testfd; - FD_COPY(&stdin_fdset_, &testfd); -#elif !defined(_MSC_VER) - fd_set testfd = stdin_fdset_; -#endif - -#if defined(_MSC_VER) - DWORD events = 0; - INPUT_RECORD input_record[1]; - DWORD input_size = 1; - BOOL b = GetNumberOfConsoleInputEvents(input_handle, &events); - if (b && events > 0) { - b = ReadConsoleInput(input_handle, input_record, input_size, &events); - if (b) { - for (unsigned int i = 0; i < events; ++i) { - if (input_record[i].EventType & KEY_EVENT & input_record[i].Event.KeyEvent.bKeyDown) { - CHAR ch = input_record[i].Event.KeyEvent.uChar.AsciiChar; - return ch; - } - } - } - } - return EOF; -#else - timeval tv; - tv.tv_sec = 0; - tv.tv_usec = 0; - if (select(maxfd_, &testfd, NULL, NULL, &tv) <= 0) { - return EOF; - } - return getc(stdin); -#endif -} - -} // namespace rosbag2_transport diff --git a/rosbag2_transport/src/rosbag2_transport/keyboard_handler.hpp b/rosbag2_transport/src/rosbag2_transport/keyboard_handler.hpp deleted file mode 100644 index 9800907b81..0000000000 --- a/rosbag2_transport/src/rosbag2_transport/keyboard_handler.hpp +++ /dev/null @@ -1,54 +0,0 @@ -// Copyright 2020 Open Source Robotics Foundation, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#ifndef ROSBAG2_TRANSPORT__KEYBOARD_HANDLER_HPP_ -#define ROSBAG2_TRANSPORT__KEYBOARD_HANDLER_HPP_ - -#include - -#if !defined(_MSC_VER) - #include - #include -#else - #include -#endif - -namespace rosbag2_transport -{ - -class KeyboardHandler -{ -public: - KeyboardHandler(); - ~KeyboardHandler(); - - void setup_terminal(); - void restore_terminal(); - int read_char_from_stdin(); - -private: - bool terminal_modified_; -#if defined(_MSC_VER) - HANDLE input_handle; - DWORD stdin_set; -#else - termios orig_flags_; - fd_set stdin_fdset_; -#endif - int maxfd_; -}; - -} // namespace rosbag2_transport - -#endif // ROSBAG2_TRANSPORT__KEYBOARD_HANDLER_HPP_ diff --git a/rosbag2_transport/src/rosbag2_transport/player.cpp b/rosbag2_transport/src/rosbag2_transport/player.cpp index ac3c5b706a..0602f4b5ff 100644 --- a/rosbag2_transport/src/rosbag2_transport/player.cpp +++ b/rosbag2_transport/src/rosbag2_transport/player.cpp @@ -115,11 +115,6 @@ void Player::play(const PlayOptions & options) rosbag2_transport_->activate(); } - kb_handler_.setup_terminal(); - std::future keypress_future = std::async( - std::launch::async, - [this]() {handle_keypress();}); - play_messages_from_queue(options); } @@ -250,25 +245,4 @@ void Player::prepare_publishers(const PlayOptions & options) } } -void Player::handle_keypress() -{ - // Spin keyboard thread until all messages have been played - while (rclcpp::ok() && !played_all_) { - std::this_thread::sleep_for(std::chrono::milliseconds(30)); - - int input = kb_handler_.read_char_from_stdin(); - switch (input) { - case ' ': - if (rosbag2_transport_->get_current_state().id() != - lifecycle_msgs::msg::State::PRIMARY_STATE_ACTIVE) - { - rosbag2_transport_->activate(); - } else { - rosbag2_transport_->deactivate(); - } - break; - } - } -} - } // namespace rosbag2_transport diff --git a/rosbag2_transport/src/rosbag2_transport/player.hpp b/rosbag2_transport/src/rosbag2_transport/player.hpp index 56fb44f113..eb8a967109 100644 --- a/rosbag2_transport/src/rosbag2_transport/player.hpp +++ b/rosbag2_transport/src/rosbag2_transport/player.hpp @@ -28,7 +28,6 @@ #include "rosbag2_transport/play_options.hpp" -#include "keyboard_handler.hpp" #include "replayable_message.hpp" using TimePoint = std::chrono::time_point; @@ -61,7 +60,6 @@ class Player void play_messages_from_queue(const PlayOptions & options); void play_messages_until_queue_empty(const PlayOptions & options); void prepare_publishers(const PlayOptions & options); - void handle_keypress(); static constexpr double read_ahead_lower_bound_percentage_ = 0.9; static const std::chrono::milliseconds queue_read_wait_period_; @@ -71,7 +69,6 @@ class Player std::chrono::time_point start_time_; std::chrono::nanoseconds paused_duration_; bool played_all_; - KeyboardHandler kb_handler_; mutable std::future storage_loading_future_; std::shared_ptr rosbag2_transport_; std::unordered_map> publishers_; From 6f56d60fc6860a624ef57523afac0aedf7d4d8cb Mon Sep 17 00:00:00 2001 From: Mabel Zhang Date: Wed, 12 Aug 2020 02:21:50 -0400 Subject: [PATCH 30/30] Revert "Revert "command line pause option"" This reverts commit ae7f3c73d82203ab2b5ffa02f3b3ea9e8ff5ce3c. Signed-off-by: Mabel Zhang --- ros2bag/ros2bag/verb/play.py | 4 ++++ .../include/rosbag2_transport/play_options.hpp | 1 + .../src/rosbag2_transport/rosbag2_transport_python.cpp | 6 +++++- 3 files changed, 10 insertions(+), 1 deletion(-) diff --git a/ros2bag/ros2bag/verb/play.py b/ros2bag/ros2bag/verb/play.py index 3d66208e1e..2a7f2fc0da 100644 --- a/ros2bag/ros2bag/verb/play.py +++ b/ros2bag/ros2bag/verb/play.py @@ -52,6 +52,9 @@ def add_arguments(self, parser, cli_name): # noqa: D102 '-l', '--loop', action='store_true', help='enables loop playback when playing a bagfile: it starts back at the beginning ' 'on reaching the end and plays indefinitely.') + parser.add_argument( + '-p', '--paused', action='store_true', + help='start rosbag2 in paused mode. No messages are played at startup.') parser.add_argument( '--remap', '-m', default='', nargs='+', help='list of topics to be remapped: in the form ' @@ -82,4 +85,5 @@ def main(self, *, args): # noqa: D102 topics=args.topics, qos_profile_overrides=qos_profile_overrides, loop=args.loop, + paused=args.paused, topic_remapping=args.remap) diff --git a/rosbag2_transport/include/rosbag2_transport/play_options.hpp b/rosbag2_transport/include/rosbag2_transport/play_options.hpp index b616a76591..208cb77a34 100644 --- a/rosbag2_transport/include/rosbag2_transport/play_options.hpp +++ b/rosbag2_transport/include/rosbag2_transport/play_options.hpp @@ -39,6 +39,7 @@ struct PlayOptions std::unordered_map topic_qos_profile_overrides = {}; bool loop = false; + bool paused = false; std::vector topic_remapping_options = {}; }; diff --git a/rosbag2_transport/src/rosbag2_transport/rosbag2_transport_python.cpp b/rosbag2_transport/src/rosbag2_transport/rosbag2_transport_python.cpp index 10163ed90b..2772879315 100644 --- a/rosbag2_transport/src/rosbag2_transport/rosbag2_transport_python.cpp +++ b/rosbag2_transport/src/rosbag2_transport/rosbag2_transport_python.cpp @@ -236,6 +236,7 @@ rosbag2_transport_play(PyObject * Py_UNUSED(self), PyObject * args, PyObject * k "topics", "qos_profile_overrides", "loop", + "paused", "topic_remapping", nullptr }; @@ -248,9 +249,10 @@ rosbag2_transport_play(PyObject * Py_UNUSED(self), PyObject * args, PyObject * k PyObject * topics = nullptr; PyObject * qos_profile_overrides{nullptr}; bool loop = false; + bool paused = false; PyObject * topic_remapping = nullptr; if (!PyArg_ParseTupleAndKeywords( - args, kwargs, "sss|kfOObO", const_cast(kwlist), + args, kwargs, "sss|kfOObbO", const_cast(kwlist), &uri, &storage_id, &node_prefix, @@ -259,6 +261,7 @@ rosbag2_transport_play(PyObject * Py_UNUSED(self), PyObject * args, PyObject * k &topics, &qos_profile_overrides, &loop, + &paused, &topic_remapping)) { return nullptr; @@ -271,6 +274,7 @@ rosbag2_transport_play(PyObject * Py_UNUSED(self), PyObject * args, PyObject * k play_options.read_ahead_queue_size = read_ahead_queue_size; play_options.rate = rate; play_options.loop = loop; + play_options.paused = paused; if (topics) { PyObject * topic_iterator = PyObject_GetIter(topics);