程序异常退出,零拷贝方式创建发布占用的ion内存不释放

用户您好,请详细描述您所遇到的问题。

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.需要提供的解决方案:

第二个方式有两个问题:

1、应该创建websocket子类对象,除了基类node中的成员,websocket类中新增成员的访问都是存在风险的。

2、按照ros2的标准使用方式,create subscriber业务逻辑应该直接在node中实现。

第1点,没大看明白,应该创建websocket子类对象是指就算不直接继承node,也要间接继承?新增成员访问存在风险也没大明白什么意思。-
第2点,设计上就是类似你们websocket的例子,因为进程接收和发布不同的消息,就分在不同的模块里面去创建接收和发布,只创建一个node传进去。不知道这种场景下,标准ros2是怎么设计的。

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没有做释放,就是和创建子类使用的一样,Node作为参数传递到其他类里后,做spin操作,如图:

node的析构函数能正常调用吗

上面截图的 AiotNode 类就是 rclcpp::Node 的子类,这个类里的析构函数是可以正常调用的