-p-formation-control/BAB4/art_metode.tex

108 lines
4.3 KiB
TeX

Penentuan koordinat tentangga dapat ditemukan dengang mengubah koordinat polar menjadi koordinat kartesian.
Koordinat polar membutuhkan panjang $d_a$, dan sudut $\alpha$.
Panjang $d_a$ adalah variable yang didapat dari sensor yang memberikan nilai jarak dari robot $A$ ke robot $B$,
akan tetapi untuk mendapatkan koordinat polar, pengukuran sudu $\alpha$ tidak tersedia.
Algoritama yang ditawarkan memanfaatkan hukum \textit{cosinus} pada segitiga untuk mendapatkan sudut tersebut.
\begin{figure}
\centering
\includegraphics[scale=.5]{BAB3/img/estimate_coordinate.png}
\caption{Strategi Penentuan Koordinat}
\label{fig:strategiPenentuanKoordinat}
\end{figure}
Dapat diperhatikan pada gambar~\ref{fig:strategiPenentuanKoordinat} untuk gambaran strateginya.
Robot $B \in \tetangga_A$, adalah tetangga dari robot $A$.
Pertama-tama, sebelum robot $A$ bergerak, disimpan terlebih dahulu nilai $d_a$,
atau dinotasikan dengan $d_a[k]$ sebagai jarak sebelum bergerak.
Lalu robot $A$ berjalan secara random kesegala arah dengan jarak $l_a$.
Disimpan kembali nilai jara $d_a$, atau dinotasikan dengan $d_a[k+1]$.
Setalah itu dapat ditentukan sudut $\alpha[k+1]$
\begin{align}
d_a[k]^2 & = d_a[k+1]^2 + l_a^2 + 2 d_a[k+1] l_a \cos{(\alpha[k+1])} \\
\alpha[k+1] & = cos^{-1}\Bigg( \frac{l_a^2 + d_a[k+1]^2 -d_a[k]^2}{2d_a[k+1]l_a} \Bigg)
\label{eq:algo_getAngle}
\end{align}
Sebelum $\alpha[k+1]$ digunakan, jarak $d_a[k+1]$ dan $d_a[k]$ berpengaruh dalam penentuan koordinat.
Sehingga diperlukan sedikit algoritma
\begin{align}
\alpha_i=
\begin{cases}
\alpha[k+1] & ,d_a[k+1] > d_a[k] \\
180-\alpha[k+1] & ,d_a[k+1] < d_a[k]
\end{cases}.\label{eq:init_relatif_koordinat}
\end{align}
Strategi pada gambar~\ref{fig:strategiPenentuanKoordinat} hanya berlaku apabila target ukur berhenti. Apabila dinotasikan koordinat $(x_B^A, y_B^A)$ adalah koordinat relatif robot $B$ terhadap $A$,
maka $(\dot{x}_B^A, \dot{y}_B^A)$ adalah notasi kecepatan koordinat dari robot B.
Dengan menggunakan persamaan~\eqref{eq:kinematika_robot} untuk menyelesaikan koordinat dalam
keadaan robot $B$ bergerak, yaitu mengirimkan informasi kecepatan koordinatnya
ke robot $A$. Lalu robot $A$ dapat mengkalkulasi koordinat relatif dengan persamaan berikut
\begin{align}
\alpha[k+1] & = \alpha[k]+tan^{-1} \Big[ \frac{\dot{x}_B^A}{\dot{y}_B^A} \Big]
\end{align}
dimana kondisi inisial adalah $\alpha[k] = \alpha_i$ diperoleh dari hasil strategi pada persamaan~\eqref{eq:init_relatif_koordinat}.
Dengan memanfaatkan kedua strategi tersebut dapat digunakan untuk
mengkalkulasi koordinat robot $B$ relatif terhadap robot $A$
\begin{align}
x_B^A = \begin{bmatrix}
x_B = d_a[k]\cos \alpha[k] \\
y_B = d_a[k]\sin \alpha[k]
\end{bmatrix}
\end{align}
Dalam strategi ini akan terjadi ketidak akuratan dalam pengukuran apabila target ukur
berada pada sudut $90^\circ$.
Akan tetapi, \kutip{Cao2007} sudah menjelaskan mengenai kriteria posisi agent ketika dalam kondisi inisial.
Yaitu semua agent tidak berada pada kondisi sejajar secara koordinat global.
\begin{algorithm}
\DontPrintSemicolon
\KwInput{
Integer $l_a>0$,
$\tetangga_i=getConnectionRobot()$, }
\KwOutput{$x_i^j$}
\If{isInisilised() == false}{
\tcc{inisialisasi}
\tcc{getRandomDirection() akan mengembalikan sudur random antara 0 - 360}
$dir = getRandomDirection()$\;
$d_{before} = getDistanceFromSensor(\tetangga_i)$\;
$r = \begin{bmatrix}
l_a \cos(dir) \\
l_a \sin(dir)
\end{bmatrix}$\;
\tcc{Menjalankan robot hingga mencapai setpoint}
\While{isSetpointReached()}{
$runRobotToSetpoint(r)$\;
}
\tcc{Mengambil jarak setelah robot mencapai setpoint}
$d_{after} = getDistanceFromSensor(\tetangga_i)$\;
\tcc{Mengkalkulasi sudut}
$ang = cos^{-1}\Bigg[ \frac{l_a^2 + d_{after}^2 -d_{before}^2}{2d_{before}l_a} \Bigg]$\;
}
\Else{
\tcc{mendapatkan infromasi state dari tetangga}
$\begin{bmatrix}
\dot{x}_B^A \\ \dot{y}_B^A
\end{bmatrix} = getState()$ \;
$ang = \alpha[k]+tan^{-1} \Big[ \frac{\dot{x}_B^A}{\dot{y}_B^A} \Big]$ \;
}
\If{$d_{before}<d_{after}$}
{
$ang = 180-ang$\;
}
\tcc{Menjadikan koordinat kartesian}
\Return $x_i^j = \begin{bmatrix}
d_{after} \cos(ang) \\
d_{after} \sin(ang)
\end{bmatrix}$\;
\caption{\textit{Algoritma Cosinus}}
\label{algo:algoritma_cosinus}
\end{algorithm}