ROS2学习|订阅节点处理后再以节点形式发布,解决变量在两个文件中使用的问题(中间解决了python引用自定义类ModuleNotFoundError: No module named的问题)

最近在学习自动驾驶相关的内容,所有的学习和开发是基于ROS2。介于之前自己的ROS基础并不牢固,在ROS2的学习中也碰了很多壁,遇到了一些对于熟练的人来说很常规,但是自己需要花好几个小时来解决的问题。感谢身边的大佬能引导我解决这些问题!
在这里既是做一个学习记录,也是做一个分享,希望能帮助到有同样问题的你。

1.问题描述

!!!如果是要解决python引用自定义类ModuleNotFoundError: No module named的问题,可以直接看 3.2.1
在自动驾驶中,有一个研究板块是多传感器融合,涉及到多种传感器的数据读取。目前已经实现了imu、LiDAR原始数据的读取,并通过录包的方式把对应节点的数据保存下来(其中imu数据对应的节点为/imu),并已完成对/imu的订阅。现在希望实现处理后的数据再次发布出来,但是将变量从一个文件传到另一个文件似乎很麻烦。

2.解决思路

利用引用类的方法,即将发布节点的类引用到订阅和处理节点的文件中,让发布节点作为一个方法,在处理订阅得到的数据时就实现了
可能说的比较抽象,我们来看看实际的例子吧

3.具体处理过程

3.1 创建发布处理后imu数据的节点

在这里插入图片描述其中,x_angle,y_angle,z_angle,x_linear,y_linear,z_linear,q0,q1,q2,q3,这些数据对应的是处理后的imu数据,这些数据目前在另外一个处理/imu的文件中,我们不方便直接调取。

3.2 引用发布信息的类

为了解决数据共用(不知道这样描述是否准确,大概的意思就是这些变量要在两个文件中使用)的问题,我们需要在处理/imu数据的文件中去引用发布信息的类,使得在处理后的数据可以输入到发布节点的类中,然后实现发布。
订阅并处理/imu节点文件的部分代码
上图是订阅并处理/imu节点文件的部分代码

3.2.1 引用自定义类
import sys,os
BASE_DIR = os.path.dirname(os.path.abspath(__file__))
sys.path.append(BASE_DIR)

from imu_fliter_node import IMUPublisher

注意,如果直接引用

from imu_fliter_node import IMUPublisher

会报错误如下

ModuleNotFoundError: No module named 'imu_fliter_node'

错误显示找不到模块的位置,那么如何来解决这个问题呢?这时我们就需要加入这段代码,这段代码的意义就是帮助系统找到这个模块的位置

import sys,os
BASE_DIR = os.path.dirname(os.path.abspath(__file__))
sys.path.append(BASE_DIR)
3.2.2 实例化类并使用类的方法
 k = IMUPublisher() #实例化
 k.timer_callback(x_angle,y_angle,z_angle,x_linear,y_linear,z_linear,m.q0,m.q1,m.q2,m.q3)

3.3.运行

这个时候,你就会发现,我们实现了处理/imu节点,也实现了处理后数据的发布

4.举一反三

这个引用类的方法可以用于解决上述具体的问题,可以来解决变量在两个文件中使用的问题

这个办法或许并不巧妙,但是提供了一个思路,如果有其他的方法,欢迎各位大佬来讨论!
如果文章有错误的地方,感谢各位的斧正!!!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值