mirror of
https://github.com/introlab/rtabmap_ros.git
synced 2026-10-04 16:57:46 +08:00
deskewing: added console logging, handling case where timestamps are not ordered in lidar rings
This commit is contained in:
@@ -2669,17 +2669,103 @@ bool deskew_impl(
|
|||||||
rclcpp::Time lastStamp;
|
rclcpp::Time lastStamp;
|
||||||
if(timeDatatype == 6) // UINT32
|
if(timeDatatype == 6) // UINT32
|
||||||
{
|
{
|
||||||
unsigned int nsec = *((const unsigned int*)(&input.data[0]+offsetTime));
|
unsigned int nsecFirst = *((const unsigned int*)(&input.data[0]+offsetTime));
|
||||||
firstStamp = rclcpp::Time(input.header.stamp)+rclcpp::Duration(0, nsec);
|
unsigned int nsecLast = *((const unsigned int*)(&input.data[(input.width-1)*input.point_step + input.row_step*(input.height-1)]+offsetTime));
|
||||||
nsec = *((const unsigned int*)(&input.data[timeOnColumns?(input.width-1)*input.point_step:(input.height-1)*input.row_step]+offsetTime));
|
|
||||||
lastStamp = rclcpp::Time(input.header.stamp)+rclcpp::Duration(0, nsec);
|
if(nsecFirst > nsecLast)
|
||||||
|
{
|
||||||
|
// scans are not ordered, we need to search min/max
|
||||||
|
static bool warned = false;
|
||||||
|
if(!warned) {
|
||||||
|
UWARN("Timestamp channel is not ordered, we will have to parse every scans to "
|
||||||
|
"determinate first and last time offsets. This will add slightly computation "
|
||||||
|
"time. This warning is only shown once.");
|
||||||
|
warned = true;
|
||||||
|
}
|
||||||
|
if(timeOnColumns)
|
||||||
|
{
|
||||||
|
for(size_t i=0; i<input.width; ++i)
|
||||||
|
{
|
||||||
|
unsigned int nsec = *((const unsigned int*)(&input.data[(i)*input.point_step]+offsetTime));
|
||||||
|
if(nsec < nsecFirst)
|
||||||
|
{
|
||||||
|
nsecFirst = nsec;
|
||||||
|
}
|
||||||
|
else if(nsec > nsecLast)
|
||||||
|
{
|
||||||
|
nsecLast = nsec;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
for(size_t i=0; i<input.height; ++i)
|
||||||
|
{
|
||||||
|
unsigned int nsec = *((const unsigned int*)(&input.data[input.row_step*(i)]+offsetTime));
|
||||||
|
if(nsec < nsecFirst)
|
||||||
|
{
|
||||||
|
nsecFirst = nsec;
|
||||||
|
}
|
||||||
|
else if(nsec > nsecLast)
|
||||||
|
{
|
||||||
|
nsecLast = nsec;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
firstStamp = rclcpp::Time(input.header.stamp)+rclcpp::Duration(0, nsecFirst);
|
||||||
|
lastStamp = rclcpp::Time(input.header.stamp)+rclcpp::Duration(0, nsecLast);
|
||||||
}
|
}
|
||||||
else if(timeDatatype == 7) // FLOAT32
|
else if(timeDatatype == 7) // FLOAT32
|
||||||
{
|
{
|
||||||
float sec = *((const float*)(&input.data[0]+offsetTime));
|
float secFirst = *((const float*)(&input.data[0]+offsetTime));
|
||||||
firstStamp = rclcpp::Time(input.header.stamp)+rclcpp::Duration::from_seconds(sec);
|
float secLast = *((const float*)(&input.data[(input.width-1)*input.point_step + input.row_step*(input.height-1)]+offsetTime));
|
||||||
sec = *((const float*)(&input.data[timeOnColumns?(input.width-1)*input.point_step:(input.height-1)*input.row_step]+offsetTime));
|
|
||||||
lastStamp = rclcpp::Time(input.header.stamp)+rclcpp::Duration::from_seconds(sec);
|
if(secFirst > secLast)
|
||||||
|
{
|
||||||
|
// scans are not ordered, we need to search min/max
|
||||||
|
static bool warned = false;
|
||||||
|
if(!warned) {
|
||||||
|
UWARN("Timestamp channel is not ordered, we will have to parse every scans to "
|
||||||
|
"determinate first and last time offsets. This will add slightly computation "
|
||||||
|
"time. This warning is only shown once.");
|
||||||
|
warned = true;
|
||||||
|
}
|
||||||
|
if(timeOnColumns)
|
||||||
|
{
|
||||||
|
for(size_t i=0; i<input.width; ++i)
|
||||||
|
{
|
||||||
|
float sec = *((const float*)(&input.data[(i)*input.point_step]+offsetTime));
|
||||||
|
if(sec < secFirst)
|
||||||
|
{
|
||||||
|
secFirst = sec;
|
||||||
|
}
|
||||||
|
else if(sec > secLast)
|
||||||
|
{
|
||||||
|
secLast = sec;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
for(size_t i=0; i<input.height; ++i)
|
||||||
|
{
|
||||||
|
float sec = *((const float*)(&input.data[input.row_step*(i)]+offsetTime));
|
||||||
|
if(sec < secFirst)
|
||||||
|
{
|
||||||
|
secFirst = sec;
|
||||||
|
}
|
||||||
|
else if(sec > secLast)
|
||||||
|
{
|
||||||
|
secLast = sec;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
firstStamp = rclcpp::Time(input.header.stamp)+rclcpp::Duration::from_seconds(secFirst);
|
||||||
|
lastStamp = rclcpp::Time(input.header.stamp)+rclcpp::Duration::from_seconds(secLast);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@@ -2687,9 +2773,14 @@ bool deskew_impl(
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(lastStamp <= firstStamp)
|
if(lastStamp < firstStamp)
|
||||||
{
|
{
|
||||||
UERROR("First and last stamps in the scan are the same!");
|
UERROR("Last stamp (%f) is smaller than first stamp (%f) (header=%f)!", timestampFromROS(lastStamp), timestampFromROS(firstStamp), timestampFromROS(input.header.stamp));
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
else if(lastStamp == firstStamp)
|
||||||
|
{
|
||||||
|
UERROR("First and last stamps in the scan are the same (%f) (header=%f)!", timestampFromROS(lastStamp), timestampFromROS(input.header.stamp));
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
std::string errorMsg;
|
std::string errorMsg;
|
||||||
|
|||||||
@@ -26,10 +26,12 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#include "rtabmap_util/lidar_deskewing.hpp"
|
#include "rtabmap_util/lidar_deskewing.hpp"
|
||||||
|
#include "rtabmap/utilite/ULogger.h"
|
||||||
#include "rclcpp/rclcpp.hpp"
|
#include "rclcpp/rclcpp.hpp"
|
||||||
|
|
||||||
int main(int argc, char **argv)
|
int main(int argc, char **argv)
|
||||||
{
|
{
|
||||||
|
ULogger::setType(ULogger::kTypeConsole);
|
||||||
rclcpp::init(argc, argv);
|
rclcpp::init(argc, argv);
|
||||||
rclcpp::spin(std::make_shared<rtabmap_util::LidarDeskewing>(rclcpp::NodeOptions()));
|
rclcpp::spin(std::make_shared<rtabmap_util::LidarDeskewing>(rclcpp::NodeOptions()));
|
||||||
rclcpp::shutdown();
|
rclcpp::shutdown();
|
||||||
|
|||||||
Reference in New Issue
Block a user