経緯
ROSの画像メッセージを一定量格納しておきたいな、と思うことがあったので、その方法を共有します。
やり方
C++のmapを使って画像データを格納します。注意点としては、**画像メッセージはImageConstPtr型ではなくて、Image型を格納するという点です。**最初、ImageConstPtr型で格納していたのですが、mapの格納した中身がすべて同じデータだったので、Image型を格納するようにしました。
以下がサンプルコードです。
sample.cpp
std::map<int, const sensor_msgs::Image> stock_rgb;
void callback(const sensor_msgs::ImageConstPtr& rgb_msg) {
// Stock rgb image
int stock_id = std::stoi(rgb_msg->header.frame_id);
stock_rgb.emplace(stock_id, *rgb_msg);
int get_id = std::stoi(yolo_msg_.header.frame_id);
sensor_msgs::Image get_rgb = stock_rgb.at(get_id);
}
この場合は画像のframe_idをkeyにして、画像メッセージを格納しています。取り出すときは、keyをもとにatを使えば取り出せます。格納するときにinsertを使うと、なぜかうまくいかなかったので、emplaceを使っています。mapについてはこちらの記事が詳しかったので参考にしました。
まとめ
ImageConstPtrとImageでたまに混乱する。