rawlog_play_node.cpp
Go to the documentation of this file.
1 /***********************************************************************************
2  * Revised BSD License *
3  * Copyright (c) 2014, Markus Bader <markus.bader@tuwien.ac.at> *
4  * All rights reserved. *
5  * *
6  * Redistribution and use in source and binary forms, with or without *
7  * modification, are permitted provided that the following conditions are met: *
8  * * Redistributions of source code must retain the above copyright *
9  * notice, this list of conditions and the following disclaimer. *
10  * * Redistributions in binary form must reproduce the above copyright *
11  * notice, this list of conditions and the following disclaimer in the *
12  * documentation and/or other materials provided with the distribution. *
13  * * Neither the name of the Vienna University of Technology nor the *
14  * names of its contributors may be used to endorse or promote products *
15  * derived from this software without specific prior written permission. *
16  * *
17  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
18  *AND *
19  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
20  **
21  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE *
22  * DISCLAIMED. IN NO EVENT SHALL Markus Bader BE LIABLE FOR ANY *
23  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES *
24  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
25  **
26  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND *
27  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT *
28  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
29  **
30  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31  ** *
32  ***********************************************************************************/
33 
34 #include "rawlog_play_node.h"
35 
36 #include <mrpt/obs/CObservation2DRangeScan.h>
37 #include <mrpt/obs/CObservationBeaconRanges.h>
38 #include <mrpt/obs/CObservationBearingRange.h>
39 #include <mrpt/obs/CRawlog.h>
40 #include <mrpt/obs/CSensoryFrame.h>
41 #include <mrpt/ros1bridge/laser_scan.h>
42 #include <mrpt/ros1bridge/pose.h>
43 #include <mrpt/ros1bridge/time.h>
44 #include <mrpt/system/filesystem.h>
47 
48 #include <boost/interprocess/sync/scoped_lock.hpp>
49 using namespace mrpt::obs;
50 
51 #include <mrpt/serialization/CArchive.h>
52 
53 int main(int argc, char** argv)
54 {
55  ros::init(argc, argv, "rawlog_play");
57  RawlogPlayNode my_node(n);
58  my_node.init();
59  my_node.loop();
60  return 0;
61 }
62 
65  : RawlogPlay(new RawlogPlayNode::ParametersNode()), n_(n), loop_count_(0)
66 {
67 }
68 
70 {
71  return static_cast<RawlogPlayNode::ParametersNode*>(param_);
72 }
73 
75 {
76  if (!mrpt::system::fileExists(param_->rawlog_file))
77  {
78  ROS_ERROR("raw_file: %s does not exit", param_->rawlog_file.c_str());
79  ros::shutdown();
80  return;
81  }
83  pub_laser_ = n_.advertise<sensor_msgs::LaserScan>("scan", 10);
84  pub_beacon_ = n_.advertise<mrpt_msgs::ObservationRangeBeacon>("beacon", 10);
86  n_.advertise<mrpt_msgs::ObservationRangeBearing>("landmark", 10);
89  robotPose = mrpt::poses::CPose3DPDFGaussian();
90 }
91 
93  const mrpt::obs::CObservation::Ptr& o)
94 {
95  mrpt::poses::CPose3D pose_sensor;
96  o->getSensorPose(pose_sensor);
97 
98  geometry_msgs::Pose msgSensorPose; // not actually used after all.
99 
100  // Aux lambda to publish TF transforms "base_link" ==> "sensor_frame"
101  // ------
102  auto lambdaSendTfSensorPose = [&](const std_msgs::Header& header) {
103  const tf2::Transform tfSensorPose =
104  mrpt::ros1bridge::toROS_tfTransform(pose_sensor);
105 
106  geometry_msgs::TransformStamped tfGeom =
108  tfSensorPose, header.stamp + ros::Duration(0.05), base_frame_));
109  tfGeom.child_frame_id = header.frame_id;
110 
112  };
113  // ------
114 
115  if (auto laser = std::dynamic_pointer_cast<CObservation2DRangeScan>(o);
116  laser)
117  { // laser observation detected
118  mrpt::ros1bridge::toROS(*laser, msg_laser_, msgSensorPose);
119 
120  if (msg_laser_.header.frame_id.empty())
121  msg_laser_.header.frame_id = "laser_link";
122  msg_laser_.header.stamp = ros::Time::now();
123 
124  lambdaSendTfSensorPose(msg_laser_.header);
125 
127  }
128  else if (auto beacon =
129  std::dynamic_pointer_cast<CObservationBeaconRanges>(o);
130  beacon)
131  {
132  mrpt_msgs_bridge::toROS(*beacon, msg_beacon_, msgSensorPose);
133  if (msg_beacon_.header.frame_id.empty())
134  msg_beacon_.header.frame_id = "beacon_link";
135  msg_beacon_.header.stamp = ros::Time::now();
136 
137  lambdaSendTfSensorPose(msg_beacon_.header);
138 
140  }
141  else if (auto landmark =
142  std::dynamic_pointer_cast<CObservationBearingRange>(o);
143  landmark)
144  {
145  mrpt_msgs_bridge::toROS(*landmark, msg_landmark_, msgSensorPose);
146  if (msg_landmark_.header.frame_id.empty())
147  msg_landmark_.header.frame_id = "landmark_link";
148  msg_landmark_.header.stamp = ros::Time::now();
149 
150  lambdaSendTfSensorPose(msg_landmark_.header);
152  }
153  else
154  {
155  ROS_WARN(
156  "Observation mapping to ROS not implemented: %s",
157  o->GetRuntimeClass()->className);
158  }
159 } // end publishSingleObservation()
160 
162 {
163  CActionCollection::Ptr action;
164  CSensoryFrame::Ptr observations;
165  CObservation::Ptr obs;
166 
167  auto rs = mrpt::serialization::archiveFrom(rawlog_stream_);
168 
169  if (!CRawlog::getActionObservationPairOrObservation(
170  rs, action, observations, obs, entry_))
171  {
172  ROS_INFO("end of stream!");
173  return true;
174  }
175  tf2::Transform transform;
176 
177  // Process single obs, if present:
178  if (obs) publishSingleObservation(obs);
179  // and process all obs into a CSensoryFrame, if present:
180  for (const auto& o : *observations) publishSingleObservation(o);
181 
182  mrpt::poses::CPose3DPDFGaussian out_pose_increment;
183  action->getFirstMovementEstimation(out_pose_increment);
184  robotPose -= out_pose_increment;
185 
186  msg_odom_.header.frame_id = odom_frame_;
187  msg_odom_.child_frame_id = base_frame_;
188  if (!msg_laser_.header.frame_id.empty())
189  {
190  msg_odom_.header.stamp = msg_laser_.header.stamp;
191  msg_odom_.header.seq = msg_laser_.header.seq;
192  }
193  else if (!msg_beacon_.header.frame_id.empty())
194  {
195  msg_odom_.header.stamp = msg_beacon_.header.stamp;
196  msg_odom_.header.seq = msg_beacon_.header.seq;
197  }
198  else if (!msg_landmark_.header.frame_id.empty())
199  {
200  msg_odom_.header.stamp = msg_landmark_.header.stamp;
201  msg_odom_.header.seq = msg_landmark_.header.seq;
202  }
203 
204  msg_odom_.pose = mrpt::ros1bridge::toROS_Pose(robotPose);
205  transform = mrpt::ros1bridge::toROS_tfTransform(robotPose.mean);
206 
207  msg_odom_.header.stamp = ros::Time::now();
208 
209  MRPT_TODO("Publish /odom topic too?");
210 
211  {
212  geometry_msgs::TransformStamped tfGeom =
214  transform.inverse(),
215  msg_odom_.header.stamp + ros::Duration(0.05), base_frame_));
216  tfGeom.child_frame_id = msg_odom_.header.frame_id;
217 
219  }
220 
221  return false;
222 }
223 
225 {
226  bool end = false;
227  for (ros::Rate rate(param()->rate); ros::ok() && !end; loop_count_++)
228  {
230  end = nextEntry();
231  ros::spinOnce();
232  rate.sleep();
233  }
234 }
int main(int argc, char **argv)
ros::Publisher pub_landmark_
std::string rawlog_file
Definition: rawlog_play.h:51
Parameters * param_
Definition: rawlog_play.h:60
mrpt::io::CFileGZInputStream rawlog_stream_
Definition: rawlog_play.h:61
ros::NodeHandle n_
ROSCPP_DECL void init(int &argc, char **argv, const std::string &name, uint32_t options=0)
ParametersNode * param()
size_t entry_
Definition: rawlog_play.h:63
RawlogPlayNode(ros::NodeHandle &n)
#define ROS_WARN(...)
sensor_msgs::LaserScan msg_laser_
void update(const unsigned long &loop_count)
Transform inverse() const
mrpt::poses::CPose3DPDFGaussian robotPose
Definition: rawlog_play.h:62
nav_msgs::Odometry msg_odom_
void publish(const boost::shared_ptr< M > &message) const
void publishSingleObservation(const mrpt::obs::CObservation::Ptr &o)
mrpt_msgs::ObservationRangeBearing msg_landmark_
#define ROS_INFO(...)
ROSCPP_DECL bool ok()
std::string base_frame_
bool toROS(const mrpt::obs::CObservationBeaconRanges &_obj, mrpt_msgs::ObservationRangeBeacon &_msg)
Publisher advertise(const std::string &topic, uint32_t queue_size, bool latch=false)
void sendTransform(const geometry_msgs::TransformStamped &transform)
action
std::string odom_frame_
tf2_ros::TransformBroadcaster tf_broadcaster_
B toMsg(const A &a)
static Time now()
ROSCPP_DECL void shutdown()
const std::string header
ros::Publisher pub_beacon_
ROSCPP_DECL void spinOnce()
unsigned long loop_count_
mrpt_msgs::ObservationRangeBeacon msg_beacon_
#define ROS_ERROR(...)
ros::Publisher pub_laser_


mrpt_rawlog
Author(s):
autogenerated on Thu Jun 1 2023 03:07:08