Program Listing for File player.hpp
↰ Return to documentation for file (include/rosbag2_transport/player.hpp
)
// Copyright 2018, Bosch Software Innovations GmbH.
//
// 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__PLAYER_HPP_
#define ROSBAG2_TRANSPORT__PLAYER_HPP_
#include <chrono>
#include <forward_list>
#include <functional>
#include <future>
#include <memory>
#include <string>
#include <unordered_map>
#include <utility>
#include <vector>
#include "keyboard_handler/keyboard_handler.hpp"
#include "rclcpp/node.hpp"
#include "rclcpp/publisher.hpp"
#include "rclcpp/qos.hpp"
#include "rosbag2_cpp/clocks/player_clock.hpp"
#include "rosbag2_interfaces/msg/read_split_event.hpp"
#include "rosbag2_interfaces/srv/get_rate.hpp"
#include "rosbag2_interfaces/srv/is_paused.hpp"
#include "rosbag2_interfaces/srv/pause.hpp"
#include "rosbag2_interfaces/srv/play.hpp"
#include "rosbag2_interfaces/srv/play_next.hpp"
#include "rosbag2_interfaces/srv/burst.hpp"
#include "rosbag2_interfaces/srv/resume.hpp"
#include "rosbag2_interfaces/srv/set_rate.hpp"
#include "rosbag2_interfaces/srv/seek.hpp"
#include "rosbag2_interfaces/srv/stop.hpp"
#include "rosbag2_interfaces/srv/toggle_paused.hpp"
#include "rosbag2_storage/serialized_bag_message.hpp"
#include "rosbag2_storage/storage_options.hpp"
#include "rosbag2_transport/play_options.hpp"
#include "rosbag2_transport/visibility_control.hpp"
#include "rosgraph_msgs/msg/clock.hpp"
namespace rosbag2_cpp
{
class Reader;
} // namespace rosbag2_cpp
namespace rosbag2_transport
{
class PlayerImpl;
class Player : public rclcpp::Node
{
public:
using play_msg_callback_t =
std::function<void (std::shared_ptr<rosbag2_storage::SerializedBagMessage>)>;
using callback_handle_t = uint64_t;
ROSBAG2_TRANSPORT_PUBLIC
static constexpr callback_handle_t invalid_callback_handle = 0;
ROSBAG2_TRANSPORT_PUBLIC
explicit Player(const rclcpp::NodeOptions & node_options);
ROSBAG2_TRANSPORT_PUBLIC
explicit Player(
const std::string & node_name = "rosbag2_player",
const rclcpp::NodeOptions & node_options = rclcpp::NodeOptions());
ROSBAG2_TRANSPORT_PUBLIC
Player(
const rosbag2_storage::StorageOptions & storage_options,
const rosbag2_transport::PlayOptions & play_options,
const std::string & node_name = "rosbag2_player",
const rclcpp::NodeOptions & node_options = rclcpp::NodeOptions());
ROSBAG2_TRANSPORT_PUBLIC
Player(
std::unique_ptr<rosbag2_cpp::Reader> reader,
const rosbag2_storage::StorageOptions & storage_options,
const rosbag2_transport::PlayOptions & play_options,
const std::string & node_name = "rosbag2_player",
const rclcpp::NodeOptions & node_options = rclcpp::NodeOptions());
ROSBAG2_TRANSPORT_PUBLIC
Player(
std::unique_ptr<rosbag2_cpp::Reader> reader,
std::shared_ptr<KeyboardHandler> keyboard_handler,
const rosbag2_storage::StorageOptions & storage_options,
const rosbag2_transport::PlayOptions & play_options,
const std::string & node_name = "rosbag2_player",
const rclcpp::NodeOptions & node_options = rclcpp::NodeOptions());
ROSBAG2_TRANSPORT_PUBLIC
virtual ~Player();
ROSBAG2_TRANSPORT_PUBLIC
bool play();
ROSBAG2_TRANSPORT_PUBLIC
bool wait_for_playback_to_finish(
std::chrono::duration<double> timeout = std::chrono::seconds(-1));
ROSBAG2_TRANSPORT_PUBLIC
void stop();
// Playback control interface
ROSBAG2_TRANSPORT_PUBLIC
virtual void pause();
ROSBAG2_TRANSPORT_PUBLIC
virtual void resume();
ROSBAG2_TRANSPORT_PUBLIC
void toggle_paused();
ROSBAG2_TRANSPORT_PUBLIC
bool is_paused() const;
ROSBAG2_TRANSPORT_PUBLIC
double get_rate() const;
ROSBAG2_TRANSPORT_PUBLIC
virtual bool set_rate(double);
ROSBAG2_TRANSPORT_PUBLIC
virtual bool play_next();
ROSBAG2_TRANSPORT_PUBLIC
virtual size_t burst(const size_t num_messages);
ROSBAG2_TRANSPORT_PUBLIC
void seek(rcutils_time_point_value_t time_point);
ROSBAG2_TRANSPORT_PUBLIC
callback_handle_t add_on_play_message_pre_callback(const play_msg_callback_t & callback);
ROSBAG2_TRANSPORT_PUBLIC
callback_handle_t add_on_play_message_post_callback(const play_msg_callback_t & callback);
ROSBAG2_TRANSPORT_PUBLIC
void delete_on_play_message_callback(const callback_handle_t & handle);
ROSBAG2_TRANSPORT_PUBLIC
bool wait_for_sent_service_requests_to_finish(
const std::string & service_name,
std::chrono::duration<double> timeout = std::chrono::seconds(5));
protected:
ROSBAG2_TRANSPORT_PUBLIC
std::unordered_map<std::string, std::shared_ptr<rclcpp::GenericPublisher>> get_publishers();
ROSBAG2_TRANSPORT_PUBLIC
std::unordered_map<std::string, std::shared_ptr<rclcpp::GenericClient>> get_service_clients();
ROSBAG2_TRANSPORT_PUBLIC
rclcpp::Publisher<rosgraph_msgs::msg::Clock>::SharedPtr get_clock_publisher();
ROSBAG2_TRANSPORT_PUBLIC
void wait_for_playback_to_start();
ROSBAG2_TRANSPORT_PUBLIC
size_t get_number_of_registered_on_play_msg_pre_callbacks();
ROSBAG2_TRANSPORT_PUBLIC
size_t get_number_of_registered_on_play_msg_post_callbacks();
ROSBAG2_TRANSPORT_PUBLIC
const rosbag2_storage::StorageOptions & get_storage_options();
ROSBAG2_TRANSPORT_PUBLIC
const rosbag2_transport::PlayOptions & get_play_options();
private:
std::unique_ptr<PlayerImpl> pimpl_;
};
} // namespace rosbag2_transport
#endif // ROSBAG2_TRANSPORT__PLAYER_HPP_