108 lines
4.3 KiB
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} |