Home        Store        Learn        Blog

Accurate waypoint navigation with AR tags


We are attempting to use the BlueROV for an underwater manipulation task, with augmented reality tags (ar-track-alvar) to provide localization. For this task, the robot must navigate between several points in [x, y, z, roll, pitch, yaw]-space with high accuracy – 0.1 radian rotational and 3-4 cm translational accuracy would be ideal. The robot is operating inside a 300-gallon tank that is 6’ wide, and it is in the Heavy configuration.

Right now, our code publishes RCOverride messages to control the motors. This works reasonably well, but we have encountered a few problems:

  • It’s hard to get fine-grained control as the robot gets close to a waypoint. We have decreased the PWM values as close as possible to the 1500±25 deadband described in the documentation, but the robot still does not move slowly enough to stabilize at the location with sufficient accuracy.
  • We are controlling the yaw and the xy-position separately, using a Proportional-Derivative (PD) controller. (The z-position controller runs continuously, since it depends on a different set of motors.) We’re having trouble combining these controls without producing jerky motion.

We have a few questions and would greatly appreciate any answers or other feedback you’d care to share:

  • Is anyone else working on a similar project? We have searched the forums for similar questions without success. In this post [1], Jacob Walser mentions that ArduSub already has position and waypoint controllers, but these seem to work only for GPS input, not for the much more accurate augmented-reality tag localization that we’re using. This person [2] seems to be doing something similar, but the post is old and not too detailed.
  • Can we control the motors individually – i.e., at a lower level than the RCOverrides? We were wondering about counter-rotating the motors to allow the yaw to be adjusted more gently, or pulsing the motors. Could we turn the motors on and off at a rate of 5 or 10 times per second?
  • Has anyone else looked into PD controllers for this context? Are there any particular parts of the ArduSub code that we should look at in more detail?

Thank you!

Link references, since new users are limited to 2 links per post:
[1] “Precise meaning of rc_override commands for automatic control”
[2] “Automatic positionint in xyz plane”