Monday, November 28, 2016

Drift Correction: Kinect IMU Data

We are attempting to correct "drift" that the copter experiences after take-off.  One idea is to use the highly synthesized data from the Kinect's odometry.  We pulled odom data from the Kinect using ratabmap_ros, then simulated movement along the x and y axes that is similar to what we are experiencing in flight:
By subscribing to the Kinect's pose, we should be able to adjust pitch and roll in our flight script to hold the vehicle's position.

Tuesday, November 22, 2016

Recording Flights From MultiWii

We are using PyMultiwii to record data as we fly:

while(True):
    self.board.getData(MultiWii.RC) s = str(self.board.rcChannels['roll']) + ", " + str(self.board.rcChannels['pitch']) + ", " + str(self.board.rcChannels['yaw']) + ", " + str(self.board.rcChannels['throttle'])
    with open("data.txt", "a") as myfile:
        myfile.write(s + "\n")
    time.sleep(0.05)


We now have some data from a take-off at a frequency of 20Hz:

    [roll],[pitch],[yaw],[throttle]
  1501, 1503, 1511, 1331
  1501, 1503, 1511, 1339
  1501, 1503, 1511, 1347
  1501, 1503, 1511, 1359
  1501, 1503, 1511, 1367
  1501, 1503, 1511, 1371
  1501, 1503, 1511, 1384
  1501, 1503, 1511, 1390
  1501, 1503, 1511, 1397
  1501, 1503, 1511, 1411
  1501, 1503, 1511, 1431
  1501, 1503, 1511, 1439
  1501, 1503, 1511, 1447
  1501, 1503, 1511, 1456
  1501, 1503, 1511, 1462
  1501, 1503, 1511, 1465
  1501, 1503, 1511, 1468
  1501, 1503, 1511, 1478
  1501, 1503, 1511, 1478
  1501, 1503, 1511, 1478
  1501, 1503, 1511, 1481
  1501, 1503, 1511, 1487
  1501, 1503, 1511, 1490
  1501, 1503, 1511, 1490
  1501, 1503, 1511, 1490
  1501, 1503, 1511, 1490
  1501, 1503, 1511, 1492
  1501, 1503, 1511, 1492
  1501, 1503, 1511, 1492
  1501, 1503, 1511, 1492
  1501, 1503, 1511, 1492
  1501, 1503, 1511, 1492
  1501, 1503, 1511, 1492
  1501, 1503, 1511, 1492
  1501, 1503, 1511, 1492
  1501, 1503, 1511, 1492
  1501, 1503, 1511, 1492
  1501, 1503, 1511, 1492
  1501, 1503, 1511, 1492
  1501, 1503, 1511, 1492
  1501, 1503, 1511, 1492
  1501, 1503, 1511, 1492
  1501, 1503, 1511, 1492
  1501, 1503, 1511, 1492
  1501, 1503, 1511, 1492
  1501, 1503, 1511, 1492
  1501, 1503, 1511, 1492
  1501, 1503, 1511, 1492
  1501, 1503, 1511, 1492
  1501, 1503, 1511, 1492
  1501, 1503, 1511, 1492
  1501, 1503, 1511, 1492
  1501, 1503, 1511, 1492
  1501, 1503, 1511, 1492
  1501, 1503, 1511, 1492
  1501, 1503, 1511, 1492
  1501, 1503, 1511, 1492
  1501, 1503, 1511, 1492
  1501, 1503, 1511, 1492
  1501, 1503, 1511, 1492
  1501, 1503, 1511, 1492
  1501, 1503, 1511, 1492
  1501, 1503, 1511, 1492
  1501, 1503, 1511, 1492
  1501, 1503, 1509, 1492
  1501, 1503, 1496, 1492
  1501, 1503, 1484, 1492
  1501, 1503, 1467, 1492
  1501, 1503, 1445, 1492
  1501, 1503, 1425, 1492
  1501, 1503, 1417, 1492
  1501, 1503, 1415, 1492
  1501, 1503, 1404, 1494
  1501, 1503, 1399, 1500
  1501, 1503, 1394, 1505
  1501, 1503, 1394, 1505
  1501, 1503, 1394, 1505
  1501, 1503, 1401, 1509
  1501, 1503, 1408, 1515
  1501, 1503, 1408, 1517
  1501, 1503, 1408, 1517
  1501, 1503, 1408, 1517
  1501, 1503, 1408, 1517
  1501, 1503, 1408, 1517
  1501, 1503, 1408, 1517
  1501, 1503, 1408, 1517
  1501, 1503, 1408, 1517

This is a graph of the data for the 20 second:

Between two and four seconds, the yaw goes to 1800 which arms the copter, by the sixth second the throttle is at it's MINTHROTTLE, 1350, and we are increasing the throttle.  We take-off at about eight seconds.

This is the take-off in greater detail:

Friday, November 18, 2016

CRIUS AIOP v2 Sensor Config

Problem: Slow reaction to change in yaw; copter rocks back and forth, shakes before take-off, change in mode has no affect.

Solution:  Manually configure the orientation of the sensors for the MultiWii (config.h; line ~200):

#define FORCE_ACC_ORIENTATION(X, Y, Z){imu.accADC[ROLL]  =  -X;
                                                                      imu.accADC[PITCH]  = -Y;
                                       imu.accADC[YAW]  = Z;}

#define FORCE_GYRO_ORIENTATION(X, Y, Z)
{imu.gyroADC[ROLL] = Y;
                                        imu.gyroADC[PITCH] =  -X; 
                                        imu.gyroADC[YAW] = -Z;}


#define FORCE_MAG_ORIENTATION(X, Y, Z){imu.magADC[ROLL]  =  X;
                                       imu.magADC[PITCH]  =  Y; 
                                       imu.magADC[YAW]  = -Z;}


Monday, November 7, 2016

Kinect Tutorial

NOTE before starting: I have not done a top to bottom run of this yet. I will be doing it soon though to double check. There may be some things that I left out because I am not a perfect note taker. Just waiting for another SD card so I can do the install without wasting my current progress.

Install Ubuntu 16.04 Xenial on the Pi

Ok, lets do this. First we need to download the image for the Pi. I am betting this will work with the Pi 2 as well but I only tested it on the Pi 3.Here are some links to some of the Pi images:
I used an Ubuntu Laptop to format the SD card and write the image to it. But here is the tutorials from the Raspberry Pi foundation:
Now boot up the raspberry pi. If you used the image from Ryan Finnie, the username/password is ubuntu. You will be prompted to change the password so remember what you change it to.

Install ROS (Kinetic Distro)

We have some updates first


Then install ROS and setup your work space


Install Some ROS Packages

ROS has some packages that you can now install via apt. Here are the ones that I installed to work with the kinect and a few others that are useful as well

I had to reboot after this as well.

Using Your Kinect With ROS

Now we can use ROS. If you are confused on how ROS works, the wiki is great at explaining things but is a little more in depth. I am bad at explaining things but can explain it in a dumb easy to understand way since that is the way I think. I'll put a link to a future post here. I have put together a list of handy commands here to get the kinect up and running in ROS

Here is how you start the core ROS process which will be the "master"

I like to run the process in the foreground and just open a new terminal but that is up to you. In a new terminal you can start the node for the kinect by running

ROS should be publishing topics now. A topic is like a data object or an endpoint of an API. You can see the topics by running You will notice that one of the endpoints is /camera/rgb/image_color. We can look at the RGB image with image_view like so
That should bring up a small window in which you can see what your Kinect sees in RGB. Now you can mess with it and see some other cool stuff as well since the Kinect node publishes several different data types.

Bill of Materials

Works Cited