33 #include <sensor_msgs/Range.h> 45 std::string frame = msg->header.frame_id;
46 ROS_DEBUG(
"Callback %s %f", frame.c_str(), msg->range);
51 std::map<std::string,RangeSensor>::iterator it =
sensors.find(frame);
55 geometry_msgs::TransformStamped sensor_to_base_tf =
59 tf2::Vector3 origin, left_vector, right_vector;
62 geometry_msgs::PointStamped sensor_origin;
63 sensor_origin.point.x = 0;
64 sensor_origin.point.y = 0;
65 sensor_origin.point.z = 0;
66 geometry_msgs::PointStamped base_origin;
68 fromMsg(base_origin.point, origin);
69 ROS_INFO(
"Obstacle: origin %f %f %f", origin.x(), origin.y(), origin.z());
72 double theta = msg->field_of_view / 2.0;
73 float x = std::cos(theta);
74 float y = std::sin(theta);
76 geometry_msgs::Vector3Stamped sensor_left;
77 sensor_left.vector.x = x;
78 sensor_left.vector.y = -y;
79 sensor_left.vector.z = 0.0;
80 geometry_msgs::Vector3Stamped base_left;
82 fromMsg(base_left.vector, left_vector);
84 geometry_msgs::Vector3Stamped sensor_right;
85 sensor_right.vector.x = x;
86 sensor_right.vector.y = y;
87 sensor_right.vector.z = 0.0;
88 geometry_msgs::Vector3Stamped base_right;
90 fromMsg(base_right.vector, right_vector);
93 left_vector, right_vector);
94 sensor.
update(msg->range, msg->header.stamp);
103 sensor.
update(msg->range, msg->header.stamp);
109 float theta = msg->angle_min;
110 float increment = msg->angle_increment;
111 size_t array_size = (msg->ranges).size();
118 std::string laserFrame = msg->header.frame_id;
119 geometry_msgs::TransformStamped laser_to_base_tf =
125 geometry_msgs::PointStamped origin;
129 geometry_msgs::PointStamped base_origin;
134 geometry_msgs::Vector3Stamped normal;
135 normal.vector.x = 1.0;
136 normal.vector.y = 0.0;
137 normal.vector.z = 0.0;
138 geometry_msgs::Vector3Stamped base_normal;
142 double min_range = msg->range_min;
143 double max_range = msg->range_max;
144 double min_angle = msg->angle_min;
145 double max_angle = msg->angle_max;
146 double angle_increment = msg->angle_increment;
147 lidar.
reset(laserFrame, angle_increment, min_range, max_range, min_angle, max_angle);
151 cosLUT.reserve(array_size);
152 sinLUT.reserve(array_size);
153 double angle = msg->angle_min;
154 for (
unsigned int i = 0 ; i < array_size ; i++) {
155 double cosine = std::cos(angle);
156 double sine = std::sin(angle);
157 cosLUT.push_back(std::move(cosine));
158 sinLUT.push_back(std::move(sine));
170 for (
const auto& r : msg->ranges) {
178 std::vector<tf2::Vector3> points;
183 if (lidar_age < max_age) {
184 for (
unsigned int i = 0 ; i <
lidar_points.size() ; i++) {
188 if (std::isnan(radius) || std::isinf(radius) || radius <
lidar.
min_range)
continue;
196 points.push_back(tf2::Vector3(x, y, 0));
200 for (
const auto& kv :
sensors) {
220 std::vector<ObstaclePoints::Line> lines;
221 for (
const auto& kv :
sensors) {
241 const int _increment,
242 const double & _min_range,
243 const double & _max_range,
244 const double & _min_angle,
245 const double & _max_angle)
247 this->frame_id = _frame;
248 this->angle_increment = _increment;
249 this->min_range = _min_range;
250 this->max_range = _max_range;
251 this->min_angle = _min_angle;
252 this->max_angle = _max_angle;
256 const tf2::Vector3& origin,
257 const tf2::Vector3& left_vec,
258 const tf2::Vector3& right_vec)
261 this->frame_id = frame_id;
262 this->origin = origin;
263 this->left_vec = left_vec;
264 this->right_vec = right_vec;
265 ROS_INFO(
"Adding sensor %s", frame_id.c_str());
271 left_vertex = origin + left_vec * range;
272 right_vertex = origin + right_vec * range;
277 this->radius = radius;
ros::Subscriber sonar_sub
PolarLine(float radius, float theta)
Subscriber subscribe(const std::string &topic, uint32_t queue_size, void(T::*fp)(M), T *obj, const TransportHints &transport_hints=TransportHints())
virtual geometry_msgs::TransformStamped lookupTransform(const std::string &target_frame, const std::string &source_frame, const ros::Time &time, const ros::Duration timeout) const
ObstaclePoints(ros::NodeHandle &nh, tf2_ros::Buffer &tf_buffer)
void reset(const std::string &_frame, const int _increment, const double &_min_range, const double &_max_range, const double &_min_angle, const double &_max_angle)
void doTransform(const T &data_in, T &data_out, const geometry_msgs::TransformStamped &transform)
TFSIMD_FORCE_INLINE const tfScalar & y() const
TFSIMD_FORCE_INLINE tfScalar angle(const Quaternion &q1, const Quaternion &q2)
void range_callback(const sensor_msgs::Range::ConstPtr &msg)
std::vector< PolarLine > lidar_points
bool param(const std::string ¶m_name, T ¶m_val, const T &default_val) const
void update(float range, ros::Time stamp)
void fromMsg(const A &, B &b)
TFSIMD_FORCE_INLINE const tfScalar & x() const
void add_test_point(tf2::Vector3 p)
std::map< std::string, RangeSensor > sensors
tf2::Vector3 lidar_normal
void scan_callback(const sensor_msgs::LaserScan::ConstPtr &msg)
tf2_ros::Buffer & tf_buffer
std::vector< Line > get_lines(ros::Duration max_age)
std::vector< float > cosLUT
std::vector< tf2::Vector3 > get_points(ros::Duration max_age)
std::vector< float > sinLUT
tf2::Vector3 right_vertex
tf2::Vector3 lidar_origin
std::vector< tf2::Vector3 > test_points