鱼香ROS社区
    • 版块
    • 最新
    • 未解决
    • 已解决
    • 群组
    • 注册
    • 登录
    紧急通知:禁止一切关于政治&VPN翻墙等话题,发现相关帖子会立马删除封号
    提问前必看的发帖注意事项: 社区问答规则(小鱼个人)更新 | 高质量帖子发布指南

    ROS2 galactic zmq接收问题

    已定时 已固定 已锁定 已移动
    ROS 2相关问题
    zmq ros2 galactic
    1
    1
    163
    正在加载更多帖子
    • 从旧到新
    • 从新到旧
    • 最多赞同
    回复
    • 在新帖中回复
    登录后回复
    此主题已被删除。只有拥有主题管理权限的用户可以查看。
    • 10123279631
      ^御峰^
      最后由 编辑

      我想让他在边接收的时候,边录制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;
      }
      
      1 条回复 最后回复 回复 引用 0
      • 第一个帖子
        最后一个帖子
      皖ICP备16016415号-7
      Powered by NodeBB | 鱼香ROS