12 : config_(config), params_(params)
19 to_msg_queue<PFR2000Packet_A>(packet);
25 to_msg_queue<PFR2000Packet_B>(packet);
31 to_msg_queue<PFR2000Packet_C>(packet);
37 to_msg_queue<PFR2300Packet_C1>(packet, packet.
header.layer_index, packet.header.layer_inclination);
59 sensor_msgs::LaserScanPtr msg;
64 if (packet.header.header.packet_number == 1)
66 const auto scan_time =
ros::Duration(1000.0 / packet.header.scan_frequency);
67 msg.reset(
new sensor_msgs::LaserScan());
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);
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)
80 double config_start_angle =
config_->start_angle / 1800000.0 * M_PI;
81 if (config_start_angle >
params_->angle_min)
83 msg->angle_min = config_start_angle;
85 if (
config_->max_num_points_scan != 0)
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)
90 msg->angle_max = msg->angle_min + config_angle;
95 msg->range_min =
params_->radial_range_min;
96 msg->range_max =
params_->radial_range_max;
99 msg->ranges.resize(packet.header.num_points_scan);
100 if (!packet.amplitude.empty())
101 msg->intensities.resize(packet.header.num_points_scan);
109 if (msg->header.seq != packet.header.header.scan_number)
111 int idx = packet.header.first_index;
113 for (
int i = 0; i < packet.header.num_points_packet; i++)
116 if (packet.distance[i] == 0xFFFFFFFF)
117 data = std::numeric_limits<std::uint32_t>::quiet_NaN();
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];
124 if (packet.header.num_points_scan == (idx + packet.header.num_points_packet))
pf_driver::PFR2300Header header
std::shared_ptr< ScanParameters > params_
std::shared_ptr< ScanConfig > config_
ros::Publisher header_publisher_
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