You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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相关逻辑时程序可正常执行,无上述报错,功能正常运行效果如下:
ArUco坐标轴绘制正常运行效果

故障原因

ROS Melodic默认在环境变量中预置了自带的OpenCV 3.2版本Python库路径,运行ROS节点时Python解释器会优先加载该低版本cv2库。该版本的ArUco模块与自行安装的OpenCV 4.5.5版本API存在差异,不存在drawAxis属性,因此触发属性不存在的报错。非ROS环境下不会加载ROS预置的库路径,因此能正常导入自行安装的OpenCV 4.5.5,功能运行正常。

解决步骤
  1. 验证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
  1. 多版本兼容适配:若调整路径后仍存在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.03 00:09:38