35SensorLine3D::SensorLine3D(
const std::string& name_)
38 _information.setIdentity();
41 setInformation(_information);
44bool SensorLine3D::isVisible(SensorLine3D::WorldObjectType* to) {
45 if (!_robotPoseObject)
return false;
46 assert(to && to->vertex());
47 VertexType* v = to->vertex();
48 VertexType::EstimateType pose = v->estimate();
49 VertexType::EstimateType delta = _sensorPose.inverse() * pose;
50 Vector3d translation = delta;
51 double range2 = translation.squaredNorm();
52 if (range2 > _maxRange2)
return false;
53 if (range2 < _minRange2)
return false;
54 translation.normalize();
56 double bearing =
acos(translation.z());
57 if (fabs(bearing) > _fov)
return false;
61void SensorLine3D::addParameters() {
62 if (!_offsetParam) _offsetParam =
new ParameterSE3Offset();
64 world()->addParameter(_offsetParam);
67void SensorLine3D::addNoise(EdgeType* e) {
68 EdgeType::ErrorVector n = _sampler.generateSample();
69 e->setMeasurement(e->measurement() + n);
70 e->setInformation(information());
73void SensorLine3D::sense() {
78 RobotType* r =
dynamic_cast<RobotType*
>(robot());
79 std::list<PoseObject*>::reverse_iterator it = r->trajectory().rbegin();
81 while (it != r->trajectory().rend() && count < 1) {
82 if (!_robotPoseObject) _robotPoseObject = *it;
86 if (!_robotPoseObject)
return;
87 _sensorPose = _robotPoseObject->vertex()->estimate() * _offsetParam->offset();
88 for (std::set<BaseWorldObject*>::iterator it = world()->objects().begin();
89 it != world()->objects().end(); ++it) {
90 WorldObjectType* o =
dynamic_cast<WorldObjectType*
>(*it);
91 if (o && isVisible(o)) {
92 EdgeType* e = mkEdge(o);
94 e->setParameterId(0, _offsetParam->id());
96 e->setMeasurementFromState();
Jet< T, N > acos(const Jet< T, N > &f)
WorldObject< VertexLine3D > WorldObjectLine3D
Robot< WorldObjectSE3 > Robot3D