用户您好,请详细描述您所遇到的问题。
1.硬件获取渠道:代理采购
2.当前系统镜像版本:1.1.6
3.当前天工开物版本:
4.问题定位:
目前定位到的现象是:
创建订阅的进程,如果是直接继承rclcpp::Node 类似
class HobotCodec : public rclcpp::Node
this->create_subscription_hbmem<hbm_img_msgs::msg::HbmMsg1080P>(in_sub_topic_, PUB_QUEUE_NUM, std::bind(&HobotCodec::in_hbmem_topic_cb, this, std::placeholders::_1));创建的,发布进程异常退出后创建发布占用的ion内存能正常回收。
创建订阅的进程,如果是类似
auto nh = std::make_sharedrclcpp::Node\(“websocket”);-
websocket::Websocket web_socket(nh);
nh_->create_subscription_hbmem<hbm_img_msgs::msg::HbmMsg1080P>( image_topic_name_,10,std::bind(&Websocket::OnGetJpegImageHbmem, this, std::placeholders::_1));
这样的 。发布进程异常退出后创建发布占用的ion内存不能正常回收。
5.开发的demo/案例:
6.需要提供的解决方案:
zhuk
2
第二个方式有两个问题:
1、应该创建websocket子类对象,除了基类node中的成员,websocket类中新增成员的访问都是存在风险的。
2、按照ros2的标准使用方式,create subscriber业务逻辑应该直接在node中实现。
第1点,没大看明白,应该创建websocket子类对象是指就算不直接继承node,也要间接继承?新增成员访问存在风险也没大明白什么意思。-
第2点,设计上就是类似你们websocket的例子,因为进程接收和发布不同的消息,就分在不同的模块里面去创建接收和发布,只创建一个node传进去。不知道这种场景下,标准ros2是怎么设计的。
zhuk
4
1、Websocket是rclcpp::Node的子类吗?
auto nh=std::make_sharedrclcpp::Node\(“websocket”);
websocket::Websocket web_socket(nh);
2、创建的node传给什么做什么处理?按照ros2的标准使用方式,每个node都是一个功能独立的模块,创建好之后送给调度器管理就可以了。
Websocket不是rclcpp::Node的子类,创建的node传递给Websocket类,在Websocket类里,用传递的node创建订阅,如:nh_->create_subscription_hbmem<hbm_img_msgs::msg::HbmMsg1080P>(image_topic_name_,10,std::bind(&Websocket::OnGetJpegImageHbmem,this,std::placeholders::_1));
这里的nh_就是创建的node以参数形式传递到Websocket类里的
node没有做释放,就是和创建子类使用的一样,Node作为参数传递到其他类里后,做spin操作,如图:
上面截图的 AiotNode 类就是 rclcpp::Node 的子类,这个类里的析构函数是可以正常调用的