# aruco pose estimation on pi 4 with ROS melodic platform: Canonical official ubuntu-server 18.04 built for armhf/arm64 pi4 :::info ubuntu 20.04 failed. because ubuntu 20.04 is for ROS noetic, and noetic move to python3 (python 2 EOL at 1/1/2020), but cv_bridge uses libpython.boost which don't support python3 ::: :::info ubuntu mate don't have binary image built of 18.04 for pi4 only canonical ubuntu-server has 18.04 built for pi4, but it's server version, so have to install desktop environment manually ::: --- https://cdimage.ubuntu.com/releases/18.04/release/ ubuntu-18.04.5-preinstalled-server-arm64+raspi4.img.xz --- sudo apt install ubuntu-mate-desktop --- ROS apt source & key http://wiki.ros.org/melodic/Installation/Ubuntu ```bash sudo sh -c 'echo "deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main" > /etc/apt/sources.list.d/ros-latest.list' sudo apt-key adv --keyserver 'hkp://keyserver.ubuntu.com:80' --recv-key C1CF6E31E6BADE8868B172B4F42ED6FBAB17C654 sudo apt update ``` --- sudo apt install ros-melodic-desktop-full --- source /opt/ros/melodic/setup.bash (add at the end of ~/.bashrc) --- sudo apt install python-catkin-tools \# for `catkin` command --- all done! rospy & cv_bridge is installed by default! (remember to source ros setup.bash file) --- sudo apt install ros-melodic-usb-cam --- ```python= #!/usr/bin/env python import rospy import sensor_msgs from cv_bridge import CvBridge, CvBridgeError import cv2 import cv2.aruco import numpy as np rospy.init_node('aruco_pose', anonymous=True) tag_dict = cv2.aruco.getPredefinedDictionary(cv2.aruco.DICT_4X4_50) image_pub = rospy.Publisher('image_out', sensor_msgs.msg.Image) bridge = CvBridge() def callback(data): img = bridge.imgmsg_to_cv2(data, 'bgr8') #cv2.imshow('raw', img) #cv2.waitKey(1) (corners, tag_ids, rej_corners) = cv2.aruco.detectMarkers(img, tag_dict) #print(corners) #print(tag_ids, reject_tags) #cv2.aruco.drawDetectedMarkers(img, rej_corners, np.array([]), np.array([255, 255, 0])) cv2.aruco.drawDetectedMarkers(img, corners, tag_ids, np.array([0, 255, 0])) image_pub.publish(bridge.cv2_to_imgmsg(img, 'bgr8')) image_sub = rospy.Subscriber("/usb_cam/image_raw", sensor_msgs.msg.Image, callback) rospy.spin() ``` --- full code: https://github.com/wolfdigit/aruco_pose --- sudo apt install git mkdir -p catkin_ws/src cd catkin_ws/src git clone https://github.com/wolfdigit/aruco_pose.git cd .. catkin build source devel/setup.bash --- tag generator: https://chev.me/arucogen/ --- opencv imshow & waitkey is laggy! use ros imgmsg publish /w image_view instead