我正在與Windows和sdk的kinect v1傳感器的項目。我們的目標是通過ros發送來自kinect的彩色圖像,我不知道如何處理這個問題。現在我正在使用sensor_msgs/Image消息來發布RGB值。這是我到目前爲止的代碼:rosserial發佈sensor_msgs /從窗口的圖像
img.header.stamp = nh->now();
img.header.frame_id = "kinect1_ref";
img.height = height;
img.width = width;
img.encoding = "rgb8";
img.is_bigendian = false;
img.step = width*3;
BYTE* start = (BYTE*) lockedRect.pBits;
img.data = new uint8_t[width*3*height];
long it;
for (int y = 0; y < height; ++y) {
for (int x = 0; x < width; ++x) {
const BYTE* curr = start + (x + width*y)*4;
for(int n=0; n<3; n++){
it = y*width*3 + x*3 + n;
img.data[it] = (uint8_t) curr[2-n];
}
}
}
pub->publish(&img);
在代碼中,IMG是sensor_msgs /圖像,並lockedRect.pBits是一個指針的kinect的圖像的第一個字節。據我所知,來自kinect的圖像按照從上到下的從左到右的順序逐行存儲,每個像素由代表填充字節然後是R,G和B的4個連續字節表示。
其實我很能寄這封信給羅斯,但是當我試圖用對visualizate它,我得到以下錯誤:
錯誤加載圖片:OGRE EXCEPTION。流大小與圖像中的計算圖像大小不匹配。
我非常喜歡這個,我設置的尺寸是正確的,考慮到RGB的3個通道。從BYTE到uint8_t的轉換應該是微不足道的,因爲它們都是無符號字符。
PD:我知道我可以使用openni_launch從ubuntu和ros中查看kinect數據,但是由於語音識別引擎,我需要在這種情況下使用windows。
PD2:通常用於在ros中發佈圖像的cv_bridge不包含在rosserial庫中。因此,我必須從頭開始構建圖像消息(可能有另一種方法?)
任何幫助將真正appreaciated,提前謝謝!
編輯:通過rosserial窗戶生成的類別sensor_msgs /圖像信息是隻包含這個代碼:
class Image : public ros::Msg{
public:
std_msgs::Header header;
uint32_t height;
uint32_t width;
char * encoding;
uint8_t is_bigendian;
uint32_t step;
uint8_t data_length;
uint8_t st_data;
uint8_t * data;
virtual void serialize(unsigned char *outbuffer);
virtual void deserialize(unsigned char *inbuffer);}
兩種方法進行序列化和反序列化不寫到這裏,但我居然不知道他們如何工作。
嗨,謝謝你的回答!它實際上是以這種方式在ros中定義的。但問題是,當pkg rosserial爲windows建立庫時,它只需要消息的骨架類。因此,在我的「sensor_msgs/Image」類中,數據數組定義爲:uint8_t * data。這就是爲什麼我必須在我自己的代碼中初始化數組。如果我不這樣做,它不會編譯。 –
我明白了。看起來序列化缺少一些維度。我想設置的步驟,高度和寬度不足以正確序列化。我看到這裏有兩個變量'data_length'和'st_data'。這可能是問題。 – cassinaj
我發現了關於[rosserial_windows的限制](http://wiki.ros.org/rosserial/Overview/Limitations#Arrays)中使用的協議的信息。雖然,您正在指定高度和寬度以及步長,但序列化與這些消息變量無關。我似乎還必須在'data_lendth'中指定數組的長度。但這是問題。由於某些奇怪的原因,最大數組長度限制爲'uint8_t'。 – cassinaj