new_learn: std::make_shared

博客围绕std::make_shared能否替代new展开探讨,涉及C++编程中这两种创建对象方式的相关内容。

std::make_shared

 

instead of new?

 

#include <chrono> #include <functional> #include <memory> #include "rclcpp/rclcpp.hpp" #include "std_srvs/srv/trigger.hpp" #include "geometry_msgs/msg/pose_stamped.hpp" using namespace std::chrono_literals; class ShelfDetector : public rclcpp::Node { public: ShelfDetector() : Node("shelf_detector") { // 创建服务响应上位机请求 service_ = create_service<std_srvs::srv::Trigger>( "detect_shelf", std::bind(&ShelfDetector::handle_detect_request, this, std::placeholders::_1, std::placeholders::_2)); // 创建货架位姿发布者 pose_publisher_ = create_publisher<geometry_msgs::msg::PoseStamped>("shelf_pose", 10); RCLCPP_INFO(get_logger(), "Shelf Detector ready. Waiting for detection request..."); } private: void handle_detect_request( const std::shared_ptr<std_srvs::srv::Trigger::Request> request, std::shared_ptr<std_srvs::srv::Trigger::Response> response) { (void)request; // 避免未使用参数警告 RCLCPP_INFO(get_logger(), "Received detection request. Starting shelf detection..."); // 模拟检测过程(实际应替换为真实检测逻辑) bool detection_success = false; auto start_time = now(); rclcpp::Rate loop_rate(10); // 10Hz检测频率 // 循环等待检测结果(最多5秒) while (rclcpp::ok() && (now() - start_time) < 5s) { // 模拟检测逻辑(真实场景使用传感器数据) if ((now() - start_time) > 2s) { // 2秒后"检测到"货架 detection_success = true; break; } RCLCPP_INFO_THROTTLE(get_logger(), *get_clock(), 500, "Detecting shelf..."); loop_rate.sleep(); } if (detection_success) { // 发布检测到的货架位姿 auto pose = geometry_msgs::msg::PoseStamped(); pose.header.stamp = now(); pose.header.frame_id = "map"; pose.pose.position.x = 1.5; pose.pose.position.y = 3.2; pose.pose.orientation.w = 1.0; pose_publisher_->publish(pose); response->success = true; response->message = "Shelf detected at x:1.5, y:3.2"; RCLCPP_INFO(get_logger(), "Detection succeeded. Pose published."); } else { response->success = false; response->message = "Detection timeout"; RCLCPP_ERROR(get_logger(), "Detection failed!"); } } rclcpp::Service<std_srvs::srv::Trigger>::SharedPtr service_; rclcpp::Publisher<geometry_msgs::msg::PoseStamped>::SharedPtr pose_publisher_; }; int main(int argc, char **argv) { rclcpp::init(argc, argv); auto node = std::make_shared<ShelfDetector>(); rclcpp::spin(node); rclcpp::shutdown(); return 0; }基于该段代码,扩充将laserscan转换为pointcloud后重新发布,并通过订阅转换后的点云在rviz中查看,增加实时位姿/fusion_pose的订阅,并将最近位姿存储即latest_pose = *msg,增加收到客户端调用时先回复收到请求,然后performShelfDetection计算货架中心位姿并发布,订阅后在rviz中可视化
06-17
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值