kinect v1 센서의 창과 sdk가있는 프로젝트에서 작업하고 있습니다. 목표는 kinect에서 ro를 통해 컬러 이미지를 보내는 것입니다. using rosserial.rosserial publisher sensor_msgs/windows에서 이미지
정확히 어떻게 처리해야할지 모르겠군요. 지금은 sensor_msgs/Image 메시지를 사용하여 RGB 값을 게시하고 있습니다. 코드에서
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);
,가 sensor_msgs/이미지 및 lockedRect.pBits는 키 넥트의 이미지의 첫 번째 바이트에 대한 포인터입니다 IMG : 이것은 내가 지금까지 가지고있는 코드입니다. 필자가 아는 한 kinect의 이미지는 왼쪽에서 오른쪽 순서로 위에서 아래로 저장되며, 각 픽셀은 R, G 및 B의 패딩 바이트를 나타내는 4 개의 순차 바이트로 표현됩니다.
는 사실 ROS이를 보낼 수 있어요,하지만 난 그것을 visualizate하려고 할 때, 나는 다음과 같은 오류 얻을 :
오류로드 이미지 : 괴물 예외. 스트림 크기가 이미지의 계산 된 이미지 크기와 일치하지 않습니다.
저는이 설정과 매우 흡사합니다. RGB의 3 개 채널을 고려하여 설정 한 크기가 정확합니다. BYTE에서 uint8_t으로의 변환은 모두 서명되지 않은 char이므로 매우 간단해야합니다.
PD : openni_launch를 사용하여 우분투 및 ros에서 kinect 데이터를 시각화 할 수 있지만이 경우 음성 인식 엔진으로 인해 창을 사용해야합니다.
PD2 : 일반적으로 ro로 이미지를 게시하는 데 사용되는 cv_bridge는 rosserial 라이브러리에 포함되어 있지 않습니다. 따라서 처음부터 이미지 메시지를 작성해야합니다 (다른 방법이있을 수 있습니까?)
도움이 될 것입니다, 사전에 감사드립니다!
편집은 Windows 용 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로 정의됩니다. 그래서 내 자신의 코드로 배열을 초기화해야합니다. 이 작업을 수행하지 않으면 컴파일되지 않습니다. –
알겠습니다. 직렬화에 일부 치수가 누락 된 것 같습니다. 단계, 높이 및 너비 설정 올바르게 올바르게 serialize하는 것 같아요. 여기에 두 개의 변수'data_length'와'st_data'가 있습니다. 이것들이 문제 일 수 있습니다. – cassinaj
[rosserial_windows restrictions] (http://wiki.ros.org/rosserial/Overview/Limitations#Arrays)에서 사용 된 프로토콜에 대한 정보를 찾았습니다. 높이와 너비 및 단계 크기를 지정하더라도 직렬화는 이러한 메시지 변수와 관련이 없습니다. 'data_lendth'에서 배열의 길이를 지정해야하는 것 같습니다. 그러나 여기에 문제가 있습니다. 어떤 이상한 이유 때문에 최대 배열 길이는'uint8_t'로 제한됩니다. – cassinaj