pf_data_publisher.cpp
Go to the documentation of this file.
1 //#include <exception>
2 //#include <limits>
3 //#include <utility>
4 
10 
11 PFDataPublisher::PFDataPublisher(std::shared_ptr<ScanConfig> config, std::shared_ptr<ScanParameters> params)
12  : config_(config), params_(params)
13 {
14 }
15 
17 {
19  to_msg_queue<PFR2000Packet_A>(packet);
20 }
21 
23 {
25  to_msg_queue<PFR2000Packet_B>(packet);
26 }
27 
29 {
31  to_msg_queue<PFR2000Packet_C>(packet);
32 }
33 
35 {
37  to_msg_queue<PFR2300Packet_C1>(packet, packet.header.layer_index, packet.header.layer_inclination);
38 }
39 
41 {
42  return true;
43 }
44 
46 {
47  return true;
48 }
49 
50 // What are validation checks required here?
51 // Skipped scans?
52 // Device errors?
53 template <typename T>
54 void PFDataPublisher::to_msg_queue(T& packet, uint16_t layer_idx, int layer_inclination)
55 {
56  if (!check_status(packet.header.status_flags))
57  return;
58 
59  sensor_msgs::LaserScanPtr msg;
60  if (d_queue_.empty())
61  d_queue_.emplace_back();
62  else if (d_queue_.size() > 5)
63  d_queue_.pop_front();
64  if (packet.header.header.packet_number == 1)
65  {
66  const auto scan_time = ros::Duration(1000.0 / packet.header.scan_frequency);
67  msg.reset(new sensor_msgs::LaserScan());
68  msg->header.frame_id.assign(frame_id_);
69  msg->header.seq = packet.header.header.scan_number;
70  msg->scan_time = static_cast<float>(scan_time.toSec());
71  msg->header.stamp = packet.last_acquired_point_stamp - scan_time;
72  msg->angle_increment = packet.header.angular_increment / 10000.0 * (M_PI / 180.0);
73 
74  {
75  msg->time_increment = (params_->angular_fov * msg->scan_time) / (M_PI * 2.0) / packet.header.num_points_scan;
76  msg->angle_min = params_->angle_min;
77  msg->angle_max = params_->angle_max;
78  if (std::is_same<T, PFR2300Packet_C1>::value) // Only Packet C1 for R2300
79  {
80  double config_start_angle = config_->start_angle / 1800000.0 * M_PI;
81  if (config_start_angle > params_->angle_min)
82  {
83  msg->angle_min = config_start_angle;
84  }
85  if (config_->max_num_points_scan != 0) // means need to calculate
86  {
87  double config_angle = (config_->max_num_points_scan - 1) * (params_->scan_freq / 500.0) / 180.0 * M_PI;
88  if (msg->angle_min + config_angle < msg->angle_max)
89  {
90  msg->angle_max = msg->angle_min + config_angle;
91  }
92  }
93  }
94 
95  msg->range_min = params_->radial_range_min;
96  msg->range_max = params_->radial_range_max;
97  }
98 
99  msg->ranges.resize(packet.header.num_points_scan);
100  if (!packet.amplitude.empty())
101  msg->intensities.resize(packet.header.num_points_scan);
102  d_queue_.push_back(msg);
103  }
104  msg = d_queue_.back();
105  if (!msg)
106  return;
107 
108  // errors in scan_number - not in sequence sometimes
109  if (msg->header.seq != packet.header.header.scan_number)
110  return;
111  int idx = packet.header.first_index;
112 
113  for (int i = 0; i < packet.header.num_points_packet; i++)
114  {
115  float data;
116  if (packet.distance[i] == 0xFFFFFFFF)
117  data = std::numeric_limits<std::uint32_t>::quiet_NaN();
118  else
119  data = packet.distance[i] / 1000.0;
120  msg->ranges[idx + i] = std::move(data);
121  if (!packet.amplitude.empty() && packet.amplitude[i] >= 32)
122  msg->intensities[idx + i] = packet.amplitude[i];
123  }
124  if (packet.header.num_points_scan == (idx + packet.header.num_points_packet))
125  {
126  if (msg)
127  {
128  handle_scan(msg, layer_idx, layer_inclination, params_->apply_correction);
129  d_queue_.pop_back();
130  }
131  }
132 }
133 
134 // check the status bits here with a switch-case
135 // Currently only for logging purposes only
136 bool PFDataPublisher::check_status(uint32_t status_flags)
137 {
138  // if(packet.header.header.scan_number > packet.)
139  return true;
140 }
std::string frame_id_
pf_driver::PFR2300Header header
std::shared_ptr< ScanParameters > params_
virtual bool start()
std::shared_ptr< ScanConfig > config_
ros::Publisher header_publisher_
virtual bool stop()
void publish(const boost::shared_ptr< M > &message) const
std::deque< sensor_msgs::LaserScanPtr > d_queue_
bool check_status(uint32_t status_flags)
void to_msg_queue(T &packet, uint16_t layer_idx=0, int layer_inclination=0)
PFDataPublisher(std::shared_ptr< ScanConfig > config, std::shared_ptr< ScanParameters > params)
virtual void read(PFR2000Packet_A &packet)
pf_driver::PFR2000Header header
virtual void handle_scan(sensor_msgs::LaserScanPtr msg, uint16_t layer_idx, int layer_inclination, bool apply_correction=true)=0


pf_driver
Author(s): Harsh Deshpande
autogenerated on Fri Feb 24 2023 03:59:35