ROS Melodic下调用aruco.drawAxis报无属性AttributeError问题
问题相关环境
- 操作系统:Ubuntu 18.04
- ROS版本:Melodic
- OpenCV版本:4.5.5
- 实现目标:绘制ArUco标记的三个坐标轴,通过话题发布后在rqt_image_view组件中展示
程序运行时抛出错误:AttributeError: 'module' object has no attribute 'drawAxis'
涉及坐标轴绘制的核心代码片段:
...................... frame_out = aruco.drawAxis( img, self.K, self.distCoeffs, rvecs, tvecs, axisLength) ................... self.aruco_marker_img_pub.publish(self.bridge.cv2_to_imgmsg(frame_out, "bgr8")) .......................
已验证现象:脱离ROS环境单独运行ArUco相关逻辑时程序可正常执行,无上述报错,功能正常运行效果如下:
故障原因
ROS Melodic默认在环境变量中预置了自带的OpenCV 3.2版本Python库路径,运行ROS节点时Python解释器会优先加载该低版本cv2库。该版本的ArUco模块与自行安装的OpenCV 4.5.5版本API存在差异,不存在drawAxis属性,因此触发属性不存在的报错。非ROS环境下不会加载ROS预置的库路径,因此能正常导入自行安装的OpenCV 4.5.5,功能运行正常。
解决步骤
- 验证cv2加载版本:在代码导入cv2的位置后添加如下打印,确认实际加载的cv2版本和路径:
import cv2 print(cv2.__version__) print(cv2.__file__)
如果打印版本为3.2.x、路径指向/opt/ros/melodic/目录下,即可确认是版本冲突导致的问题。
2. 修正导入优先级:在代码最开头(导入cv2、aruco模块之前),将自行安装的OpenCV 4.5.5的Python包路径插入系统路径优先级最高位,确保解释器优先加载正确版本。示例代码如下,路径需要替换为本机OpenCV4的实际安装路径:
import sys # 示例路径为Python3.6默认的OpenCV源码编译安装路径,按本机实际情况调整 sys.path.insert(0, '/usr/local/lib/python3.6/dist-packages') import cv2 import cv2.aruco as aruco
- 多版本兼容适配:若调整路径后仍存在API兼容问题,可增加接口判断,适配不同OpenCV版本的坐标轴绘制逻辑,替换原有
aruco.drawAxis调用代码即可:
if hasattr(aruco, 'drawAxis'): frame_out = aruco.drawAxis(img, self.K, self.distCoeffs, rvecs, tvecs, axisLength) else: frame_out = cv2.drawFrameAxes(img, self.K, self.distCoeffs, rvecs, tvecs, axisLength)
内容的提问来源于stack exchange,提问作者huytd-pi
相关产品推荐
相关产品推荐

