tirsdag den 10. juni 2014

Final Project - Lesson 5

Lesson 5



Date: 10/06 2014
Duration of activity: 10.15 - 13.30
Group members participating: Pætur Askildsen, Søren Ditlev and Alexander Rasmussen


Goal

  • Finish the code for the remote controller
  • Rebuild the remote controller to be more sturdy.
  • Make the car inside the tube four-wheel driven.

Plan

Figure out why the remote controlled car only drives forwards even though it is supposed to drive backwards and fix it.
The original remote controller was just a quick mock-up and we want to build a rigid remote control.
During last lesson we experienced that the car inside the tube had difficulties moving when turning upside down. The reason for this is that the car was rear-wheel driven. Therefore we plan to rebuild the car to make it four-wheel driven by adding gears.

Results

Fix the code of the remote controlled car

The problem regarding the remote controller that the NXT started ticking and the program would not start was quickly fixed. The problem was that some variables that should be turned from integers to floats were still integers and was therefore causing problems.
When this problem was fixed the program would run again, but the car would still only drive forwards. This problem was also easily fixed.

Figure 1: Code snippet of if-statement in RCCMain.

The if-statement in figure 1 is the reason why the car would only drive forwards. The problem with the if-statement is that when the speed value is positive the method Car.forward() is called with a positive value and therefore it drives forwards. But if the speed value is negative the method Car.backward() is called with a negative value, this results in a negative speed backwards which is the same as positive speed forwards. This was the reason why the car could only drive forwards. To resolve this the if-statement was removed and replaced with the code snippet i figure 2.

Figure 2: Code snippet of fixed code in RCCMain.

Rebuilding the remote controller and the BT controlled car

After fixing the code we were able to rebuild the BT controlled car so that it is now four wheel driven instead of only rear wheel driven. The four-wheel drive was built using three gears in each side of the car to connect the wheels to each other as it can be seen in figure 3. This gearing made the car able to drive even though it is upside down as the video shows [1]. Meanwhile we rebuilt the remote controlled car, we also rebuilt the remote controller to make it more sturdy. The redesigned remote controller can be seen in figure 4.
Figure 3: The gearing to make the remote controlled car four wheel driven.

Figure 4: The rebuilt remote controller.

Conclusion

We have fixed the problem with the remote controlled car only driving forwards, which now makes it capable of driving both forwards and backwards. The remote controlled car has also been rebuilt, so that it now has four-wheel drive, this is due to the robot not being able keep traction when driving with only front-wheel drive.The remote controller has also been rebuilt.

Plan for next session(s)

Get readings from the gyro and accelerometer. Combine the readings into a complementary filter to conquer the gyro drift.

References

[1] Video of rebuilt car driving inside the tube, http://goo.gl/V1TKIQ

mandag den 2. juni 2014

Final Project - Lesson 4

Lesson 4

Date: 02/06 2014
Duration of activity: 09.15 - 15.45
Group members participating: Pætur Askildsen, Christian Hansen, Søren Gregersen, Søren Ditlev and Alexander Rasmussen


Goal

  • Make the car balance on top of the tube.
  • Finish the remote controller.

Plan
Adjust the code so that the balancing robot only uses the gyro readings and not the tacho counter (we have a hypothesis that the tacho counter is only necessary when the robot, in the LegWay, needs to balance on the floor). Tacho counter may not be needed since we want to make less subtle movements, in order to react on the tubes movements. The PID parameters should also be tuned.

We want to get the remote controller to communicate with the car inside the tube using Bluetooth. Hopefully the remote controller can be finished today.
The steps should be prioritized as follows, so we start out simple:
  1. Make the car balance on top of the tube by itself.
    1. Adjust PID (maybe do this through bluetooth to ease adjustment overhead)
    2. Try removing tacho counter and rely solely on gyro.
  2. When this works, add the remotely controlled car inside the tube to also be in to the setup.
  3. Fine tune the speed of the car inside the tube (the faster it can drive, the more difficult we presume it will be for the TubeBalancingCar to keep balance on top of the tube).

Results

Tube Balancing Robot

The NXC program for the HTWay [1] (HiTechnics legway) does not use a PID controller. They instead use 4 variables to control the two motor powers of the HTWay, which in our example only will be one motor power, since we only have one motor. With their own words:

“To calculate the power these variables are multiplied by respective constants in a four term linear equation, the result being the power needed for the robot to stay balanced. The trick to making this all work, is finding the right constants.” [2].

The 4 variables the NXC program uses to balance the LegWay can be seen here, though translated into Java:

Last time we fed the result of this linear equation into a PID controller. Today we will take one step back, and use this variable directly to control the motor power, instead of, as the variable names says, inputToPID. We want to check that a PID really is necessary for a tube-balancing robot. We will also look at if all 4 parameters are needed.

Fine tuning the four parameters, the non-PID way

First test

We change the parameter tAV, the paramter controlling the influence of the angle velocity, gyroAngleVelocity, from 0,475 to 0,7.

Result: The car still does not react and drive fast enough, not enough motor power, when the car is far around on the tube. This points in the direction that we might need a PID, or at least the Integral term, so the longer the car falls off the tube in one direction, the more speeds it gets. But we try on without a PID.

Second test

As we needed more power, we try out multiplying the power by 2:

int power=  (int) inputToPID * 2;

Result: The car drives faster, but this also makes the tube roll faster. The car can still not get up on the tube again when about to fall off.

Third test

We give the car bigger wheels, from the small ones we started with to the big ones with white inside of wheel.

Result: The same as in the second test. The car can still not get up on the tube again when about to fall off. We also notice and discuss, that since the LegWay uses the tacho counter, it starts driving even when the car seems to be perfectly balanced on top of the tube, or just on the ground and give it a push, and the car drives off. This leads us to our fourth test:

Fourth test

We try to remove the two parameters, motor speed deg/sec and tachocount to only use the gyro. To do this the
private float tPW = 0.042f;
private float tSW = 0.05f
are set to 0 so only the gyroAngle and gyroAngularVelocity are used to calculate the motor power.

After further reading on the HTWay, they also say they use the motorSpeed and motorPosition to keep the robot in place:

So what about the two motor terms? Well if the robot is perfectly upright and not falling but the robot is 100 degrees further forward than desired, in that case motorPos will be 100. [...]  The motorSpeed term works in sort of the the same way as motorPos. [2]

Therefore it was good that we removed those terms, as keeping the robot in place is not the highest priority for our robot. The highest priority is for the robot to stay on the tube. Possible future work could be to determine the feasibility of using a behaviour-based architecture for keeping the robot in place while staying on the tube [3].

Result: The car still drives off, and starts to drive faster and faster when placed on the floor. We conclude therefore that it is not the motor parameters but the gyro sensor which drifts from the initial offset, which makes the car drive off. We need to make up for that either in the build of the robot or the code to deal with gyro drift.

Fifth test - Gyro drift due to motor interruptions?

Søren found from a forum, that if the HiTechnic gyro sensor offset is calibrated when the motor is off, when the motor is turned on the electromagnetic field of the now turned on motor will cause the gyro sensor to drift [4]. To try to fix this, we increase the height of the placement of the gyro sensor on the car, so it hopefully will not get affected by the motor.

Figure 8: The car with the gyro sensor mounted higher.

Another finding on this forum is that when the gyro sensor gets hot it will get different readings and thus drift. We found that turning on the gyro over time it would drift, presumably because it gets hot, but then when it was hot we reset the program thus recalibrating the gyro sensor and then it didn’t start driving when placed on a flat surface, the floor (gyro sensor drifting).

That the motors affect the gyro sensor was already thought of in the code we made last time, as the motor are activated by calling Car.stop() right before the calibration of the gyro sensor:

// Ensure that the motor controller is active since this affects the gyro values.
Car.stop();

However it seems that using Car.stop(); alone does not prevent drift.

Result: Now with the higher placed gyro sensor, finally the car doesn’t run off so immediately when placed on the ground with the same code as when the gyro sensor was placed lower. After a talk with Ole we realized that this however could also just be because we stabilized the gyro sensor more in the LEGO attachment construction than it is the height difference making the gyro sensor more stable. However, when given a push, the car does slowly crawl in one direction, but not as fast and accelerating as before. A conclusion is therefore that the placement of the gyro sensor more stable results in a not so drifting gyro. Some anti-drifting still needs to be implemented though. It is however much better now.

A finding is also that Car.stop() is not a good way to ensure that the motors are active before calibrating the gyro sensor, or that this approach does not fix the gyro drift problem.

The results from this, that we need to conquer gyro drift, is also to take a step back and do some experiments with the gyro sensor. Søren G and Alex were put on this task 11.41.

Now that the tube balancing car does not drive off when placed on the ground, we try again to test it on top of the tube. It however still falls off when the tube starts rolling and accelerating. The car needs to accelerate more.

Sixth test - Fine tuning tAV and tAN and gyro drift

Since the gyro sensor drifts significantly less, while Alex and Søren works on reducing gyro drift Søren and Christian will finetune the two parameters tAV and tAN respectively controlling the influence of the angular velocity and the gyro angle on the power to the motors.

We however, end up with going back to a PID because the car needs much power to avoid falling off the tube but this also happens fast, so the car reacts violently just using a linear equation to power the motors.

We first started out with only a P-controller, and found from (2.0 → 1.0 → 0.5) that kP= 0.5f worked well: the car did not oscillate violently. We then tried to make PI- controller with kP = 0.5f and kI = 0.5f. This made the car drive back and forth quick. We then reduced kI to 0.05f. This was better, but the gyro still drifts.

After writing to the LCD display both the angular velocity and the angle we found that the angle kept increasing.

Remote controller

The remote controller uses the tacho counter and this value from the tacho counter is mapped to speed using the code in figure 9. The spam of the speed is between -100 and 100 which means power of 100% backwards and 100% forwards respectively.
Figure 9: Code snippet of tacho counter mapped to speed

The calculated speed is sent to the car inside the tube using bluetooth communication and today we managed to get the bluetooth communication to work. Even though the spam of the speed was between -100 and 100, and the bluetooth communication worked, the car could only drive forwards even though it was supposed to drive backwards.
The reason why the car only drove forwards could be that the speed was converted from float values to integer values. We tried change the speed value to integer values, so that it never is a float value. This task bigger than expected and it was revoked. Unfortunately something went wrong, the NXT started ticking and the program would not start. This resulted in a little tension and we have to fix it as the first thing next session.

When we tested the remote controller and the remote controlled car inside the tube, we saw that the car would drive until it turned upside down and then it could not move, even assumingly was built to drive upside down. A video of the test can be seen here [5].
The reason that the car does not drive up side down is that it is two-wheel driven.

Conclusion
We have carried out a series of tests to make the robot balance on top of the tube. In this process we discovered a phenomenon called ” gyroscopic drift”. We played a bit around with different things that might affect the gyro drift and made a few configurations to accommodate gyro measurement inaccuracies. Furthermore the remote controller is nearly fully functional, except that it at the moment only drives in one direction.
Plan for next session(s)

  • Work on reducing gyro drift.
  • Fix the remote controller and figure out why the remote controlled car only drives forwards and fix this as well.
  • Rebuild the remote controlled car, so that it is four-wheel driven and can drive upside down.

References
[1] HiTechnic HTWay Version 1.1 code, http://www.hitechnic.com/upload/786-HTWayC.nxc
[2] HiTechnic’s HTWay, http://www.hitechnic.com/blog/gyro-sensor/htway/
[3] http://www.lejos.org/nxt/nxj/tutorial/Behaviors/BehaviorProgramming.htm
[4] http://www.lejos.org/forum/viewtopic.php?f=7&t=4656 
[5] Video of remote controlled driving inside the tube, http://goo.gl/QVqfGO.