15 #include <pcl_conversions/pcl_conversions.h>
16 #include <sensor_msgs/msg/point_cloud2.hpp>
17 #include <sensor_msgs/point_cloud2_iterator.hpp>
20 using namespace std::chrono_literals;
21 using std::placeholders::_1;
26 std::string configPath =
"settings/onstartup_realsense.json";
28 json& settingsJson = (*settingsJsonSPtr)[
"settings"];
34 catch(std::exception& e) {
35 log_error(
"[RealSenseNode] Failed to read config file. ", e.what());
43 rclcpp::QoS qos = galaxis::ros::get_qos_profile(galaxis::ros::QoS_Profile_t::QOS_RELIABLE);
47 m_depthSubscriberSPtr = this->create_subscription<sensor_msgs::msg::PointCloud2>(
"/galaxis/debug/realsense/pointcloud/raw",
55 m_debugPclPublisherFiltered = this->create_publisher<sensor_msgs::msg::PointCloud2>(
"galaxis/debug/realsense/pointcloud/filtered", qos);
56 m_debugPclPublisherResult = this->create_publisher<sensor_msgs::msg::PointCloud2>(
"galaxis/debug/realsense/pointcloud/objects", qos);
66 auto timePclTupleSPtr = std::make_shared<std::pair<rclcpp::Time, pcl::PointCloud<pcl::PointXYZ>::Ptr>>();
68 pcl::fromROSMsg(*pclMsg, *(timePclTupleSPtr->second));
69 timePclTupleSPtr->first = pclMsg->header.stamp;
78 if(pointCloudRawPair ==
nullptr) {
79 log_warning(
"[RealSenseNode] pop_last_grabbed_pcl is nullptr");
80 std::this_thread::sleep_for(std::chrono::milliseconds(5));
93 std::vector<Object> objectsVec;
97 std::unique_ptr<ObstacleListType> msgObstacle = std::make_unique<ObstacleListType>();
98 std_msgs::msg::Header header;
99 header.stamp = pointCloudRawPair->first;
100 msgObstacle->header = header;
102 float sizeX, sizeY, sizeZ;
103 for(uint32_t i = 0; i < objectsVec.size(); i ++){
104 sizeX = std::fabs(objectsVec.at(i).get_max_dimensions().x - objectsVec.at(i).get_min_dimensions().x);
105 sizeY = std::fabs(objectsVec.at(i).get_max_dimensions().y - objectsVec.at(i).get_min_dimensions().y);
106 sizeZ = std::fabs(objectsVec.at(i).get_max_dimensions().z - objectsVec.at(i).get_min_dimensions().z);
110 msgObstacle->obstacles.back().pos_x = objectsVec.at(i).get_center_point().x;
111 msgObstacle->obstacles.back().pos_y = objectsVec.at(i).get_center_point().z;
112 msgObstacle->obstacles.back().width = 0.2;
115 log(
"object ", std::to_string(objectsVec.at(i).get_center_point().x),
" : ", std::to_string(objectsVec.at(i).get_center_point().y),
" : ", std::to_string(objectsVec.at(i).get_center_point().z),
" | SIZE: ", objectsVec.at(i).size,
"\n");
116 log(
"min Dimensions (x | y | z) ", std::to_string(objectsVec.at(i).get_min_dimensions().x),
" | ", std::to_string(objectsVec.at(i).get_min_dimensions().y),
" | ", std::to_string(objectsVec.at(i).get_min_dimensions().y),
"\n");
117 log(
"max Dimensions (x | y | z) ", std::to_string(objectsVec.at(i).get_max_dimensions().x),
" | ", std::to_string(objectsVec.at(i).get_max_dimensions().y),
" | ", std::to_string(objectsVec.at(i).get_max_dimensions().y),
"\n");
118 log(
"object dims (x | y | z): ", sizeX,
" | ", sizeY,
" | ", sizeZ,
"\n");
119 log(
"SIZE Y: ", std::to_string(objectsVec.at(i).get_max_dimensions().y - objectsVec.at(i).get_min_dimensions().y),
"\n");
120 log(
"SIZE Z: ", std::to_string(objectsVec.at(i).get_max_dimensions().z - objectsVec.at(i).get_min_dimensions().z),
"\n");
124 if(msgObstacle->obstacles.size() > 0) {
130 std::unique_ptr<sensor_msgs::msg::PointCloud2> pointCloudMsgUPtr = std::make_unique<sensor_msgs::msg::PointCloud2>();
132 pcl::toROSMsg(*(std::get<1>(*pointCloudRawPair)), *pointCloudMsgUPtr);
133 pointCloudMsgUPtr->header.frame_id =
"map";
134 pointCloudMsgUPtr->header.stamp = pointCloudRawPair->first;
137 std::unique_ptr<sensor_msgs::msg::PointCloud2> pointCloudFilteredMsgUPtr = std::make_unique<sensor_msgs::msg::PointCloud2>();
139 pcl::toROSMsg(*cloudFiltered, *pointCloudFilteredMsgUPtr);
140 pointCloudFilteredMsgUPtr->header.frame_id =
"map";
141 pointCloudFilteredMsgUPtr->header.stamp = pointCloudRawPair->first;
144 std::unique_ptr<sensor_msgs::msg::PointCloud2> pointCloudDetectedObjectsUPtr = std::make_unique<sensor_msgs::msg::PointCloud2>();
146 pcl::PointCloud<pcl::PointXYZ>::Ptr allObjectsCloudPtr(
new pcl::PointCloud<pcl::PointXYZ>);
148 for (
auto pclPtr : *detectedObjectsVecSPtr) {
149 *allObjectsCloudPtr += *pclPtr;
152 pcl::toROSMsg(*allObjectsCloudPtr, *pointCloudDetectedObjectsUPtr);
153 pointCloudDetectedObjectsUPtr->header.frame_id =
"map";
154 pointCloudDetectedObjectsUPtr->header.stamp = pointCloudRawPair->first;
189 log(
"[RealSenseNode] NEW PARAMETERS");
191 rcl_interfaces::msg::SetParametersResult result;
192 result.successful =
true;
196 for (
const auto ¶m: parameters) {
197 if (param.get_name() ==
"cluster_extraction.leaf_size") {
198 if(check_parameter<double>(param, result)) {
202 else if (param.get_name() ==
"cluster_extraction.cluster_tolerance") {
203 if(check_parameter<double>(param, result)) {
207 else if (param.get_name() ==
"cluster_extraction.cluster_size_min") {
208 if(check_parameter<int>(param, result, 0)) {
212 else if (param.get_name() ==
"cluster_extraction.cluster_size_max") {
213 if(check_parameter<int>(param, result, 0)) {
227 else if (param.get_name() ==
"postprocessing.object_min_size_x") {
228 if(check_parameter<double>(param, result, 0, 100)) {
232 else if (param.get_name() ==
"postprocessing.object_min_size_y") {
233 if(check_parameter<double>(param, result, 0, 100)) {
237 else if (param.get_name() ==
"postprocessing.object_min_size_z") {
238 if(check_parameter<double>(param, result, 0, 100)) {
242 else if (param.get_name() ==
"postprocessing.object_max_size_x") {
243 if(check_parameter<double>(param, result, 0, 100)) {
247 else if (param.get_name() ==
"postprocessing.object_max_size_y") {
248 if(check_parameter<double>(param, result, 0, 100)) {
252 else if (param.get_name() ==
"postprocessing.object_max_size_z") {
253 if(check_parameter<double>(param, result, 0, 100)) {
257 else if (param.get_name() ==
"postprocessing.cluster_size_min") {
258 if(check_parameter<int>(param, result, 0, 1000000)) {
262 else if (param.get_name() ==
"postprocessing.cluster_size_max") {
263 if(check_parameter<int>(param, result, 0, 1000000)) {
268 result.successful =
false;
269 result.reason +=
"[" + param.get_name() +
"] UNKNOWN param or NOT IMPLEMENTED; ";
275 if(result.successful ==
false) {
276 log_warning(
"[RealSenseNode] Failed to set some parameters. Reasons: ", result.reason);
279 log(
"[RealSenseNode] NEW PARAMETERS PROCESSED");