# 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