Usb camera

How can i use GRIP to make the robot auto allign with a usb or axis camera?

Sample code?

The quick and easy way to align is to just turn until the target is in the center of the frame.
I’m not familiar with GRIP, but there should be a function that gives you the center of the object you are looking at.
Initially we tried using PID for alignment but the inherent issues with our robot’s large drive dead zone and the lag in vision processing drove us to ditch pid and do our own two-phase constant rate turn.
First, we turn quickly until the target is within 20% around the center. Then, we turn slowly until we just pass the target and immediately stop there. This results in pretty decent alignment.

Here’s some psuedocode for you


slow_zone = 0.2
slow_speed = 0.5
fast_speed = 1
repeat until (error = abs(target_center - image_width / 2)) < acceptable_error
  sign = target_center > image_width / 2 ? -1 : 1 // which direction to turn
  if error < slow_zone
    arcadedrive(0, slow_speed * sign)
  else
    arcadedrive(0, fast_speed * sign)
end

Good luck implementing this!

Here is a grip file to help you get started.
It does a half decent job of detecting targets. You might want to play around with contour areas and rgb stuff.

I also uploaded some sample picture that you might want to play around with it.
Use network tables to use it in the java code

Robotics.zip (4.67 MB)


Robotics.zip (4.67 MB)

I found that using the vision to directly control a motor was too slow. By using a gyro, I calculated (roughly) the angle needed to rotate so that the center of the target was on the center of the camera’s vision.

The calculation was:

arctan([Distance of center target to center vision] / [Constant])

The constant is just a value that I found through experimentation (around 300, may be different for you). This method only works if you have a gyroscope because I then took that calculated angle and plugged it into a PID loop to rotate the robot based on a gyro reading.

I had some success with this in autonomous by performing this operation twice.