最近在学习自动驾驶相关的内容,所有的学习和开发是基于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节点文件的部分代码
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.举一反三
这个引用类的方法可以用于解决上述具体的问题,可以来解决变量在两个文件中使用的问题
这个办法或许并不巧妙,但是提供了一个思路,如果有其他的方法,欢迎各位大佬来讨论!
如果文章有错误的地方,感谢各位的斧正!!!