2016-06-21 8 views
0

Я пытаюсь читать данные лазерного сканирования, а затем использовать это для построения карты среды.Чтение внешних 2D-данных лазерного сканирования в mrpt

Моя проблема в том, что я не понимаю, в каком формате данные должны быть предоставлены объекту CObservation2DRangeScan.

Я пробовал:

X,Y,X,Y,... 
Y,X,Y,X,... 
X,X,Y,Y,... 
Y,Y,X,X,... 

Я пишу данные в rawlog файл, а затем посмотреть на него в rawlog зрителя. Я использовал [1,1], и точка появляется при X = -1 и Y = 0. Почему это?

Вот данные из rawlog просмотра

Timestamp (UTC): 2016/06/21,07:22:42.166880 
(as time_t): 1466493762.16688 
(as TTimestamp): 131109673621668800 
Sensor label: '' 

Homogeneous matrix for the sensor's 3D pose, relative to robot base: 
1.00000 0.00000 0.00000 0.00000 
0.00000 1.00000 0.00000 0.00000 
0.00000 0.00000 1.00000 0.00000 
0.00000 0.00000 0.00000 1.00000(x,y,z,yaw,pitch,roll) 
(0.0000,0.0000,0.0000,0.00deg,-0.00deg,0.00deg) 
Samples direction: Right->Left 
Points in the scan: 2 
Estimated sensor 'sigma': 0.010000 
Increment in pitch during the scan: 0.000000 deg 
Invalid points in the scan: 0 
Sensor maximum range: 80.00 m 
Sensor field-of-view ("aperture"): 360.0 deg 
Raw scan values: [1.000 1.000 ] 
Raw valid-scan values: [1 1 ] 

Вот код, который я использую:

CSensoryFrame SF; 

CActionCollection actionCol; 

CPose2D actualOdometryReading(0.0f, 0.0f, DEG2RAD(.0f)); 

// Prepare the "options" structure: 
CActionRobotMovement2D      actMov; 
CActionRobotMovement2D::TMotionModelOptions opts; 

opts.modelSelection = CActionRobotMovement2D::mmThrun; 
opts.thrunModel.alfa3_trans_trans = 0.10f; 

// Create the probability density distribution (PDF) from a 2D odometry reading: 
actMov.computeFromOdometry(actualOdometryReading, opts); 

actionCol.insert(actMov); 

CObservation2DRangeScanPtr myObs = CObservation2DRangeScan::Create(); 


myObs->scan = scan; // = [1,0] 
myObs->validRange = vranges; // = [1,1] 
myObs->aperture = 2 * M_PI; 


SF.insert(myObs); 

ответ

0

Я не в полной мере знакомы с деталями классов лазерных данных MRPT в , но, используя другие рамки робототехники, могу сказать, что лазерные сканы обычно представляются в виде набора значений , а не декартовых координат (х, у). Действительно, reference говорит, что CObservation2DRangeScan держит

вектор значений с плавающей точкой со всеми измерений дальности (в метрах).

И выход показывает вашей программы:

Raw scan values: [1.000 1.000 ] 

т.е. два измерения дальности на расстоянии 1 м. Поскольку ваш датчик настроен на 360 градусов, первое измерение будет в направлении -180 ° позы вашего датчика. Ваш датчик обращен к + X, поэтому этот лазерный луч направлен «за» робота, который дает вам координаты (-1, 0). Второй (и последний) измерительный луч направлен в сторону + 180 °, давая те же координаты.

Постарайтесь пройти в списке из 360 измерений диапазона 1 метр, и вы должны увидеть что-то, что соответствует кругу.

+1

Итак, вопрос заключается в том, как использовать данные лазерного сканирования в виде точек, а не измерения диапазона. – mase

+1

Возможно, вы захотите использовать что-то вроде ['CSimplePointsMap'] (http://reference.mrpt.org/devel/classmrpt_1_1maps_1_1_c_simple_points_map.html). – mindriot