使用rosbag play命令播放bag文件时,可以使用-r参数来设置播放速率,使用-s参数来设置从bag文件的哪个时间戳开始播放。默认情况下,rosbag play会输出播放的进度,包括当前时间戳和播放速率。
如果你想查询更详细的播放进度,可以使用rosbag info命令获取bag文件的信息,其中包括时间戳范围和消息数量等。同时,可以使用rosbag play的--clock参数来让ROS时间同步到播放的时间戳,这样你就可以在ROS的rqt_plot工具中可视化消息的发布时间和播放进度。
如果你想在程序中获取播放进度,可以使用ROS的Python或C++ API来编写一个节点,监听/clock话题来获取当前时间戳,然后计算已播放的时间与总时间的比例来估算播放进度。代码如下:
#include <ros/ros.h>
#include <rosbag/bag.h>
#include <rosbag/view.h>
#include <rosgraph_msgs/Clock.h>
#include <iostream>
int main(int argc, char** argv)
{
// 初始化ROS节点
ros::init(argc, argv, "bag_progress");
ros::NodeHandle nh;
// 打开bag文件并获取时间戳范围
rosbag::Bag bag;
bag.open(argv[1], rosbag::bagmode::Read);
rosbag::View view(bag);
ros::Time start_time = view.getBeginTime();
ros::Time end_time = view.getEndTime();
ros::Duration duration = end_time - start_time;
// 创建Publisher发布播放进度
ros::Publisher progress_pub = nh.advertise<rosgraph_msgs::Clock>("/bag_progress", 10);
// 创建Subscriber监听/clock话题
ros::Subscriber clock_sub = nh.subscribe("/clock", 10, [&](const rosgraph_msgs::Clock::ConstPtr& msg) {
// 计算播放进度并发布
ros::Duration elapsed_time = msg->clock - start_time;
double progress = elapsed_time.toSec() / duration.toSec();
rosgraph_msgs::Clock progress_msg;
progress_msg.clock = ros::Time(progress * duration.toSec() + start_time.toSec());
progress_pub.publish(progress_msg);
});
// 运行ROS节点
ros::spin();
return 0;
}
上述ROS节点的CMakeLists.txt文件如下:
cmake_minimum_required(VERSION 3.0.2)
project(bag_progress)
## 找到依赖包
find_package(catkin REQUIRED COMPONENTS
rosbag
roscpp
rosgraph_msgs
)
## 声明依赖包
catkin_package(
CATKIN_DEPENDS rosbag roscpp rosgraph_msgs
)
## 编译节点
include_directories(
${catkin_INCLUDE_DIRS}
)
add_executable(bag_progress src/bag_progress.cpp)
target_link_libraries(bag_progress ${catkin_LIBRARIES})
## 安装节点和launch文件
install(TARGETS bag_progress
RUNTIME DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION}
)
install(DIRECTORY launch/
DESTINATION ${CATKIN_PACKAGE_SHARE_DESTINATION}/launch
)