Author Topic: GBOT90 Balancing Bot Demos Dirty Martini Test with PID Control  (Read 3202 times)

0 Members and 1 Guest are viewing this topic.

Offline liam.srTopic starter

  • Beginner
  • *
  • Posts: 6
  • Helpful? 0
A previous post on the subject of GBOT with PID control was intended to make and learn the hardware and software aspects of microcontrollers with control systems. I used that experience to extend the GBOT into a 5 foot balancing robot using the same system. I added an aluminum frame, disabled the forward looking IR range sensors and added a new GP2D120 IR sensor for pitch control. The result is the GBOT90 shown in the link below.

Noise and resolution was an issue but manageable. The Vref was set to 3.0V to improve resolution. No gyros and no acceleromenters were used, just the single GP2D120 IR range sensor for pitch rate & angle measurements. I used the same PID control system from the GBOT but updated the gains. Proportional and integral gains were much higher. Integral gain was highest.

GBOT90 Balancing Ground Bot with PID Control

Offline madsci1016

  • Contest Winner
  • Supreme Robot
  • ****
  • Posts: 1,450
  • Helpful? 43
    • Personal Website
Re: GBOT90 Balancing Bot Demos Dirty Martini Test with PID Control
« Reply #1 on: March 25, 2010, 08:28:16 PM »
With a high I gain, how are you handling I term system wind-up?

What motors are you using, and do have any measurements on how much current is flowing to them as it balances?

What frequency is the loop running?

Also, less important but I'm curious, the martini test seemed to cut away awful quickly? how long did it hold up the martini? Did it ever spill?
« Last Edit: March 25, 2010, 08:42:36 PM by madsci1016 »

Offline liam.srTopic starter

  • Beginner
  • *
  • Posts: 6
  • Helpful? 0
Re: GBOT90 Balancing Bot Demos Dirty Martini Test with PID Control
« Reply #2 on: March 25, 2010, 10:21:31 PM »
Wind-up algorithm:  the error*dt summation is set to zero after reaching a certain value.  Wind-up has only been an issue if I push the bot really hard.  The motor/wheel system is not responsive enough to handle large disturbances.  The error*dt summation accumulates rapidly.  This can be mitigated with larger diameter wheels.  The Tamiya 72101 geared-motors (7.2V, 12A stall) can handle the additional torque.  The motor driver (Pololu VNH2SP30) outputs current measurements, but I do not use those.

The program loops at approximately 100Hz.  I could use the ZX-40n native device for 2,000Hz processing speed, but 100Hz is more than adequate for this bot.  And actually, the IR range sensor is the weakest link.  Its update rate is 25Hz; still adequate.

About the Martini... I'm happy to report that not a drop was spilled.  As you can see in the video, the GBOT90 drifted away with the drink.  So I intervened and grabbed the glass to avert a catastrophe.  Then the bot drifted back as if it wanted the Martini back.  I cut that scene out because it comprimised my identity.  Sorry.  I plan to add a forward looking sensor (either IR or ultra-sonic) to track an object and maintain position.

Overall, I was surprised that Integral control was so critical for graceful responses.  Mostly PD control results in a jitter system, but very little drift.
« Last Edit: March 25, 2010, 10:24:59 PM by liam.sr »

Offline liam.srTopic starter

  • Beginner
  • *
  • Posts: 6
  • Helpful? 0
Re: GBOT90 Balancing Bot Demos Dirty Martini Test with PID Control
« Reply #3 on: April 25, 2010, 12:57:00 AM »
I'm interested in improving the IR range sensor noise with a Kalman filter. I've tried using running averages and butterworth filtering, and although they improve the system, I think more can be done. Anyone have a good primer on Kalman filters? Thanks.

Offline corrado33

  • Supreme Robot
  • *****
  • Posts: 611
  • Helpful? 11
Re: GBOT90 Balancing Bot Demos Dirty Martini Test with PID Control
« Reply #4 on: April 25, 2010, 08:36:51 AM »
That's very cool!  What are your plans for it?  Did you just want to create a balancing robot just for the heck of it?

 


Get Your Ad Here

data_list