Skip to content

Commit 3e0e637

Browse files
author
Thiemo Wiedemeyer
committed
Added support for the color to depth registration from libfreenect2.
Changed base name for ir/depth topics to `sd`. Added point cloud for sd depth/color. Fixed bug with wrong tf frames for some images. Fixed bug with rviz not soppurting MONO16, but TYPE_8UC1.
1 parent 51edf94 commit 3e0e637

File tree

6 files changed

+131
-61
lines changed

6 files changed

+131
-61
lines changed

kinect2_bridge/include/kinect2_definitions.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@
2727

2828
#define K2_TOPIC_HD "/hd"
2929
#define K2_TOPIC_QHD "/qhd"
30-
#define K2_TOPIC_IR "/ir"
30+
#define K2_TOPIC_SD "/sd"
3131

3232
#define K2_TOPIC_IMAGE_RECT "_rect"
3333
#define K2_TOPIC_IMAGE_COLOR "/image_color"

kinect2_bridge/launch/kinect2_bridge.launch

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -52,8 +52,18 @@
5252
<param name="worker_threads" type="int" value="$(arg worker_threads)"/>
5353
</node>
5454

55-
<!-- low resolution point cloud (960 x 540) -->
56-
<node pkg="nodelet" type="nodelet" name="$(arg base_name)_points_xyzrgb_lowres" machine="$(arg machine)"
55+
<!-- sd point cloud (512 x 424) -->
56+
<node pkg="nodelet" type="nodelet" name="$(arg base_name)_points_xyzrgb_sd" machine="$(arg machine)"
57+
args="load depth_image_proc/point_cloud_xyzrgb $(arg nodelet_manager)" respawn="true">
58+
<remap from="rgb/camera_info" to="$(arg base_name)/sd/camera_info" />
59+
<remap from="rgb/image_rect_color" to="$(arg base_name)/sd/image_color_rect" />
60+
<remap from="depth_registered/image_rect" to="$(arg base_name)/sd/image_depth_rect" />
61+
<remap from="depth_registered/points" to="$(arg base_name)/sd/points" />
62+
<param name="queue_size" type="int" value="$(arg queue_size)" />
63+
</node>
64+
65+
<!-- qhd point cloud (960 x 540) -->
66+
<node pkg="nodelet" type="nodelet" name="$(arg base_name)_points_xyzrgb_qhd" machine="$(arg machine)"
5767
args="load depth_image_proc/point_cloud_xyzrgb $(arg nodelet_manager)" respawn="true">
5868
<remap from="rgb/camera_info" to="$(arg base_name)/qhd/camera_info" />
5969
<remap from="rgb/image_rect_color" to="$(arg base_name)/qhd/image_color_rect" />
@@ -62,8 +72,8 @@
6272
<param name="queue_size" type="int" value="$(arg queue_size)" />
6373
</node>
6474

65-
<!-- high resolution point cloud (1920 x 1080) -->
66-
<node pkg="nodelet" type="nodelet" name="$(arg base_name)_points_xyzrgb_highres" machine="$(arg machine)"
75+
<!-- hd point cloud (1920 x 1080) -->
76+
<node pkg="nodelet" type="nodelet" name="$(arg base_name)_points_xyzrgb_hd" machine="$(arg machine)"
6777
args="load depth_image_proc/point_cloud_xyzrgb $(arg nodelet_manager)" respawn="true">
6878
<remap from="rgb/camera_info" to="$(arg base_name)/hd/camera_info" />
6979
<remap from="rgb/image_rect_color" to="$(arg base_name)/hd/image_color_rect" />

kinect2_bridge/src/kinect2_bridge.cpp

Lines changed: 99 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@
4545
#include <libfreenect2/frame_listener_impl.h>
4646
#include <libfreenect2/packet_pipeline.h>
4747
#include <libfreenect2/config.h>
48+
#include <libfreenect2/registration.h>
4849

4950
#include <kinect2_definitions.h>
5051
#include <depth_registration.h>
@@ -73,6 +74,10 @@ class Kinect2Bridge
7374
libfreenect2::Freenect2Device *device;
7475
libfreenect2::SyncMultiFrameListener *listenerColor, *listenerIrDepth;
7576
libfreenect2::PacketPipeline *packetPipeline;
77+
libfreenect2::Registration *registration;
78+
libfreenect2::Freenect2Device::ColorCameraParams colorParams;
79+
libfreenect2::Freenect2Device::IrCameraParams irParams;
80+
std::shared_ptr<libfreenect2::Frame> irFrame, depthFrame, colorFrame;
7681

7782
ros::NodeHandle nh, priv_nh;
7883

@@ -87,14 +92,15 @@ class Kinect2Bridge
8792

8893
enum Image
8994
{
90-
IR = 0,
91-
IR_RECT,
92-
DEPTH,
93-
DEPTH_RECT,
95+
IR_SD = 0,
96+
IR_SD_RECT,
9497

98+
DEPTH_SD,
99+
DEPTH_SD_RECT,
95100
DEPTH_HD,
96101
DEPTH_QHD,
97102

103+
COLOR_SD_RECT,
98104
COLOR_HD,
99105
COLOR_HD_RECT,
100106
COLOR_QHD,
@@ -123,8 +129,9 @@ class Kinect2Bridge
123129

124130
public:
125131
Kinect2Bridge(const ros::NodeHandle &nh = ros::NodeHandle(), const ros::NodeHandle &priv_nh = ros::NodeHandle("~"))
126-
: sizeColor(1920, 1080), sizeIr(512, 424), sizeLowRes(sizeColor.width / 2, sizeColor.height / 2), nh(nh), priv_nh(priv_nh), frameColor(0), frameIrDepth(0),
127-
pubFrameColor(0), pubFrameIrDepth(0), lastColor(0, 0), lastDepth(0, 0), nextColor(false), nextIrDepth(false), depthShift(0), running(false), deviceActive(false), clientConnected(false)
132+
: sizeColor(1920, 1080), sizeIr(512, 424), sizeLowRes(sizeColor.width / 2, sizeColor.height / 2), nh(nh), priv_nh(priv_nh),
133+
frameColor(0), frameIrDepth(0), pubFrameColor(0), pubFrameIrDepth(0), lastColor(0, 0), lastDepth(0, 0), nextColor(false),
134+
nextIrDepth(false), depthShift(0), running(false), deviceActive(false), clientConnected(false)
128135
{
129136
color = cv::Mat::zeros(sizeColor, CV_8UC3);
130137
ir = cv::Mat::zeros(sizeIr, CV_32F);
@@ -174,6 +181,7 @@ class Kinect2Bridge
174181
device->close();
175182
delete listenerIrDepth;
176183
delete listenerColor;
184+
delete registration;
177185

178186
for(size_t i = 0; i < COUNT; ++i)
179187
{
@@ -320,6 +328,8 @@ class Kinect2Bridge
320328
ret = ret && depthRegLowRes->init(cameraMatrixLowRes, sizeLowRes, cameraMatrixIr, sizeIr, distortionIr, rotation, translation, 0.5f, maxDepth, device);
321329
ret = ret && depthRegHighRes->init(cameraMatrixColor, sizeColor, cameraMatrixIr, sizeIr, distortionIr, rotation, translation, 0.5f, maxDepth, device);
322330

331+
registration = new libfreenect2::Registration(irParams, colorParams);
332+
323333
return ret;
324334
}
325335

@@ -386,26 +396,28 @@ class Kinect2Bridge
386396
if(use_png)
387397
{
388398
compression16BitExt = ".png";
389-
compression16BitString = sensor_msgs::image_encodings::MONO16 + "; png compressed";
399+
compression16BitString = sensor_msgs::image_encodings::TYPE_16UC1 + "; png compressed";
390400
}
391401
else
392402
{
393403
compression16BitExt = ".tif";
394-
compression16BitString = sensor_msgs::image_encodings::MONO16 + "; tiff compressed";
404+
compression16BitString = sensor_msgs::image_encodings::TYPE_16UC1 + "; tiff compressed";
395405
}
396406
}
397407

398408
void initTopics(const int32_t queueSize, const std::string &base_name)
399409
{
400410
std::vector<std::string> topics(COUNT);
401-
topics[IR] = K2_TOPIC_IR K2_TOPIC_IMAGE_IR;
402-
topics[IR_RECT] = K2_TOPIC_IR K2_TOPIC_IMAGE_IR K2_TOPIC_IMAGE_RECT;
411+
topics[IR_SD] = K2_TOPIC_SD K2_TOPIC_IMAGE_IR;
412+
topics[IR_SD_RECT] = K2_TOPIC_SD K2_TOPIC_IMAGE_IR K2_TOPIC_IMAGE_RECT;
403413

404-
topics[DEPTH] = K2_TOPIC_IR K2_TOPIC_IMAGE_DEPTH;
405-
topics[DEPTH_RECT] = K2_TOPIC_IR K2_TOPIC_IMAGE_DEPTH K2_TOPIC_IMAGE_RECT;
414+
topics[DEPTH_SD] = K2_TOPIC_SD K2_TOPIC_IMAGE_DEPTH;
415+
topics[DEPTH_SD_RECT] = K2_TOPIC_SD K2_TOPIC_IMAGE_DEPTH K2_TOPIC_IMAGE_RECT;
406416
topics[DEPTH_HD] = K2_TOPIC_HD K2_TOPIC_IMAGE_DEPTH K2_TOPIC_IMAGE_RECT;
407417
topics[DEPTH_QHD] = K2_TOPIC_QHD K2_TOPIC_IMAGE_DEPTH K2_TOPIC_IMAGE_RECT;
408418

419+
topics[COLOR_SD_RECT] = K2_TOPIC_SD K2_TOPIC_IMAGE_COLOR K2_TOPIC_IMAGE_RECT;
420+
409421
topics[COLOR_HD] = K2_TOPIC_HD K2_TOPIC_IMAGE_COLOR;
410422
topics[COLOR_HD_RECT] = K2_TOPIC_HD K2_TOPIC_IMAGE_COLOR K2_TOPIC_IMAGE_RECT;
411423
topics[COLOR_QHD] = K2_TOPIC_QHD K2_TOPIC_IMAGE_COLOR;
@@ -427,7 +439,7 @@ class Kinect2Bridge
427439
}
428440
infoHDPub = nh.advertise<sensor_msgs::CameraInfo>(base_name + K2_TOPIC_HD + K2_TOPIC_INFO, queueSize, cb, cb);
429441
infoQHDPub = nh.advertise<sensor_msgs::CameraInfo>(base_name + K2_TOPIC_QHD + K2_TOPIC_INFO, queueSize, cb, cb);
430-
infoIRPub = nh.advertise<sensor_msgs::CameraInfo>(base_name + K2_TOPIC_IR + K2_TOPIC_INFO, queueSize, cb, cb);
442+
infoIRPub = nh.advertise<sensor_msgs::CameraInfo>(base_name + K2_TOPIC_SD + K2_TOPIC_INFO, queueSize, cb, cb);
431443
}
432444

433445
bool initDevice(std::string &sensor)
@@ -480,8 +492,8 @@ class Kinect2Bridge
480492
std::cout << std::endl << "device serial: " << sensor << std::endl;
481493
std::cout << "device firmware: " << device->getFirmwareVersion() << std::endl;
482494

483-
libfreenect2::Freenect2Device::ColorCameraParams colorParams = device->getColorCameraParams();
484-
libfreenect2::Freenect2Device::IrCameraParams irParams = device->getIrCameraParams();
495+
colorParams = device->getColorCameraParams();
496+
irParams = device->getIrCameraParams();
485497

486498
device->stop();
487499

@@ -555,6 +567,23 @@ class Kinect2Bridge
555567
cameraMatrixLowRes.at<double>(0, 2) /= 2;
556568
cameraMatrixLowRes.at<double>(1, 2) /= 2;
557569

570+
colorParams.fx = cameraMatrixColor.at<double>(0, 0);
571+
colorParams.fy = cameraMatrixColor.at<double>(1, 1);
572+
colorParams.cx = cameraMatrixColor.at<double>(0, 2);
573+
colorParams.cy = cameraMatrixColor.at<double>(1, 2);
574+
575+
irParams.fx = cameraMatrixIr.at<double>(0, 0);
576+
irParams.fy = cameraMatrixIr.at<double>(1, 1);
577+
irParams.cx = cameraMatrixIr.at<double>(0, 2);
578+
irParams.cy = cameraMatrixIr.at<double>(1, 2);
579+
580+
irParams.k1 = distortionIr.at<double>(0, 0);
581+
irParams.k2 = distortionIr.at<double>(0, 1);
582+
irParams.p1 = distortionIr.at<double>(0, 2);
583+
irParams.p2 = distortionIr.at<double>(0, 3);
584+
irParams.k3 = distortionIr.at<double>(0, 4);
585+
586+
558587
const int mapType = CV_16SC2;
559588
cv::initUndistortRectifyMap(cameraMatrixColor, distortionColor, cv::Mat(), cameraMatrixColor, sizeColor, mapType, map1Color, map2Color);
560589
cv::initUndistortRectifyMap(cameraMatrixIr, distortionIr, cv::Mat(), cameraMatrixIr, sizeIr, mapType, map1Ir, map2Ir);
@@ -814,7 +843,6 @@ class Kinect2Bridge
814843
void receiveIrDepth()
815844
{
816845
libfreenect2::FrameMap frames;
817-
libfreenect2::Frame *irFrame, *depthFrame;
818846
cv::Mat depth, ir;
819847
std_msgs::Header header;
820848
std::vector<cv::Mat> images(COUNT);
@@ -830,8 +858,8 @@ class Kinect2Bridge
830858

831859
header = createHeader(lastDepth, lastColor);
832860

833-
irFrame = frames[libfreenect2::Frame::Ir];
834-
depthFrame = frames[libfreenect2::Frame::Depth];
861+
irFrame = std::shared_ptr<libfreenect2::Frame>(frames[libfreenect2::Frame::Ir]);
862+
depthFrame = std::shared_ptr<libfreenect2::Frame>(frames[libfreenect2::Frame::Depth]);
835863

836864
ir = cv::Mat(irFrame->height, irFrame->width, CV_32FC1, irFrame->data);
837865
depth = cv::Mat(depthFrame->height, depthFrame->width, CV_32FC1, depthFrame->data);
@@ -840,9 +868,8 @@ class Kinect2Bridge
840868
lockIrDepth.unlock();
841869

842870
processIrDepth(ir, depth, images, status);
843-
listenerIrDepth->release(frames);
844871

845-
publishImages(images, header, status, frame, pubFrameIrDepth, IR, COLOR_HD);
872+
publishImages(images, header, status, frame, pubFrameIrDepth, IR_SD, COLOR_HD);
846873

847874
double elapsed = ros::Time::now().toSec() - now;
848875
lockTime.lock();
@@ -853,7 +880,6 @@ class Kinect2Bridge
853880
void receiveColor()
854881
{
855882
libfreenect2::FrameMap frames;
856-
libfreenect2::Frame *colorFrame;
857883
cv::Mat color;
858884
std_msgs::Header header;
859885
std::vector<cv::Mat> images(COUNT);
@@ -869,14 +895,14 @@ class Kinect2Bridge
869895

870896
header = createHeader(lastColor, lastDepth);
871897

872-
colorFrame = frames[libfreenect2::Frame::Color];
898+
colorFrame = std::shared_ptr<libfreenect2::Frame>(frames[libfreenect2::Frame::Color]);
899+
873900
color = cv::Mat(colorFrame->height, colorFrame->width, CV_8UC3, colorFrame->data);
874901

875902
frame = frameColor++;
876903
lockColor.unlock();
877904

878905
processColor(color, images, status);
879-
listenerColor->release(frames);
880906

881907
publishImages(images, header, status, frame, pubFrameColor, COLOR_HD, COUNT);
882908

@@ -933,33 +959,50 @@ class Kinect2Bridge
933959

934960
void processIrDepth(const cv::Mat &ir, const cv::Mat &depth, std::vector<cv::Mat> &images, const std::vector<Status> &status)
935961
{
962+
// COLOR registered to depth
963+
if(status[COLOR_SD_RECT])
964+
{
965+
if(!colorFrame)
966+
{
967+
images[COLOR_SD_RECT] = cv::Mat::zeros(sizeIr, CV_8UC3);
968+
}
969+
else
970+
{
971+
std::shared_ptr<libfreenect2::Frame> tmpColor, tmpDepth;
972+
tmpColor = colorFrame;
973+
tmpDepth = depthFrame;
974+
cv::Mat tmp = cv::Mat::zeros(sizeIr, CV_8UC3);
975+
registration->apply(tmpColor.get(), tmpDepth.get(), tmp.data);
976+
cv::flip(tmp, images[COLOR_SD_RECT], 1);
977+
}
978+
}
936979

937980
// IR
938-
if(status[IR] || status[IR_RECT])
981+
if(status[IR_SD] || status[IR_SD_RECT])
939982
{
940-
ir.convertTo(images[IR], CV_16U);
941-
cv::flip(images[IR], images[IR], 1);
983+
ir.convertTo(images[IR_SD], CV_16U);
984+
cv::flip(images[IR_SD], images[IR_SD], 1);
942985
}
943-
if(status[IR_RECT])
986+
if(status[IR_SD_RECT])
944987
{
945-
cv::remap(images[IR], images[IR_RECT], map1Ir, map2Ir, cv::INTER_AREA);
988+
cv::remap(images[IR_SD], images[IR_SD_RECT], map1Ir, map2Ir, cv::INTER_AREA);
946989
}
947990

948991
// DEPTH
949992
cv::Mat depthShifted;
950-
if(status[DEPTH])
993+
if(status[DEPTH_SD])
951994
{
952-
depth.convertTo(images[DEPTH], CV_16U, 1);
953-
cv::flip(images[DEPTH], images[DEPTH], 1);
995+
depth.convertTo(images[DEPTH_SD], CV_16U, 1);
996+
cv::flip(images[DEPTH_SD], images[DEPTH_SD], 1);
954997
}
955-
if(status[DEPTH_RECT] || status[DEPTH_QHD] || status[DEPTH_HD])
998+
if(status[DEPTH_SD_RECT] || status[DEPTH_QHD] || status[DEPTH_HD])
956999
{
9571000
depth.convertTo(depthShifted, CV_16U, 1, depthShift);
9581001
cv::flip(depthShifted, depthShifted, 1);
9591002
}
960-
if(status[DEPTH_RECT])
1003+
if(status[DEPTH_SD_RECT])
9611004
{
962-
cv::remap(depthShifted, images[DEPTH_RECT], map1Ir, map2Ir, cv::INTER_NEAREST);
1005+
cv::remap(depthShifted, images[DEPTH_SD_RECT], map1Ir, map2Ir, cv::INTER_NEAREST);
9631006
}
9641007
if(status[DEPTH_QHD])
9651008
{
@@ -1046,6 +1089,15 @@ class Kinect2Bridge
10461089

10471090
for(size_t i = begin; i < end; ++i)
10481091
{
1092+
if(i < DEPTH_HD || i == COLOR_SD_RECT)
1093+
{
1094+
_header.frame_id = baseNameTF + K2_TF_IR_OPT_FRAME;
1095+
}
1096+
else
1097+
{
1098+
_header.frame_id = baseNameTF + K2_TF_RGB_OPT_FRAME;
1099+
}
1100+
10491101
switch(status[i])
10501102
{
10511103
case UNSUBCRIBED:
@@ -1122,14 +1174,15 @@ class Kinect2Bridge
11221174

11231175
switch(type)
11241176
{
1125-
case IR:
1126-
case IR_RECT:
1127-
case DEPTH:
1128-
case DEPTH_RECT:
1177+
case IR_SD:
1178+
case IR_SD_RECT:
1179+
case DEPTH_SD:
1180+
case DEPTH_SD_RECT:
11291181
case DEPTH_HD:
11301182
case DEPTH_QHD:
1131-
msgImage.encoding = sensor_msgs::image_encodings::MONO16;
1183+
msgImage.encoding = sensor_msgs::image_encodings::TYPE_16UC1;
11321184
break;
1185+
case COLOR_SD_RECT:
11331186
case COLOR_HD:
11341187
case COLOR_HD_RECT:
11351188
case COLOR_QHD:
@@ -1140,7 +1193,7 @@ class Kinect2Bridge
11401193
case MONO_HD_RECT:
11411194
case MONO_QHD:
11421195
case MONO_QHD_RECT:
1143-
msgImage.encoding = sensor_msgs::image_encodings::MONO8;
1196+
msgImage.encoding = sensor_msgs::image_encodings::TYPE_8UC1;
11441197
break;
11451198
case COUNT:
11461199
return;
@@ -1161,15 +1214,16 @@ class Kinect2Bridge
11611214

11621215
switch(type)
11631216
{
1164-
case IR:
1165-
case IR_RECT:
1166-
case DEPTH:
1167-
case DEPTH_RECT:
1217+
case IR_SD:
1218+
case IR_SD_RECT:
1219+
case DEPTH_SD:
1220+
case DEPTH_SD_RECT:
11681221
case DEPTH_HD:
11691222
case DEPTH_QHD:
11701223
msgImage.format = compression16BitString;
11711224
cv::imencode(compression16BitExt, image, msgImage.data, compressionParams);
11721225
break;
1226+
case COLOR_SD_RECT:
11731227
case COLOR_HD:
11741228
case COLOR_HD_RECT:
11751229
case COLOR_QHD:
@@ -1181,7 +1235,7 @@ class Kinect2Bridge
11811235
case MONO_HD_RECT:
11821236
case MONO_QHD:
11831237
case MONO_QHD_RECT:
1184-
msgImage.format = sensor_msgs::image_encodings::MONO8 + "; jpeg compressed ";
1238+
msgImage.format = sensor_msgs::image_encodings::TYPE_8UC1 + "; jpeg compressed ";
11851239
cv::imencode(".jpg", image, msgImage.data, compressionParams);
11861240
break;
11871241
case COUNT:

kinect2_calibration/src/kinect2_calibration.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1193,8 +1193,8 @@ int main(int argc, char **argv)
11931193
}
11941194

11951195
std::string topicColor = "/" + ns + K2_TOPIC_HD + K2_TOPIC_IMAGE_MONO;
1196-
std::string topicIr = "/" + ns + K2_TOPIC_IR + K2_TOPIC_IMAGE_IR;
1197-
std::string topicDepth = "/" + ns + K2_TOPIC_IR + K2_TOPIC_IMAGE_DEPTH;
1196+
std::string topicIr = "/" + ns + K2_TOPIC_SD + K2_TOPIC_IMAGE_IR;
1197+
std::string topicDepth = "/" + ns + K2_TOPIC_SD + K2_TOPIC_IMAGE_DEPTH;
11981198
std::cout << "Start settings:" << std::endl
11991199
<< " Mode: " << (mode == RECORD ? "record" : "calibrate") << std::endl
12001200
<< " Source: " << (calibDepth ? "depth" : (source == COLOR ? "color" : (source == IR ? "ir" : "sync"))) << std::endl

0 commit comments

Comments
 (0)