mirror of
https://github.com/introlab/rtabmap_ros.git
synced 2026-10-04 16:57:46 +08:00
Fixed #1198
This commit is contained in:
@@ -56,6 +56,8 @@ private:
|
|||||||
rtabmap::LocalGridMaker localMapMaker_;
|
rtabmap::LocalGridMaker localMapMaker_;
|
||||||
bool mapFrameProjection_;
|
bool mapFrameProjection_;
|
||||||
bool warned_;
|
bool warned_;
|
||||||
|
float rangeMin_;
|
||||||
|
float rangeMax_;
|
||||||
|
|
||||||
std::shared_ptr<tf2_ros::Buffer> tfBuffer_;
|
std::shared_ptr<tf2_ros::Buffer> tfBuffer_;
|
||||||
std::shared_ptr<tf2_ros::TransformListener> tfListener_;
|
std::shared_ptr<tf2_ros::TransformListener> tfListener_;
|
||||||
|
|||||||
@@ -45,7 +45,9 @@ ObstaclesDetection::ObstaclesDetection(const rclcpp::NodeOptions & options) :
|
|||||||
frameId_("base_link"),
|
frameId_("base_link"),
|
||||||
waitForTransform_(0.2),
|
waitForTransform_(0.2),
|
||||||
mapFrameProjection_(rtabmap::Parameters::defaultGridMapFrameProjection()),
|
mapFrameProjection_(rtabmap::Parameters::defaultGridMapFrameProjection()),
|
||||||
warned_(false)
|
warned_(false),
|
||||||
|
rangeMin_(0),
|
||||||
|
rangeMax_(0)
|
||||||
{
|
{
|
||||||
ULogger::setType(ULogger::kTypeConsole);
|
ULogger::setType(ULogger::kTypeConsole);
|
||||||
ULogger::setLevel(ULogger::kWarning);
|
ULogger::setLevel(ULogger::kWarning);
|
||||||
@@ -75,6 +77,8 @@ ObstaclesDetection::ObstaclesDetection(const rclcpp::NodeOptions & options) :
|
|||||||
}
|
}
|
||||||
|
|
||||||
localMapMaker_.parseParameters(gridParameters);
|
localMapMaker_.parseParameters(gridParameters);
|
||||||
|
rtabmap::Parameters::parse(gridParameters, rtabmap::Parameters::kGridRangeMin(), rangeMin_);
|
||||||
|
rtabmap::Parameters::parse(gridParameters, rtabmap::Parameters::kGridRangeMax(), rangeMax_);
|
||||||
|
|
||||||
tfBuffer_ = std::make_shared< tf2_ros::Buffer >(this->get_clock());
|
tfBuffer_ = std::make_shared< tf2_ros::Buffer >(this->get_clock());
|
||||||
tfListener_ = std::make_shared< tf2_ros::TransformListener >(*tfBuffer_);
|
tfListener_ = std::make_shared< tf2_ros::TransformListener >(*tfBuffer_);
|
||||||
@@ -86,6 +90,42 @@ ObstaclesDetection::ObstaclesDetection(const rclcpp::NodeOptions & options) :
|
|||||||
cloudSub_ = create_subscription<sensor_msgs::msg::PointCloud2>("cloud", rclcpp::QoS(1).reliability((rmw_qos_reliability_policy_t)qos), std::bind(&ObstaclesDetection::callback, this, std::placeholders::_1));
|
cloudSub_ = create_subscription<sensor_msgs::msg::PointCloud2>("cloud", rclcpp::QoS(1).reliability((rmw_qos_reliability_policy_t)qos), std::bind(&ObstaclesDetection::callback, this, std::placeholders::_1));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pcl::PointCloud<pcl::PointXYZ> rangeFiltering(
|
||||||
|
const pcl::PointCloud<pcl::PointXYZ> & cloud,
|
||||||
|
float rangeMin,
|
||||||
|
float rangeMax)
|
||||||
|
{
|
||||||
|
if(!cloud.empty() && (rangeMin > 0.0f || rangeMax > 0.0f))
|
||||||
|
{
|
||||||
|
pcl::PointCloud<pcl::PointXYZ> output;
|
||||||
|
output.reserve(cloud.size());
|
||||||
|
int oi = 0;
|
||||||
|
float rangeMinSqrd = rangeMin * rangeMin;
|
||||||
|
float rangeMaxSqrd = rangeMax * rangeMax;
|
||||||
|
for(size_t i=0; i<cloud.size(); ++i)
|
||||||
|
{
|
||||||
|
const pcl::PointXYZ & pt = cloud.at(i);
|
||||||
|
float r = pt.x*pt.x + pt.y*pt.y + pt.z*pt.z;
|
||||||
|
|
||||||
|
if(rangeMin > 0.0f && r < rangeMinSqrd)
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if(rangeMax > 0.0f && r > rangeMaxSqrd)
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
output.push_back(pt);
|
||||||
|
++oi;
|
||||||
|
}
|
||||||
|
output.resize(oi);
|
||||||
|
return output;
|
||||||
|
}
|
||||||
|
|
||||||
|
return cloud;
|
||||||
|
}
|
||||||
|
|
||||||
void ObstaclesDetection::callback(const sensor_msgs::msg::PointCloud2::ConstSharedPtr cloudMsg)
|
void ObstaclesDetection::callback(const sensor_msgs::msg::PointCloud2::ConstSharedPtr cloudMsg)
|
||||||
{
|
{
|
||||||
rclcpp::Time time = now();
|
rclcpp::Time time = now();
|
||||||
@@ -137,6 +177,11 @@ void ObstaclesDetection::callback(const sensor_msgs::msg::PointCloud2::ConstShar
|
|||||||
inputCloud->is_dense = true;
|
inputCloud->is_dense = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(rangeMin_ > 0.0f || rangeMax_ > 0.0f)
|
||||||
|
{
|
||||||
|
*inputCloud = rangeFiltering(*inputCloud, rangeMin_, rangeMax_);
|
||||||
|
}
|
||||||
|
|
||||||
//Common variables for all strategies
|
//Common variables for all strategies
|
||||||
pcl::IndicesPtr ground, obstacles;
|
pcl::IndicesPtr ground, obstacles;
|
||||||
pcl::PointCloud<pcl::PointXYZ>::Ptr obstaclesCloud(new pcl::PointCloud<pcl::PointXYZ>);
|
pcl::PointCloud<pcl::PointXYZ>::Ptr obstaclesCloud(new pcl::PointCloud<pcl::PointXYZ>);
|
||||||
|
|||||||
Reference in New Issue
Block a user