예제 #1
0
void CObservation2DRangeScan_from_ROS_LaserScan_msg(
	CObservation2DRangeScan& self, object scan_msg, CPose3D pose)
{
	// set info
	self.sensorLabel =
		extract<std::string>(scan_msg.attr("header").attr("frame_id"));
	auto t = mrpt::Clock::fromDouble(extract<uint64_t>(
		TTimeStamp_from_ROS_Time(scan_msg.attr("header").attr("stamp"))));
	self.timestamp = t;
	self.maxRange = extract<float>(scan_msg.attr("range_max"));
	self.aperture = extract<float>(scan_msg.attr("angle_max")) -
					extract<float>(scan_msg.attr("angle_min"));
	self.beamAperture = extract<float>(scan_msg.attr("angle_increment"));
	self.sensorPose = pose;
	// set ranges
	tuple ranges = extract<tuple>(scan_msg.attr("ranges"));
	const size_t N = len(ranges);
	self.resizeScan(N);
	for (int i = 0; i < len(ranges); ++i)
	{
		float range = extract<float>(ranges[i]);
		self.setScanRange(i, range);
		self.setScanRangeValidity(i, (range < self.maxRange - 0.01));
	}
}
예제 #2
0
파일: CLMS100eth.cpp 프로젝트: EduFdez/mrpt
bool CLMS100Eth::decodeScan(char* buff, CObservation2DRangeScan& outObservation)
{
	char* next;
	unsigned int idx = 0;
	unsigned int scanCount = 0;
	char* tmp;
	// double factor;

	next = strtok(buff, " ", &tmp);

	while (next && scanCount == 0)
	{
		// cout << "Interpreting : " << next << endl;
		switch (++idx)
		{
			case 1:
				if (strncmp(&next[1], "sRA", 3) && strncmp(&next[1], "sSN", 3))
					return false;
				break;
			case 2:
				if (strcmp(next, "LMDscandata")) return false;
				break;
			case 6:
				if (!strcmp(next, "1"))
				{
					MRPT_LOG_ERROR_FMT("STATUS error on LMS100: '%s'", next);
				}
				else if (!strcmp(next, "4"))
				{
					MRPT_LOG_ERROR_FMT(
						"Contamination error on LMS100: '%s'", next);
				}
				else
				{
					MRPT_LOG_DEBUG("STATUS Ok.\n");
				}
				break;
			case 21:
				if (strcmp(next, "DIST1"))
				{
					THROW_EXCEPTION(
						"LMS100 is not configured to send distances.");
					return false;
				}
				MRPT_LOG_DEBUG("Distance : OK\n");
				break;
			case 22:
				// factor = strtod(next, nullptr);
				break;
			case 26:
				scanCount = strtoul(next, nullptr, 16);
				MRPT_LOG_DEBUG_FMT("Scan Count : %d\n", scanCount);
				break;
			default:
				break;
		}
		next = strtok(nullptr, " ", &tmp);
	}
	outObservation.aperture = (float)APPERTURE;
	outObservation.rightToLeft = false;
	outObservation.stdError = 0.012f;
	outObservation.sensorPose = m_sensorPose;
	outObservation.beamAperture = m_beamApperture;
	outObservation.maxRange = m_maxRange;
	outObservation.timestamp = mrpt::system::getCurrentTime();
	outObservation.sensorLabel = m_sensorLabel;

	outObservation.resizeScan(scanCount);
	unsigned int i;
	for (i = 0; i < scanCount && next; i++, next = strtok(nullptr, " ", &tmp))
	{
		outObservation.setScanRange(
			i, double(strtoul(next, nullptr, 16)) / 1000.0);
		outObservation.setScanRangeValidity(
			i, outObservation.getScanRange(i) <= outObservation.maxRange);
	}
	outObservation.resizeScan(i);
	return i >= scanCount;
}
예제 #3
0
// CSensoryFrame
void CSensoryFrame_insert1(CSensoryFrame &self, CObservation2DRangeScan &obs)
{
    CObservationPtr obsPtr = (CObservationPtr) obs.duplicateGetSmartPtr();
    self.insert(obsPtr);
}