

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}