Lompat ke konten Lompat ke sidebar Lompat ke footer

Simulasi Dynamic Diferential Wheel Mobile Robot dengan C#


Sebelum memasuki apa itu dinamik dan persamaannya, maka perlu diketahui selain dinamik ada persamaa kinematic juga. Dimana pengertian dari kinematika dan dinamika adalah sebagai berikut
:
Kinematika = bagian fisika yang mempelajari gerak benda tanpa meninjau penyebab geraknya, jika di dalam robot dapat dikatakan robot hanya menggunakan reference/ referensi saja untuk bergerak baik itu secara local maupun global.

Dinamika = bagian fisika yang mempelajari gerak benda dengan mengetahui penyebab geraknya.

Dimana kedua Persamaan tersebut jika diterapkan didalam sebuah robot akan menghasilkan gerakan robot yang stabil dengan error yang bisa dikontrol.

Apabila Dinamika lebih bisa untuk mengontrol posisi dan kecepatan maka dinamika lebih berfungsi untuk meningkatkan kekokohan terhadap gangguan dari luar benda ( dalam hal ini : robot).


Namun disini Jufrika Blog hanya akan membahas pemanfaatan persamaan dinamik, bagaimana menerapkanna dalam sebuah program dan disimulasikan dalam bentuk grapich di C#.

Persamaan Dinamika dan Analisisnya

Untuk membuat robot memiliki persamaan dynamic tentu kita harus mengetahui seluruh komponen gaya yang ada dalam robot tersebut. Seperti Momen Inersia, Masa, Torsi, Radius mobile robot dan rodanya untuk mendapatkan kecepatan linear dan angular yang stabil.

Pendekatan Euler-Langrange

Parameter yang digunakan

Torsi untuk roda masih dimasukan secara manual melalui trackba.

Torsi Roda Kiri dan Kanan (Input)
Serta outputnya berupa Velocity (V) dan Angular Robot (W) terhadap waktu. Sehingga Rumus Euler-Langrange untuk persamaan dynamic nya ialah :

 atau bisa ditulis dalam bentuk diferential 




Setelah kita sudah mengetahui persamaannya kita bisa mensimulasikannya dengan aplikasi C#, VB, Phyton atau bahasa pemrograman lain yang kita bisa. Namun disini Jufrika Blog akan menjelaskan serta memberikan demo aplikasinya menggunakan C#, Seperti dibawah ini

Untuk membuat mobile robot maju, belok kiri, belok kanan, maupun mundur, maka dtentukan perubahan torsi roda kiri dan kanan dan keularannya berupa kecepatan linear robot (V) dan angular robot (W) yang terlihat pada chart W(t) dan V(t)

Hasil Simulasi

Roda Kiri(tL) dan Kanan (Tr) diberikan torsi 0 maka tidak ada pergerakan robot (robot dalam keadaan diam) seperti berikut : 

Hasil Simulasi Diferential Mobile Robot Dynamic
Hasil Simulasi Ketika Robot Diam


Ketika Roda kanan diberikan torsi 1 dan roda kiri diberikan torsi -1 maka robot akan maju.


Hasil Simulasi Ketika Robot Maju
 Sisa nya bisa sobat coba sendiri untuk membuat sobat lebih paham lagi.



Reminder : Pada aplikasi menggunakan parameter Momen Inersia kasing robot serta rodanya, massa robot dan rodanya, radis kasing dan rodanya.





Baris Source Code

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace dynamic_differential
{
    public partial class Form1 : Form
    {
        // Variable Yang Digunakan
        ///
        /// Rc = Radius Chasses : Jarak Antara 2 Wheel
        /// Rw = Radius Roda
        /// Izz= Momen Inersia Kerangka
        /// Iw = Momen Inersia Roda    
        /// Mc = Massa Kerangka
        /// Mw = Massa Roda
        /// wL = Kecepatan Putaran Roda Kiri / Left
        /// wR = Kecepatan Putaran Roda Kanan / Right
        /// v  = Robot Linear + Maju - Mundur
        /// w  = Angular Velocity
        /// tL dan tR = Torsi Roda Kiri dan Kanan
        ///
        double r_c, m_c, I_zz;
        double r_w, m_w,  I_w;
        double wL, wR;
        double tL, tR;
        double v,w;
        float cnt=0; //timer state timer t=0 t=1 dst

        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            tL_v();
            tR_V();
            r_c = double.Parse(text_r_c.Text);
            m_c = double.Parse(text_m_c.Text);
          
            r_w = double.Parse(text_r_w.Text);
            m_w = double.Parse(text_m_w.Text);
          
        }

        private void button1_Click(object sender, EventArgs e)
        {
            r_c = double.Parse(text_r_c.Text);
            m_c = double.Parse(text_m_c.Text);
           
            r_w = double.Parse(text_r_w.Text);
            m_w = double.Parse(text_m_w.Text);
            I_w = (m_w * r_w * r_w) / 2;
            I_zz = (m_c*r_c*r_c)/2;
            text_I_zz.Text = I_zz.ToString();
            text_I_w.Text = I_w.ToString();
            chart1.Series["v(t)"].Points.Clear();
            chart1.Series["w(t)"].Points.Clear();
            cnt = 0;
            timer1.Start();
           
        }

        private void timer1_Tick(object sender, EventArgs e)
        {
            hitung_semua();
            chart1.Series["v(t)"].Points.AddXY(cnt, v);
            chart1.Series["w(t)"].Points.AddXY(cnt, w);
            cnt =cnt++;
           
        }
       

        void hitung_semua()
        {
            wL = hitung_wL(); //hitung Angular W
            wR = hitung_wR();
            v = hitung_v();
            w = hitung_w();


            hitung_v();
            hitung_w();

            label9.Text = v.ToString();
            label10.Text = w.ToString();
        }

        double hitung_v() //velocity
        {
            double hasil;
            hasil = (0.5 * r_w * wL) + (0.5 * r_w * wR); // 0.5 x radius roda x kecepatan putar roda kanan + 0.5 radius roda x kec putar roda kiri
            return hasil;
        }
        double hitung_w() //angular
        {
            double hasil;
            hasil = (r_w * wR - r_w * wL) / (r_c); //radius roda x keceparan roda kanan - radius roda x kecepatan roda kiri / radius casing
            return hasil;
        }

        double hitung_wL()
        {
            double hasil, pembilang, penyebut;
            pembilang =  ((r_c * r_c * m_c * r_w * r_w * tL) - (r_c * r_c * m_c * r_w * r_w * tR) + (4 * r_c * r_c * m_w * r_w * r_w * tL) +
                        (4 * r_c * r_c * I_w * tL) + (4 * I_zz * r_w * r_w * tL) + (4 * I_zz * r_w * r_w * tR));
            penyebut = (r_c * r_c * m_c * Math.Pow(r_w, 4) * m_w) + (r_c * r_c * m_c * r_w * r_w * I_w) + (2 * r_c * r_c * m_w * m_w * Math.Pow(r_w, 4)) +
                        (4 * r_c * r_c * m_w * r_w * r_w * I_w) + (2 * r_c * r_c * I_w * I_w) + (2 * I_zz * Math.Pow(r_w, 4) * m_c) +
                        (4 * I_zz * Math.Pow(r_w, 4) * m_w) + (4 * I_zz * r_w * r_w * I_w);
            hasil = 0.5 * (pembilang / penyebut);
            return hasil;
        }

        double hitung_wR()
        {
            double hasil, pembilang, penyebut;
            pembilang = ((4*I_zz*r_w*r_w*tL) + (4*I_zz*r_w*r_w*tR) - (r_c*r_c*m_c*r_w*r_w*tL) +
                        (4 * I_w*r_c*r_c*tR) + (4 *m_w*r_w*r_w*r_c*r_c*tR) + (r_c*r_c*m_c*r_w*r_w*tR));
            penyebut = (r_c * r_c * m_c * Math.Pow(r_w, 4) * m_w) + (r_c * r_c * m_c * r_w * r_w * I_w) + (2 * r_c * r_c * m_w * m_w * Math.Pow(r_w, 4)) +
                        (4 * r_c * r_c * m_w * r_w * r_w * I_w) + (2 * r_c * r_c * I_w * I_w) + (2 * I_zz * Math.Pow(r_w, 4) * m_c) +
                        (4 * I_zz * Math.Pow(r_w, 4) * m_w) + (4 * I_zz * r_w * r_w * I_w);
            hasil = 0.5 * (pembilang / penyebut);
            return hasil;
        }


       

        private void trackBar_tL_Scroll(object sender, EventArgs e)
        {
            tL_v();
            hitung_semua();
          
        }
        private void trackBar_tR_Scroll(object sender, EventArgs e)
        {
            tR_V();
            hitung_semua();
           
        }
        void tL_v()
        {
            double t_L;
            tL = (trackBar_tL.Value)/100;
            t_L = -tL;
            label12.Text = t_L.ToString();
        }

        void tR_V()
        {
           
            tR = (trackBar_tR.Value)/100;
           
            label13.Text = tR.ToString();
        
        }


       
        private void button2_Click(object sender, EventArgs e)
        {
            timer1.Stop();
        }
       
       
    }
}


 

Pada program belum dapat diterapkan langsung ke robot, mengapa? Karna pada dasarnya untuk membuat roda bergerak memerlukan motor untuk mendpatkan torsi yang diinginkan secara otomatis, sehingga perlu dikembangkan lagi. Namun untuk simulasi sudah berjalan cukup baik.

Sekian sobat Jufrika Blog semoga bermanfaat bagi robot sobat. Nantikan artikel menarik lainnya seputar robot dan elektronika hanya di Jufrika Blog.
to close