我想让他在边接收的时候,边录制bag包的形成,但每次录制完只有db3的包,没有metadata文件这是为什么呢
#include <rclcpp/rclcpp.hpp>
#include <zmq.hpp>
#include "rosbag2_cpp/writer.hpp"
#include "rosbag2_storage/storage_options.hpp"
#include "std_msgs/msg/string.hpp"
#include <chrono>
#include <csignal>
class ZeroMQListener : public rclcpp::Node
{
public:
ZeroMQListener() : Node("listener_zmq")
{
auto node = std::make_shared<rclcpp::Node>("bagzmq_write");
//zmq::context_t context(1);
zmq::context_t context(1);
zmq::socket_t subscriber(context, ZMQ_SUB);
rclcpp::spin(node);
std::string topic = "";
subscriber.setsockopt(ZMQ_SUBSCRIBE, topic.c_str(), topic.length()); // 允许所有消息
int linger = 0; // 正确关闭 ZeroMQ
subscriber.setsockopt(ZMQ_LINGER, &linger, sizeof(linger));
subscriber.connect("tcp://localhost:6666");
// 创建rosbag2的Writer对象
writer_ = std::make_unique<rosbag2_cpp::Writer>();
// 打开袋文件,模式为写入
rosbag2_storage::StorageOptions storage_options;
storage_options.uri = "hellolistener.db3"; // 文件夹路径,包含文件名,使用 .db3 后缀
storage_options.storage_id = "sqlite3"; // 数据库类型
writer_->open(storage_options);
// 设置信号处理
signal(SIGINT, [](int signo) {
RCLCPP_INFO(rclcpp::get_logger("ZeroMQListener"), "接收到信号,正在关闭...");
std::this_thread::sleep_for(std::chrono::seconds(10));
should_exit_ = true;
});
while (rclcpp::ok() && !should_exit_) {
zmq::message_t message;
int rc = subscriber.recv(&message);
if (rc) {
std::string recv_string;
std::istringstream iss(static_cast<char*>(message.data()));
std::getline(iss, recv_string);
RCLCPP_INFO(this->get_logger(), "接收到的数据为 %s", recv_string.c_str());
// 获取当前时间作为时间戳
std_msgs::msg::String msg;
msg.data = recv_string;
for (int i = 0; i < 1; i++) {
// 获取当前时间作为时间戳
rclcpp::Time timestamp = node->now();
// 手动增加纳秒以确保每次时间戳不同
timestamp = timestamp + rclcpp::Duration(i, 0);
writer_->write(msg, "/chatter", timestamp);
std::cout << "ok!" << std::endl;
std::cout << "写入的消息为:" << msg.data.c_str()<<std::endl;
rclcpp::sleep_for(std::chrono::seconds(1));
}
}
}
// 在这里清理您的套接字和上下文
subscriber.close();
context.close();
// 等待rosbag2处理元数据写入
rclcpp::sleep_for(std::chrono::seconds(60));
}
private:
static std::atomic<bool> should_exit_;
std::unique_ptr<rosbag2_cpp::Writer> writer_;
};
std::atomic<bool> ZeroMQListener::should_exit_{false};
int main(int argc, char** argv)
{
setlocale(LC_ALL,"");
rclcpp::init(argc, argv);
rclcpp::spin(std::make_shared<ZeroMQListener>());
std::this_thread::sleep_for(std::chrono::seconds(30));
rclcpp::shutdown();
return 0;
}