mrpt_ekf_slam_3d.cpp
Go to the documentation of this file.
1 /*
2  * File: mrpt_ekf_slam_3d.cpp
3  * Author: Vladislav Tananaev
4  *
5  */
6 
8 #include <ros/console.h>
9 #include <mrpt/ros1bridge/logging.h>
10 
12 {
13  motion_model_options_.modelSelection =
14  mrpt::obs::CActionRobotMovement3D::mm6DOF;
15 
16  auto& mm = motion_model_options_.mm6DOFModel;
17 
18  mm.nParticlesCount = 100;
19  mm.a1 = 0.114;
20  mm.a2 = 0.1114;
21  mm.a3 = 0.114;
22  mm.a4 = 0.114;
23  mm.a5 = 0.13;
24  mm.a6 = 0.13;
25  mm.a7 = 0.03;
26  mm.a8 = 0.03;
27  mm.a9 = 0.03;
28  mm.a10 = 0.03;
29  mm.additional_std_XYZ = 0.005;
30  mm.additional_std_angle = 0.0005;
31 
32  // display values
33  SHOW_3D_LIVE = false;
35 }
36 
38 
39 void EKFslam::read_iniFile(std::string ini_filename)
40 {
41  mrpt::config::CConfigFile iniFile(ini_filename);
42 
43  // Load the config options for mapping:
44  // ----------------------------------------
45  mapping.loadOptions(iniFile);
46  mapping.KF_options.dumpToConsole();
47  mapping.options.dumpToConsole();
48 
49  log4cxx::LoggerPtr ros_logger =
50  log4cxx::Logger::getLogger(ROSCONSOLE_DEFAULT_NAME);
51  mapping.setVerbosityLevel(
52  mrpt::ros1bridge::rosLoggerLvlToMRPTLoggerLvl(ros_logger->getLevel()));
53  mapping.logging_enable_console_output = false;
54 
55  mapping.logRegisterCallback([](std::string_view msg,
56  const mrpt::system::VerbosityLevel level,
57  std::string_view loggerName,
58  const mrpt::Clock::time_point timestamp) {
59  mrpt::ros1bridge::mrptToROSLoggerCallback(
60  std::string(msg), level, std::string(loggerName), timestamp);
61  });
62 
63  // read display variables
64  SHOW_3D_LIVE =
65  iniFile.read_bool("MappingApplication", "SHOW_3D_LIVE", false);
66  CAMERA_3DSCENE_FOLLOWS_ROBOT = iniFile.read_bool(
67  "MappingApplication", "CAMERA_3DSCENE_FOLLOWS_ROBOT", false);
68 }
69 
71  mrpt::obs::CSensoryFrame::Ptr _sf,
72  mrpt::obs::CObservationOdometry::Ptr _odometry)
73 {
74  action = mrpt::obs::CActionCollection::Create();
75 
76  mrpt::obs::CActionRobotMovement3D odom_move;
77 
78  odom_move.timestamp = _sf->getObservationByIndex(0)->timestamp;
79  if (_odometry)
80  {
81  if (odomLastObservation_.empty())
82  {
83  odomLastObservation_ = mrpt::poses::CPose3D(_odometry->odometry);
84  }
85 
86  mrpt::poses::CPose3D incOdoPose;
87  incOdoPose.inverseComposeFrom(
88  mrpt::poses::CPose3D(_odometry->odometry), odomLastObservation_);
89  odomLastObservation_ = mrpt::poses::CPose3D(_odometry->odometry);
90  odom_move.computeFromOdometry(incOdoPose, motion_model_options_);
91  action->insert(odom_move);
92  }
93 }
94 
96 {
97 #if MRPT_HAS_WXWIDGETS
98  if (SHOW_3D_LIVE)
99  {
100  win3d =
101  mrpt::gui::CDisplayWindow3D::Create("KF-SLAM live view", 800, 500);
102  }
103 #endif
104 }
105 
107 {
108  using namespace mrpt;
109  using namespace mrpt::opengl;
110  using namespace mrpt::poses;
111  using namespace mrpt::slam;
112  using namespace mrpt::math;
113 
114  // Save 3D view of the filter state:
115  if (SHOW_3D_LIVE && win3d)
116  {
117  mapping.getCurrentState(
119  // Most of this code was copy and pase from ros::amcl
120 
121  // Get the mean robot pose as 3D:
122  const CPose3D robotPoseMean3D = CPose3D(robotPose_.mean);
123 
124  // Build the path:
125  meanPath.push_back(robotPoseMean3D.asTPose());
126 
127  // create the scene
128  COpenGLScene::Ptr scene3D = COpenGLScene::Create();
129  opengl::CGridPlaneXY::Ptr grid =
130  opengl::CGridPlaneXY::Create(-1000, 1000, -1000, 1000, 0, 5);
131  grid->setColor(0.4, 0.4, 0.4);
132  scene3D->insert(grid);
133 
134  // Robot path:
135  opengl::CSetOfLines::Ptr linesPath = opengl::CSetOfLines::Create();
136  linesPath->setColor(1, 0, 0);
137  TPose3D init_pose;
138  if (!meanPath.empty())
139  {
140  init_pose = CPose3D(meanPath[0]).asTPose();
141  int path_decim = 0;
142  for (std::vector<TPose3D>::iterator it = meanPath.begin();
143  it != meanPath.end(); ++it)
144  {
145  linesPath->appendLine(init_pose, *it);
146  init_pose = *it;
147  if (++path_decim > 10)
148  {
149  path_decim = 0;
150  mrpt::opengl::CSetOfObjects::Ptr xyz =
151  mrpt::opengl::stock_objects::CornerXYZSimple(
152  0.3f, 2.0f);
153  xyz->setPose(CPose3D(*it));
154  scene3D->insert(xyz);
155  }
156  }
157  scene3D->insert(linesPath);
158  }
159 
160  // finally a big corner for the latest robot pose:
161  mrpt::opengl::CSetOfObjects::Ptr xyz =
162  mrpt::opengl::stock_objects::CornerXYZSimple(1.0, 2.5);
163  xyz->setPose(robotPoseMean3D);
164  scene3D->insert(xyz);
165 
166  // The camera pointing to the current robot pose:
168  {
169  win3d->setCameraPointingToPoint(
170  robotPoseMean3D.x(), robotPoseMean3D.y(), robotPoseMean3D.z());
171  }
172 
173  // Draw latest data association:
174  const CRangeBearingKFSLAM::TDataAssocInfo& da =
175  mapping.getLastDataAssociation();
176  mrpt::opengl::CSetOfLines::Ptr lins =
177  mrpt::opengl::CSetOfLines::Create();
178  lins->setLineWidth(1.2);
179  lins->setColor(1, 1, 1);
180  for (std::map<observation_index_t, prediction_index_t>::const_iterator
181  it = da.results.associations.begin();
182  it != da.results.associations.end(); ++it)
183  {
184  const prediction_index_t idxPred = it->second;
185  // This index must match the internal list of features in the map:
186  CRangeBearingKFSLAM::KFArray_FEAT featMean;
187  mapping.getLandmarkMean(idxPred, featMean);
188 
189  TPoint3D featMean3D;
190  landmark_to_3d(featMean, featMean3D);
191  // Line: robot -> landmark:
192  lins->appendLine(
193  robotPoseMean3D.x(), robotPoseMean3D.y(), robotPoseMean3D.z(),
194  featMean3D.x, featMean3D.y, featMean3D.z);
195  }
196  scene3D->insert(lins);
197 
198  // The current state of KF-SLAM:
199  opengl::CSetOfObjects::Ptr objs = opengl::CSetOfObjects::Create();
200  mapping.getAs3DObject(objs);
201  scene3D->insert(objs);
202 
203  mrpt::opengl::COpenGLScene::Ptr& scn = win3d->get3DSceneAndLock();
204  scn = scene3D;
205 
206  win3d->unlockAccess3DScene();
207  win3d->repaint();
208  }
209 }
211  const mrpt::slam::CRangeBearingKFSLAM::KFArray_FEAT& lm,
212  mrpt::math::TPoint3D& p)
213 {
214  p.x = lm[0];
215  p.y = lm[1];
216  p.z = lm[2];
217 }
mrpt_ekf_slam_3d.h
EKFslam::CAMERA_3DSCENE_FOLLOWS_ROBOT
bool CAMERA_3DSCENE_FOLLOWS_ROBOT
Definition: mrpt_ekf_slam_3d.h:92
EKFslam::~EKFslam
virtual ~EKFslam()
destructor
Definition: mrpt_ekf_slam_3d.cpp:37
EKFslam::observation
void observation(mrpt::obs::CSensoryFrame::Ptr _sf, mrpt::obs::CObservationOdometry::Ptr _odometry)
calculate the actions from odometry model for current observation
Definition: mrpt_ekf_slam_3d.cpp:70
EKFslam::win3d
mrpt::gui::CDisplayWindow3D::Ptr win3d
MRPT window.
Definition: mrpt_ekf_slam_3d.h:90
EKFslam::landmark_to_3d
void landmark_to_3d(const mrpt::slam::CRangeBearingKFSLAM::KFArray_FEAT &lm, mrpt::math::TPoint3D &p)
convert landmark to 3d point
Definition: mrpt_ekf_slam_3d.cpp:210
EKFslam::mapping
mrpt::slam::CRangeBearingKFSLAM mapping
EKF slam 3d class.
Definition: mrpt_ekf_slam_3d.h:77
EKFslam::init3Dwindow
void init3Dwindow()
init 3D window from mrpt lib
Definition: mrpt_ekf_slam_3d.cpp:95
EKFslam::LM_IDs_
std::map< unsigned int, mrpt::maps::CLandmark::TLandmarkID > LM_IDs_
vector of the landmarks ID
Definition: mrpt_ekf_slam_3d.h:97
f
f
EKFslam::LMs_
std::vector< mrpt::math::TPoint3D > LMs_
Definition: mrpt_ekf_slam_3d.h:95
EKFslam::robotPose_
mrpt::poses::CPose3DQuatPDFGaussian robotPose_
current robot pose
Definition: mrpt_ekf_slam_3d.h:94
EKFslam::run3Dwindow
void run3Dwindow()
run 3D window update from mrpt lib
Definition: mrpt_ekf_slam_3d.cpp:106
console.h
EKFslam::fullCov_
mrpt::math::CMatrixDouble fullCov_
full covariance matrix
Definition: mrpt_ekf_slam_3d.h:98
EKFslam::odomLastObservation_
mrpt::poses::CPose3D odomLastObservation_
last observation of odometry
Definition: mrpt_ekf_slam_3d.h:86
EKFslam::read_iniFile
void read_iniFile(std::string ini_filename)
read ini file
Definition: mrpt_ekf_slam_3d.cpp:39
EKFslam::action
mrpt::obs::CActionCollection::Ptr action
actions
Definition: mrpt_ekf_slam_3d.h:82
EKFslam::SHOW_3D_LIVE
bool SHOW_3D_LIVE
Definition: mrpt_ekf_slam_3d.h:91
ROSCONSOLE_DEFAULT_NAME
#define ROSCONSOLE_DEFAULT_NAME
EKFslam::EKFslam
EKFslam()
constructor
Definition: mrpt_ekf_slam_3d.cpp:11
EKFslam::meanPath
std::vector< mrpt::math::TPose3D > meanPath
Definition: mrpt_ekf_slam_3d.h:93
EKFslam::motion_model_options_
mrpt::obs::CActionRobotMovement3D::TMotionModelOptions motion_model_options_
used with odom value motion noise
Definition: mrpt_ekf_slam_3d.h:88
EKFslam::fullState_
mrpt::math::CVectorDouble fullState_
full state vector
Definition: mrpt_ekf_slam_3d.h:99


mrpt_ekf_slam_3d
Author(s): Jose Luis, Vladislav Tananaev
autogenerated on Thu Sep 19 2024 02:26:29