Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 5 additions & 7 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
cmake_minimum_required(VERSION 3.8)
cmake_policy(VERSION 3.28)
cmake_minimum_required(VERSION 3.22)

project(robot_self_filter)

Expand All @@ -22,6 +21,7 @@ find_package(yaml-cpp REQUIRED)

# ROS 2 packages
find_package(rclcpp REQUIRED)
find_package(rclcpp_lifecycle REQUIRED)
find_package(tf2 REQUIRED)
find_package(tf2_ros REQUIRED)
find_package(geometry_msgs REQUIRED)
Expand Down Expand Up @@ -170,6 +170,7 @@ ament_target_dependencies(${PROJECT_NAME}

ament_target_dependencies(self_filter
rclcpp
rclcpp_lifecycle
tf2
tf2_ros
geometry_msgs
Expand Down Expand Up @@ -201,10 +202,9 @@ install(
TARGETS
robot_geometric_shapes
${PROJECT_NAME}
# test_filter
self_filter
ARCHIVE DESTINATION lib
LIBRARY DESTINATION lib
RUNTIME DESTINATION lib/${PROJECT_NAME}
DESTINATION lib/${PROJECT_NAME}
)

#
Expand All @@ -217,8 +217,6 @@ ament_export_include_directories(
ament_export_libraries(
robot_geometric_shapes
${PROJECT_NAME}
${BULLET_LIBRARIES}
${ASSIMP_LIBRARIES}
)

# Exporting Bullet as a standard ament dependency doesn't typically do anything,
Expand Down
26 changes: 16 additions & 10 deletions include/robot_self_filter/self_mask.h
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
#define ROBOT_SELF_FILTER_SELF_MASK_

#include <rclcpp/rclcpp.hpp>
#include <rclcpp/node_interfaces/node_parameters_interface.hpp>
#include <tf2/LinearMath/Transform.h>
#include <tf2/LinearMath/Vector3.h>
#include <tf2_ros/buffer.h>
Expand Down Expand Up @@ -140,10 +141,13 @@ class SelfMask
public:
using PointCloud = pcl::PointCloud<PointT>;

SelfMask(rclcpp::Node::SharedPtr node,
template <class NodeT>
SelfMask(std::shared_ptr<NodeT> node,
tf2_ros::Buffer &tf_buffer,
const std::vector<LinkInfo> &links)
: node_(node)
: node_clock_(node->get_clock())
, node_params_(node->get_node_parameters_interface())
, node_logger_(node->get_logger())
, tf_buffer_(tf_buffer)
{
configure(links);
Expand Down Expand Up @@ -216,14 +220,13 @@ class SelfMask

void assumeFrame(const std_msgs::msg::Header &header)
{
rclcpp::Time transform_time(header.stamp.sec, header.stamp.nanosec, node_->get_clock()->get_clock_type());
for (auto &sl : bodies_)
{
try
{
auto transform_stamped = tf_buffer_.lookupTransform(
header.frame_id, sl.name,
transform_time, rclcpp::Duration(std::chrono::milliseconds(100)));
tf2::TimePointZero);
tf2::Quaternion q(
transform_stamped.transform.rotation.x,
transform_stamped.transform.rotation.y,
Expand Down Expand Up @@ -260,15 +263,14 @@ class SelfMask
const double min_sensor_dist)
{
assumeFrame(header);
rclcpp::Time transform_time(header.stamp.sec, header.stamp.nanosec, node_->get_clock()->get_clock_type());

if (!sensor_frame.empty())
{
try
{
auto transform_stamped = tf_buffer_.lookupTransform(
header.frame_id, sensor_frame,
transform_time, rclcpp::Duration(std::chrono::milliseconds(100)));
tf2::TimePointZero);
tf2::Vector3 t(
transform_stamped.transform.translation.x,
transform_stamped.transform.translation.y,
Expand Down Expand Up @@ -359,15 +361,17 @@ class SelfMask
sensor_pos_ = tf2::Vector3(0, 0, 0);

std::string content;
if (!node_->get_parameter("robot_description", content) || content.empty())
rclcpp::Parameter rd_param;
if (!node_params_->get_parameter("robot_description", rd_param) ||
(content = rd_param.as_string()).empty())
{
RCLCPP_ERROR(node_->get_logger(), "Robot model not found!");
RCLCPP_ERROR(node_logger_, "Robot model not found!");
return false;
}
auto urdfModel = std::make_shared<urdf::Model>();
if (!urdfModel->initString(content))
{
RCLCPP_ERROR(node_->get_logger(), "Unable to parse URDF!");
RCLCPP_ERROR(node_logger_, "Unable to parse URDF!");
return false;
}

Expand Down Expand Up @@ -588,7 +592,9 @@ class SelfMask
}
}

rclcpp::Node::SharedPtr node_;
rclcpp::Clock::SharedPtr node_clock_;
rclcpp::node_interfaces::NodeParametersInterface::SharedPtr node_params_;
rclcpp::Logger node_logger_;
tf2_ros::Buffer &tf_buffer_;

tf2::Vector3 sensor_pos_{0, 0, 0};
Expand Down
90 changes: 47 additions & 43 deletions include/robot_self_filter/self_see_filter.h
Original file line number Diff line number Diff line change
Expand Up @@ -39,46 +39,51 @@ class SelfFilter : public FilterBase<pcl::PointCloud<PointT>>, public SelfFilter
public:
using PointCloud = pcl::PointCloud<PointT>;

explicit SelfFilter(const rclcpp::Node::SharedPtr &node)
: node_(node)
, tf_buffer_(std::make_shared<tf2_ros::Buffer>(node_->get_clock()))
, tf_listener_(std::make_shared<tf2_ros::TransformListener>(*tf_buffer_))
template <class NodeT>
explicit SelfFilter(const std::shared_ptr<NodeT> &node,
std::shared_ptr<tf2_ros::Buffer> existing_tf_buffer = nullptr)
: tf_buffer_(existing_tf_buffer
? existing_tf_buffer
: std::make_shared<tf2_ros::Buffer>(node->get_clock()))
, tf_listener_(existing_tf_buffer
? nullptr
: std::make_shared<tf2_ros::TransformListener>(*tf_buffer_))
{
node_->declare_parameter<double>("min_sensor_dist", 0.01, rcl_interfaces::msg::ParameterDescriptor());
node_->declare_parameter<bool>("keep_organized", false, rcl_interfaces::msg::ParameterDescriptor());
node_->declare_parameter<bool>("zero_for_removed_points", false, rcl_interfaces::msg::ParameterDescriptor());
node_->declare_parameter<bool>("invert", false, rcl_interfaces::msg::ParameterDescriptor());
node->template declare_parameter<double>("min_sensor_dist", 0.01, rcl_interfaces::msg::ParameterDescriptor());
node->template declare_parameter<bool>("keep_organized", false, rcl_interfaces::msg::ParameterDescriptor());
node->template declare_parameter<bool>("zero_for_removed_points", false, rcl_interfaces::msg::ParameterDescriptor());
node->template declare_parameter<bool>("invert", false, rcl_interfaces::msg::ParameterDescriptor());

node_->declare_parameter<std::vector<double>>("default_box_scale",
node->template declare_parameter<std::vector<double>>("default_box_scale",
{1.0, 1.0, 1.0}, rcl_interfaces::msg::ParameterDescriptor());
node_->declare_parameter<std::vector<double>>("default_box_padding",
node->template declare_parameter<std::vector<double>>("default_box_padding",
{0.01, 0.01, 0.01}, rcl_interfaces::msg::ParameterDescriptor());
node_->declare_parameter<std::vector<double>>("default_cylinder_scale",
node->template declare_parameter<std::vector<double>>("default_cylinder_scale",
{1.0, 1.0}, rcl_interfaces::msg::ParameterDescriptor());
node_->declare_parameter<std::vector<double>>("default_cylinder_padding",
node->template declare_parameter<std::vector<double>>("default_cylinder_padding",
{0.01, 0.01}, rcl_interfaces::msg::ParameterDescriptor());
node_->declare_parameter<double>("default_sphere_scale", 1.0, rcl_interfaces::msg::ParameterDescriptor());
node_->declare_parameter<double>("default_sphere_padding", 0.01, rcl_interfaces::msg::ParameterDescriptor());

node_->get_parameter("min_sensor_dist", min_sensor_dist_);
node_->get_parameter("keep_organized", keep_organized_);
node_->get_parameter("zero_for_removed_points", zero_for_removed_points_);
node_->get_parameter("invert", invert_);

node_->get_parameter("default_box_scale", default_box_scale_);
node_->get_parameter("default_box_padding", default_box_pad_);
node_->get_parameter("default_cylinder_scale", default_cyl_scale_);
node_->get_parameter("default_cylinder_padding", default_cyl_pad_);
node_->get_parameter("default_sphere_scale", default_sphere_scale_);
node_->get_parameter("default_sphere_padding", default_sphere_pad_);

node_->declare_parameter<std::vector<std::string>>(
node->template declare_parameter<double>("default_sphere_scale", 1.0, rcl_interfaces::msg::ParameterDescriptor());
node->template declare_parameter<double>("default_sphere_padding", 0.01, rcl_interfaces::msg::ParameterDescriptor());

node->get_parameter("min_sensor_dist", min_sensor_dist_);
node->get_parameter("keep_organized", keep_organized_);
node->get_parameter("zero_for_removed_points", zero_for_removed_points_);
node->get_parameter("invert", invert_);

node->get_parameter("default_box_scale", default_box_scale_);
node->get_parameter("default_box_padding", default_box_pad_);
node->get_parameter("default_cylinder_scale", default_cyl_scale_);
node->get_parameter("default_cylinder_padding", default_cyl_pad_);
node->get_parameter("default_sphere_scale", default_sphere_scale_);
node->get_parameter("default_sphere_padding", default_sphere_pad_);

node->template declare_parameter<std::vector<std::string>>(
"self_see_links.names",
std::vector<std::string>(),
rcl_interfaces::msg::ParameterDescriptor()
);
std::vector<std::string> link_names;
node_->get_parameter("self_see_links.names", link_names);
node->get_parameter("self_see_links.names", link_names);

std::vector<robot_self_filter::LinkInfo> links;
for (auto &lname : link_names)
Expand All @@ -95,33 +100,33 @@ class SelfFilter : public FilterBase<pcl::PointCloud<PointT>>, public SelfFilter
std::string padding_key = "self_see_links." + lname + ".padding";
std::string scale_key = "self_see_links." + lname + ".scale";

node_->declare_parameter<std::vector<double>>(box_scale_key,
node->template declare_parameter<std::vector<double>>(box_scale_key,
std::vector<double>(), rcl_interfaces::msg::ParameterDescriptor());
node_->declare_parameter<std::vector<double>>(box_padding_key,
node->template declare_parameter<std::vector<double>>(box_padding_key,
std::vector<double>(), rcl_interfaces::msg::ParameterDescriptor());
node_->get_parameter(box_scale_key, li.box_scale);
node_->get_parameter(box_padding_key, li.box_padding);
node->get_parameter(box_scale_key, li.box_scale);
node->get_parameter(box_padding_key, li.box_padding);

node_->declare_parameter<std::vector<double>>(cyl_scale_key,
node->template declare_parameter<std::vector<double>>(cyl_scale_key,
std::vector<double>(), rcl_interfaces::msg::ParameterDescriptor());
node_->declare_parameter<std::vector<double>>(cyl_padding_key,
node->template declare_parameter<std::vector<double>>(cyl_padding_key,
std::vector<double>(), rcl_interfaces::msg::ParameterDescriptor());
node_->get_parameter(cyl_scale_key, li.cylinder_scale);
node_->get_parameter(cyl_padding_key, li.cylinder_padding);
node->get_parameter(cyl_scale_key, li.cylinder_scale);
node->get_parameter(cyl_padding_key, li.cylinder_padding);

node_->declare_parameter<double>(padding_key, default_sphere_pad_, rcl_interfaces::msg::ParameterDescriptor());
node_->declare_parameter<double>(scale_key, default_sphere_scale_, rcl_interfaces::msg::ParameterDescriptor());
node->template declare_parameter<double>(padding_key, default_sphere_pad_, rcl_interfaces::msg::ParameterDescriptor());
node->template declare_parameter<double>(scale_key, default_sphere_scale_, rcl_interfaces::msg::ParameterDescriptor());
double link_pad = default_sphere_pad_;
double link_scl = default_sphere_scale_;
node_->get_parameter(padding_key, link_pad);
node_->get_parameter(scale_key, link_scl);
node->get_parameter(padding_key, link_pad);
node->get_parameter(scale_key, link_scl);
li.padding = link_pad;
li.scale = link_scl;

links.push_back(li);
}

sm_ = std::make_shared<robot_self_filter::SelfMask<PointT>>(node_, *tf_buffer_, links);
sm_ = std::make_shared<robot_self_filter::SelfMask<PointT>>(node, *tf_buffer_, links);
}

~SelfFilter() override = default;
Expand Down Expand Up @@ -223,7 +228,6 @@ class SelfFilter : public FilterBase<pcl::PointCloud<PointT>>, public SelfFilter
}
}

rclcpp::Node::SharedPtr node_;
std::shared_ptr<tf2_ros::Buffer> tf_buffer_;
std::shared_ptr<tf2_ros::TransformListener> tf_listener_;
std::shared_ptr<robot_self_filter::SelfMask<PointT>> sm_;
Expand Down
2 changes: 2 additions & 0 deletions package.xml
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@

<!-- Build dependencies -->
<build_depend>rclcpp</build_depend>
<build_depend>rclcpp_lifecycle</build_depend>
<build_depend>tf2</build_depend>
<build_depend>tf2_ros</build_depend>
<build_depend>geometry_msgs</build_depend>
Expand All @@ -30,6 +31,7 @@

<!-- Execution dependencies -->
<exec_depend>rclcpp</exec_depend>
<exec_depend>rclcpp_lifecycle</exec_depend>
<exec_depend>tf2</exec_depend>
<exec_depend>tf2_ros</exec_depend>
<exec_depend>geometry_msgs</exec_depend>
Expand Down
Loading