紧急通知:禁止一切关于政治&VPN翻墙等话题,发现相关帖子会立马删除封号
小鱼 ROS 2 新书上线!点击链接查看, 新书配套视频点击链接查看。
提问前必看的发帖注意事项—— 提问前必看!不符合要求的问题拒绝回答!!
社区使用指南—如何添加标签修改密码
小鱼 ROS 2 新书上线!点击链接查看, 新书配套视频点击链接查看。
提问前必看的发帖注意事项—— 提问前必看!不符合要求的问题拒绝回答!!
社区使用指南—如何添加标签修改密码
ROS2 galactic zmq接收问题
-
我想让他在边接收的时候,边录制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; }