mirror of
https://github.com/introlab/rtabmap.git
synced 2026-09-02 09:30:25 +08:00
Memory::computeIcpTransformMulti() added support for 3d scans with RGB channel (L515)
This commit is contained in:
@@ -3086,6 +3086,8 @@ Transform Memory::computeIcpTransformMulti(
|
||||
pcl::PointCloud<pcl::PointNormal>::Ptr assembledToNormalClouds(new pcl::PointCloud<pcl::PointNormal>);
|
||||
pcl::PointCloud<pcl::PointXYZI>::Ptr assembledToIClouds(new pcl::PointCloud<pcl::PointXYZI>);
|
||||
pcl::PointCloud<pcl::PointXYZINormal>::Ptr assembledToNormalIClouds(new pcl::PointCloud<pcl::PointXYZINormal>);
|
||||
pcl::PointCloud<pcl::PointXYZRGB>::Ptr assembledToRGBClouds(new pcl::PointCloud<pcl::PointXYZRGB>);
|
||||
pcl::PointCloud<pcl::PointXYZRGBNormal>::Ptr assembledToNormalRGBClouds(new pcl::PointCloud<pcl::PointXYZRGBNormal>);
|
||||
UDEBUG("maxPoints from(%d) = %d", fromId, maxPoints);
|
||||
for(std::map<int, Transform>::const_iterator iter = poses.begin(); iter!=poses.end(); ++iter)
|
||||
{
|
||||
@@ -3111,6 +3113,19 @@ Transform Memory::computeIcpTransformMulti(
|
||||
toPoseInv * iter->second * scan.localTransform());
|
||||
}
|
||||
}
|
||||
else if(scan.hasRGB())
|
||||
{
|
||||
if(scan.hasNormals())
|
||||
{
|
||||
*assembledToNormalRGBClouds += *util3d::laserScanToPointCloudRGBNormal(scan,
|
||||
toPoseInv * iter->second * scan.localTransform());
|
||||
}
|
||||
else
|
||||
{
|
||||
*assembledToRGBClouds += *util3d::laserScanToPointCloudRGB(scan,
|
||||
toPoseInv * iter->second * scan.localTransform());
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if(scan.hasNormals())
|
||||
@@ -3160,6 +3175,28 @@ Transform Memory::computeIcpTransformMulti(
|
||||
{
|
||||
assembledScan = fromScan.is2d()?util3d::laserScan2dFromPointCloud(*assembledToIClouds):util3d::laserScanFromPointCloud(*assembledToIClouds);
|
||||
}
|
||||
else if(assembledToNormalRGBClouds->size())
|
||||
{
|
||||
if(fromScan.is2d())
|
||||
{
|
||||
UERROR("Cannot handle 2d scan with RGB format.");
|
||||
}
|
||||
else
|
||||
{
|
||||
assembledScan = util3d::laserScanFromPointCloud(*assembledToNormalRGBClouds);
|
||||
}
|
||||
}
|
||||
else if(assembledToRGBClouds->size())
|
||||
{
|
||||
if(fromScan.is2d())
|
||||
{
|
||||
UERROR("Cannot handle 2d scan with RGB format.");
|
||||
}
|
||||
else
|
||||
{
|
||||
assembledScan = util3d::laserScanFromPointCloud(*assembledToRGBClouds);
|
||||
}
|
||||
}
|
||||
UDEBUG("assembledScan=%d points", assembledScan.cols);
|
||||
|
||||
// scans are in base frame but for 2d scans, set the height so that correspondences matching works
|
||||
@@ -4439,7 +4476,7 @@ Signature * Memory::createSignature(const SensorData & inputData, const Transfor
|
||||
keypoints3D.resize(keypoints.size());
|
||||
for(size_t i=0; i<keypoints.size(); ++i)
|
||||
{
|
||||
UASSERT(keypoints[i].class_id < data.keypoints3D().size());
|
||||
UASSERT(keypoints[i].class_id < (int)data.keypoints3D().size());
|
||||
keypoints3D[i] = data.keypoints3D()[keypoints[i].class_id];
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user