text:
\section*{Appendix}

\section{Conclusion}
\label{section: con}
We address the problem of disturbances and model uncertainties in cases of quadrotor controlled using geometric control techniques, where coordinate free dynamics are used to avoid singularities. We develop the error dynamics with uncertainties in the system and a reference model without any uncertainty. Attitude tracking errors are defined between the robot model and the reference model. We develop control for the robot model and the reference model with $L_1$ adaptation to estimate the uncertainty in the robot model. Control Lyapunov candidate is defined to show that the proposed control strategy results in an exponential stability between the robot model and reference model, beyond a small bound about the origin. The bounded region is inversely  proportional to the chosen adaptation gain $\Gamma$. Numerical simulations are presented to validate the control in presence of disturbances and model uncertainties.
Experimental results are presented to show the performance of the $L_1$ adaptive control.

\section{Geometric $L_1$ Adaption for Attitude Tracking Control}
\label{section: control}

In section \ref{sec:disturb}, the attitude dynamics were described in the presence of model uncertainties. In particular, \eqref{eq:eR_real_final} \& \eqref{eq:eOm_real_final} present the attitude error dynamics along with the uncertainty $\theta$ and input $\mu$. (Note that the actual control moment $M$ is calculated using \eqref{eq:Mactual}.) In this section, we proceed to present a geometric $L_1$ adaptation law to estimate the uncertainty $\theta$, and compute the input $\mu$, to track a desired time-varying trajectory $(R_d,\Omega_d)$.

\begin{remark}
The dynamical model given in \eqref{eq:eOm_real_2} with the controller in \eqref{eq:Mactual} resulting in the closed-loop system in \eqref{eq:e_real_final} is referred to as \textit{true model}.
States and inputs corresponding to the \textit{\textit{true model}} are given below,
\begin{equation*}
\boxed{R,\Omega, e_R, e_{\Omega}, \theta, M.}
\end{equation*}
\end{remark}

\subsection{\textit{Reference model}}

$L_1$ control architecture employs a \textit{reference model}~(also referred as reference/nominal system or state predictor) to predict the uncertainty $\theta$ in the system. In this paper, we consider a \textit{reference model}\, with a nominal inertia matrix, $J$, and without any disturbances $\theta_e$. Let $\hat{R}$ be the attitude of the \textit{reference model}~and $\hat{\Omega}$ be the body-angular velocity of the \textit{reference model}. Dynamics of the \textit{reference model}\, is written as,
\begin{align}
\dot{\hat{R}}&=\hat{R}\hatmap{\hat{\Omega}}, \label{eq:R_ref}\\
J\dot{\hat{\Omega}}&=\hat{M} - \hat{\Omega}\times J\hat{\Omega}, \label{eq:Om_ref}
\end{align}
with control moment $\hat{M}$ defined similar to \eqref{eq:Mactual}, i.e.,
\begin{align}
\hat{M}&=\hat{\mu} + (\hat{\Omega}\times J\hat{\Omega})\nonumber\\
&\quad - J(\hatmap{\hat{\Omega}}\hat{R}^TR_d\Omega_d - \hat{R}^TR_d\dot{\Omega}_d). \label{eq:Mhat}
\end{align}

Here, $R_d(t)$, $\Omega_d(t)$ are the same desired trajectory (attitude and body-angular velocity) considered in section \ref{sec:disturb}.
Similar to the attitude error vectors defined for the \textit{true model}, we define configuration errors for the \textit{reference model}. The attitude tracking error is defined as,
\begin{align}
\hat{e}_R&=\frac{1}{2}(R_{d}^{T}\hat{R}-\hat{R}^{T}R_{d})^{\vee}, \label{eq:eRhat}
\end{align}
and the angular velocity tracking error on $T_{\hat{R}}SO(3)$ is,
\begin{align}
\label{eq:eOmhat}
\hat{e}_{\Omega}&= \hat{\Omega}-\hat{R}^TR_d\Omega_d.
\end{align}

The error dynamics for the  \textit{reference model}\, is similar to \eqref{eq:eR1}, \eqref{eq:eOm2}. We present the attitude error dynamics with control moment defined in \eqref{eq:Mhat} below,

\begin{subequations}
\begin{empheq}[box=\widefbox]{align}
  \dot{\hat{e}}_R&=C(R_d^T\hat{R})\hat{e}_{\Omega}, \label{eq:deRhat}\\
  J\dot{\hat{e}}_{\Omega}&=\hat{\mu}   \label{eq:deOmhat}
\end{empheq} \label{eq:tildeerrordyn}
\end{subequations}

Comparing \eqref{eq:deOmhat} to \eqref{eq:eOm_real_final}, we notice the presence of additional term $\theta$ (uncertainty) in the \textit{true model}. $L_1$ adaptation is used to estimate this uncertainty, with $\hat{\theta}$ denoting the uncertainty. Discussion regarding the uncertainty estimation and its relevance to the control is presented below,
{
\begin{enumerate}[{\it (i)}]
\item $L_1$ adaptation makes use of both the \textit{true model}~ and the \textit{reference model}~ to estimate the uncertainty $\hat{\theta}$.
\item In-order for the \textit{reference model}~ to account for the uncertainty in the \textit{true model}, estimated uncertainty $\hat{\theta}$ (or a transported version of $\hat{\theta}$ in case of manifolds) is included in the control input $\hat{\mu}$.
\item Control inputs $\mu$ (\textit{true model}) and $\hat{\mu}$ (\textit{reference model}) are used to track a desired trajectory while canceling the uncertainty.
\item Uncertainty is countered by including $(-\hat{\theta})$ in the control inputs $\mu$ and $\hat{\mu}$. However, $\hat{\theta}$ typically contains high frequency components due to fast estimation. $L_1$ adaptive control architecture is used to decouple estimation and adaption \cite{Cao2006adapt}.  A low-pass filter is used to exclude the high frequency content in the input. Thus, $(-C(s)\hat{\theta})$ is included in the control inputs, where $C(s)$ is a low pass filter and with \highlight{$\| C(0)\| = 1$}. The low-pass filter is key to the trade-off between the performance and robustness.

\end{enumerate}}

\begin{remark}
The \textit{reference model}~is distinguished using the superscript $\hat{\cdot}$. Therefore, states and inputs corresponding to the \textit{reference model}\, are as given below,
\begin{equation*}
\boxed{\hat{R},\hat{\Omega}, \hat{e}_R, \hat{e}_{\Omega}, \hat{\theta}, \hat{M}.}
\end{equation*}
Table \ref{table:2} presents the different notations used in this paper.
\end{remark}

\begin{table}[t]
\centering
\begin{tabular}{m{2cm}  c  m{4cm}}
\hline
Symbol & Example	  & Model/Errors \\
\hline \hline
no sub/super-script & $R$  & \textit{True model} \\ [1ex]
\hline
${.}_d$ & ${R}_d$  & Desired Trajectory \\ [1ex]
\hline
$\widehat{.}$ & $\widehat{R}$  & \textit{Reference model} \\ [1ex]
\hline \hline
no sub/super-script & ${e}_R$  & Error between \textit{True model}~\& Desired Trajectory  \\ [1ex]
\hline
$\widehat{.}$ & $\widehat{e}_R$  & Error between \textit{Reference model} ~\& Desired Trajectory  \\ [1ex]
\hline
$\widetilde{.}$ & $\widetilde{e}_R$  & Error between \textit{True model}~\& \textit{Reference model} \\ [1ex]
\hline
\hline
& $\bar{J}$ & True inertia \\
\hline
& $J$ & Nominal inertia used by the control law\\
\hline
\end{tabular}
\caption{List of notations used to represent various models and errors in this paper.}
\label{table:2}
\end{table}

\subsection{Errors between the \textit{True model}\, and the \textit{Reference model}\,}

In the previous sections, we presented the
\textit{true model}~and the corresponding \textit{reference model}~to mimic the actual system and its uncertainties. The goal of our work is to present an adaptive controller to reduce the differences between the \textit{true model}~and the \textit{reference model}. We, also present a tracking controller for the \textit{reference model}, that enables the \textit{true model}~ to track the desired trajectory.

Attitude tracking errors between the \textit{true model}\, and the desired time-varying trajectory are $e_R$ and $e_{\Omega}$. Errors between the \textit{reference model}\, and the desired trajectory are $\hat{e}_R$ and $\hat{e}_{\Omega}$.
Similarly, we define a new set of attitude errors to capture the difference between the \textit{true model}\, and the \textit{reference model}~as below,
\begin{align}
\tilde{e}_R &=\frac{1}{2}(R^T\hat{R}-\hat{R}^TR)^{\vee}, \label{eq:eRtilde}\\
\tilde{e}_{\Omega}&=\hat{\Omega}-\hat{R}^TR\Omega, \label{eq:eOmtilde}
\end{align}
and the corresponding configuration error function is given as,
\begin{align}
\tilde{\Psi}&=\frac{1}{2}Trace[I-R^T\hat{R}].\label{eq:Psitilde}
\end{align}

{From \eqref{eq:eOm_real_final} and \eqref{eq:Mactual}, the uncertainty $\theta$ can be canceled out (if it was known) by the control moment.} This shows that $\theta$ lies in the same dual space as the moment \highlight{$M$}, i.e., $\theta \in T^*_RSO(3)$, and similary, the predicted uncertainty is in the dual space $T^*_{\hat{R}}SO(3)$. The difference between the actual uncertainty and the predicted uncertainty is thus calculated by transporting ${\theta}$ to the space of $\hat{\theta}$,
\begin{align}
\tilde{\theta}&=\hat{\theta} - \hat{R}^TR\theta. \label{eq:thetatilde}
\end{align}

Having presented the error definitions for orientation $\tilde{e}_R$, angular velocity $\tilde{e}_{\Omega}$ and uncertainty $\tilde{\theta}$ between the \textit{true model}~and the \textit{reference model}, we now present the control design for $\mu$ and $\hat{\mu}_1$ for the attitude dynamics of \textit{true model}, and \textit{reference model}~respectively, such that these errors, $(\tilde{e}_R,\tilde{e}_{\Omega})$, exponentially reach {an arbitrarily  small neighborhood of the origin (0,0)}.

\subsection{Geometric Attitude Tracking Control for quadrotor with uncertainty}

{In this section, we define the control inputs $\mu$ and $\hat{\mu}$. Intuition behind the definition of the control inputs is presented below,
\begin{itemize}
\item \textit{Reference model}:

\begin{enumerate}[{\it (i).}]
\item Control moment $(\hat{M})$ and the control input $(\hat{\mu})$ for the \textit{reference model}~is given in \eqref{eq:controlMomentMhat}
\item  $\hat{\mu}$ is designed to track the desired trajectory (through $\hat{\mu}_1$), i.e.,  $(\hat{R},\hat{\Omega})\rightarrow (R_d,\Omega_d)$, alternately $(\hat{e}_{R},\hat{e}_{\Omega})\rightarrow (0,0)$
\item  $\hat{\mu}$ also includes the terms to account for the true uncertainty and low-pass filtered estimate of the uncertainty to counter the uncertainty (through $\hat\mu_2$)
\end{enumerate}
\end{itemize}}

{
\begin{itemize}
\item \textit{True model}:
\begin{enumerate}[{\it (i).}]
\item Control moment $({M})$ and the control input $({\mu})$ for the \textit{true model}~is given in \eqref{eq:controlMomentM_first}
\item $\mu$ is defined such that the \textit{true model}~tracks the \textit{reference model}, i.e., $(R,\Omega)\rightarrow (\hat{R}, \hat{\Omega})$, alternately $(\tilde{e}_R, \tilde{e}_{\Omega})\rightarrow(0,0)$
\item Low-pass filtered uncertainty estimate, $-C(s)\hat{\theta}$,  is included to cancel the uncertainty in the \textit{true model}. However, $-C(s)\hat{\theta}$ has to be transported to the ${\mu}$ space.
\item $\mu$ is chosen such that the error dynamics for the errors in \eqref{eq:eRtilde}, \eqref{eq:eOmtilde} are feedback linearized and results in $J\dot{\tilde{e}}_{\Omega}=-\tilde{k}_R\tilde{e}_R-\tilde{k}_{\Omega}\tilde{e}_{\Omega}+\mathrm{P}\tilde{\theta}$.
\end{enumerate}
\end{itemize}
}

\begin{tcolorbox}[width=\columnwidth,colback={LightGray},title={Control moment, $(\hat{M})$, for the \textit{reference model}},colbacktitle=white,coltitle=black]
\begin{subequations}
\begin{align}
\hat{M}&=\hat{\mu} + (\hat{\Omega}\times J\hat{\Omega})\nonumber\\
&\quad - J(\hatmap{\hat{\Omega}}\hat{R}^TR_d\Omega_d - \hat{R}^TR_d\dot{\Omega}_d),\\
 \hat{\mu}&= \hat{\mu}_1+\hat{\mu}_2,\\
 \hat{\mu}_1 &= -\hat{k}_R\hat{e}_R - \tilde{k}_{\Omega}\hat{e}_{\Omega},\label{hatmu1} \\
 \hat{\mu}_2 &=  J\hat{R}^TRJ^{-1}R^T\hat{R}\hat{\theta}-C(s)\hat{\theta}.
 \end{align}  \label{eq:controlMomentMhat}
\end{subequations}
\end{tcolorbox}

\begin{tcolorbox}[width=\columnwidth,colback={LightGray},title={Control moment, $(M)$, for the \textit{true model}},colbacktitle=white,coltitle=black]
\begin{subequations}
\begin{align}
  M& = \mu +(\Omega\times J\Omega) \nonumber \\
	&\quad \quad -J(\hatmap{\Omega}R^TR_d\Omega_d - R^TR_d\dot{\Omega}_d),\\
 \mu&= \mu_1+\mu_2, \\
 \mu_1 & = JR^T\hat{R}J^{-1}(\hat{\mu}_1{-}C(s)\hat{\theta}+\tilde{k}\tilde{e}_R{ + }\tilde{k}_{\Omega}\tilde{e}_{\Omega}), \label{mu1}\\
\mu_2 & =  JR^T\hat{R}\hatmap{\tilde{e}}_{\Omega}\hat{R}^TRe_{\Omega}.
 \end{align}  \label{eq:controlMomentM_first}
\end{subequations}
\end{tcolorbox}

In \eqref{eq:controlMomentMhat}, \eqref{eq:controlMomentM_first} $\hat{k}_R$, $\tilde{k}_R$ and $\tilde{k}_{\Omega}$ are positive constants. {The resulting attitude error dynamics  are presented in Appendix B.}

\begin{remark}
The relation between $\mu$ and $\hat{\mu}$ can be shown as follows,
\begin{align}
\mu & = JR^T\hat{R}J^{-1}(\hat{\mu}+\tilde{k}_R\tilde{e}_R+\tilde{k}_{\Omega}\tilde{e}_{\Omega})\nonumber\\
&\quad\quad -R^T\hat{R}\hat{\theta} + JR^T\hat{R}\hatmap{\tilde{e}}_{\Omega}\hat{R}^TRe_{\Omega}. \label{eq:controlMomentM}
\end{align}
This relation is used to calculate $\dot{\tilde{e}}_{\Omega}$ in Appendix B. \highlight{Note that the presence of $\tilde{k}_{\Omega}$ in both $\hat{\mu}_1$ (34c) and $\mu_1$ (35c), ensures that the relation in \eqref{eq:controlMomentM} is obtained after simplification.}
\end{remark}

\begin{thm}
\label{prop:1}
Consider the control moments $M$ and $\hat{M}$ defined in \eqref{eq:controlMomentM_first} and \eqref{eq:controlMomentMhat} for the \textit{true model}\,and the \textit{reference model}\, respectively and
\begin{enumerate}[{\it (i)}]
\item the adaptation law using $\Gamma-$Projection as,
\begin{equation}
\label{eq:adapt}
\dot{\hat{\theta}} = Proj_{\Gamma}(\hat{\theta},y),
\end{equation}
with the projection operator as defined in Remark~\ref{remark:gamma},
\item the definition of $y$ given as,
\begin{align}
\label{eq:y}
y = -(\mathrm{P}^T\tilde{e}_{\Omega}+c\mathrm{P}^TJ^{-T}\tilde{e}_R),
\end{align} where
\begin{align}
\label{eq:Rho_def}
\mathrm{P} = J\hat{R}^TRJ^{-1}R^T\hat{R},
\end{align} and
\item with the initial condition that satisfies,
\begin{gather}
\T{\Psi}(\hat{R}(0),R(0))<2,\\
\| \T{e}_{\Omega}(0)\|^2<\frac{2}{\lambda_{min}(J)}\T{k}_R(2-\T{\Psi}(\hat{R}(0)R(0))), \label{eq:eOmtilde_init}
\end{gather}
\end{enumerate}
then the attitude tracking error $(\tilde{e}_R, \tilde{e}_{\Omega})$, defined in \eqref{eq:eRtilde}, \eqref{eq:eOmtilde}, is \textit{exponential input-to-state stable (e-ISS)} \cite{kolathaya2018input} in the sense of Lyapunov.
\begin{proof}
Proof is given in Appendix C.
\end{proof}
\end{thm}
\begin{remark}
\label{remark:gamma}
Definition of the $\Gamma-$Projection operation is given in \cite{lavretsky2011projection} as,
  \begin{equation}
    Proj_{\Gamma}(\hat{\theta},y)=
    \begin{cases*}
       \Gamma y - \Gamma\frac{\bigtriangledown f(\hat{\theta})(\bigtriangledown f(\hat{\theta}))^T}{(\bigtriangledown f(\hat{\theta}))^T(\bigtriangledown f(\hat{\theta}))}\Gamma y f(\hat{\theta}), & \\
      \quad\quad \text{if } f(\hat{\theta}) > 0 \wedge y^T\Gamma \bigtriangledown f(\hat{\theta})> 0, & \\
      \Gamma y, \quad\quad \text{otherwise},
    \end{cases*}
  \end{equation}
where, $f(\hat{\theta}):\mathbb{R}^3\rightarrow \mathbb{R}$ is any convex function.
\end{remark}
Figure \ref{fig:l1scheme} presents the control architecture with $L_1$ adaptation. Also, note the presence of low-pass filter after the adaptation law. This is integral to the $L_1$ adaptive controller, where the high frequency noise is filtered from the system input~\cite{cao2006design}.  The $L_1$  adaptive controller consists of the reference model \eqref{eq:tildeerrordyn}, adaptation law \eqref{eq:adapt}, and the control law \eqref{eq:controlMomentM_first}.

\begin{figure}
\centering
\includegraphics[width=\columnwidth]{l1_scheme_newimg_V2}
\caption{$L_1$ Adaptive scheme on the Geometric Attitude Control. The \textit{true model}~captures the dynamics of the quadrotor and represents the physical plant. A $4^{th}$ order Range-Kutta method is used to simulate the dynamics of the \textit{True model}~ and \textit{Reference model} {\it s} in the Numerical Simulations and Euler integration is used to simulate the Reference model in the experiments.}
\label{fig:l1scheme}
\end{figure}

\subsection{Position Control}
Now that we have an attitude controller, we can use the position controller from \cite{lee2011geo}.
For some smooth position tracking command $x_{d}(t) \in \mathbb{R}^{3}$, we can define the position and velocity tracking errors as,
\begin{equation}
\label{eq:ex}
e_{x} = x - x_{d},
\end{equation}
\begin{equation}
\label{eq:ev}
e_{v} = v - v_{d}.
\end{equation}

The desired thrust vector for the quadrotor is computed as
\begin{equation}
\label{eq:thrust_vector}
\vec{F} = -k_{x}e_{x}-k_{v}e_{v}-mg\bm{e}_{3}+m\ddot{x}_{d}
\end{equation}

The quadrotor thrust magnitude is then given by,
\begin{equation}
\label{eq:f}
f =- \vec{F} \cdot R\bm{e}_{3},
\end{equation}
where $k_{x}$ and $k_{v}$ are positive constants and the thrust is in direction $-\bm{b_{3}}$.
The desired orientation and angular velocity are given by,
\begin{equation}
R_{d}=\begin{bmatrix}
\bm{b_{1d}} &~~~\bm{b_{3d}} \times \bm{b_{1d}}&~~~\bm{b_{3d}}
\end{bmatrix},
\quad
\Omega_{d}^{\times} = R_{d}^{T}\dot{R}_{d},
\end{equation}
where $\bm{b_{3d}}$ is chosen as,
\begin{equation}
\label{eq:b3d}
\bm{b_{3d}}=- \frac{-k_{x}e_{x}-k_{v}e_{v}-mg\bm{e}_{3}+m\ddot{x}_{d}}{\|-k_{x}e_{x}-k_{v}e_{v}-mg\bm{e}_{3}+m\ddot{x}_{d}\|},
\end{equation}
and is selected to be orthogonal to $\bm{b_{1d}}$, such that $R_{d} \in SO(3)$ - see \cite{lee2011geo}, \highlight{\cite[chapter 11]{quan2017introduction}} for more details.

\begin{remark}
A similar $L_1$ approach, used in the attitude control, can also be used to deal with disturbances and uncertainties in position control as studied in \cite{zuo2014adapt}. Since position and velocity evolve in the Cartesian space, we use a traditional (non-geometric) position $L_1$ adaptive control in the simulations and experiments discussed in the later sections.
\end{remark}

\section{Effects of Model Uncertainties and Disturbances on the Attitude Dynamics}
\label{sec:disturb}
As discussed in the previous section, the control moment $M$ in \eqref{eq:Mactual} ensures that the zero equilibrium of the error dynamics in \eqref{eq:eR1}-\eqref{eq:eOm2} is exponentially stable. This controller assumes an accurate dynamical model of the quadrotor. However, presence of any uncertainties in the model properties, like in mass, $m$, and in inertia, $J$, can result in large tracking errors and potential instability. External disturbances on the system can also result in similar adverse effects.

The unknown external disturbances can be captured in the attitude dynamics of the quadrotor \eqref{eq:R}-\eqref{eq:Omega}. In particular, the attitude dynamics along with the external disturbances are defined as,
\begin{align}
\dot{R} & = R\hatmap{\Omega}, \label{eq:R_real}\\
\bar{J}\dot{\Omega} &= M - \Omega\times \bar{J}\Omega + \theta_e, \label{eq:Omega_real}
\end{align}
where $\theta_e$ represents the unknown external disturbance
and $\bar{J}$ is the true (unknown) inertia of the quadrotor. The corresponding attitude error dynamics \eqref{eq:eR1}, \eqref{eq:eOm2}, whose errors are defined as \eqref{eq:eRdef} and \eqref{eq:eOmdef}, can be modified and represented as below,
\begin{align}
\dot{e}_R &= C(R_d^TR)e_{\Omega}, \label{eq:eR_real}\\
\bar{J}\dot{e}_{\Omega}& = M - (\Omega\times \bar{J}\Omega) \nonumber\\
&\quad +\bar{J}(\hatmap{\Omega}R^TR_d\Omega_d-R^TR_d\dot{\Omega}_d) + \theta_e. \label{eq:eOm_real_2}
\end{align}

\begin{remark}
Due to the above structure, the external disturbance $\theta_e$ becomes a matched uncertainty~\cite[Chapter~2]{hovakimyan2010l1}.
\end{remark}

Additionally, the control moment \highlight{$M$} in \eqref{eq:Mactual} assumes accurate knowledge of inertia of the quadrotor. However, if the true inertia, $\bar{J}$, of the quadrotor is not same as the nominal inertia of the quadrotor, $J$, it results in further uncertainties in the closed-loop system.

In particular, substituting for \highlight{$M$} from \eqref{eq:Mactual} in \eqref{eq:eOm_real_2}, we obtain,
\begin{align}
\bar{J}\dot{e}_{\Omega}&=\mu + \theta_e \nonumber \\
&+ {\scriptsize\underbrace{[-\Omega\times(\bar{J}-J)\Omega + (\bar{J}-J)(\hatmap{\Omega}R^TR_d\Omega_d-R^TR_d\dot{\Omega}_d)]}_{\triangleq \theta_m}}, \label{eq:Om_real_3}
\end{align}
where, $\theta_m$ is zero when $J = {\bar{J}}$.
\highlight{We define $\delta J$ relating the true inertia ${\bar{J}}$ and the nominal inertia $J$ as,
$\delta J := J\bar{J}^{-1} - I$.}

Thus, \eqref{eq:Om_real_3} can be written in the following manner,
\begin{align}
J\dot{e}_{\Omega}&= \mu + \underbrace{(\delta J)\mu + J\bar{J}^{-1}(\theta_m+\theta_e)}_{\triangleq \theta} \label{eq:theta_def}
\end{align}
where $\theta$ is the combined expression for the uncertainties and disturbances. Therefore, the closed-loop attitude error dynamics of the quadrotor with control moment $M$ defined in \eqref{eq:Mactual}, along with the model uncertainties and disturbances can be given as,
\begin{subequations}
\label{eq:e_real_final}
\begin{empheq}[box=\widefbox]{align}
  \dot{e}_R&=C(R_d^TR)e_{\Omega}, \label{eq:eR_real_final}\\
  J\dot{e}_{\Omega}&= \mu + \theta. \label{eq:eOm_real_final}
\end{empheq}
\end{subequations}

For $\theta=0$ in \eqref{eq:eOm_real_final}, representing no model uncertainity, a choice of $\mu$ as a PD control similar to \eqref{eq:g_pd}, would result in a stabilizing control. However, if $\theta\neq 0$, the choice of PD control alone will not be sufficient to guarantee stability. A choice of $\mu$ that can cancel the uncertainty $\theta$ would be helpful in achieving stability. However, {$\theta$ is unknown and this cannot be done}. A similar approach for biped robots is developed in \cite{quan2015bi}, however, they do not address the case of dynamics evolving on manifolds. Also note that the uncertainty is a nonlinear function of states $R,\Omega$ and control input $\mu$. In the next section, we propose a Geometric $L_1$ adaptation to predict the uncertainty $\theta$.

\section{Geometric Dynamics and Control of Quadrotor on SE(3) revisited}
\label{section: quad_dynamics}

\subsection{Geometric Dynamics Model}

We consider the dynamics of a quadrotor in a coordinate-free frame-work. Figure \ref{fig:quad_geo} illustrates the quadrotor with reference frames.
The coordinate-free dynamic model is defined using a geometric representation, with the quadrotor attitude represented by a rotation matrix, $R$, in $SO(3)\coloneqq\{R\in \mathbb{R}^{3\times 3}~|~R^TR=I, det(R) = +1 \}$,  representing the rotation from body-frame to the inertial-frame. The center-of-mass position of the quadrotor, assumed to be at the geometric center of the quadrotor and denoted by $x$, is given by the vector from the inertial-frame's origin to the body-frame's origin.

The configuration space of this sytem is, $Q\coloneqq SE(3)$, with 6 degrees-of-freedom and 4 inputs corresponding to the 4 rotors. Thrust $f\in \mathbb{R}$ and moment $M\in \mathbb{R}^3$ has a one-one mapping to the 4 rotor inputs as shown in \cite{lee2011geo} and thus, can be considered as inputs to the quadrotor.

Equations of motion for the quadrotor discussed in \cite{lee2011geo} are given below,
\begin{align}
\dot{x}&=v, \label{eq:x}\\
m\dot{v}&=mg\bm{e}_3-fR\bm{e}_3,\label{eq:dx}\\
\dot{R}& = R\hatmap{\Omega}, \label{eq:R}\\
J\dot{\Omega}& = M - (\Omega \times J\Omega), \label{eq:Omega}
\end{align}
where Table \ref{table:1} enumerates various symbols used in defining the dynamics, and the skew-symmetric  cross-map~$\hatmap{(\cdot)}:\mathbb{R}^3\rightarrow so(3)$ satisfies $\forall x,y\in \mathbb{R}^3, \hatmap{x}y=x\times y$. For reference, the vee-map, ${.}^{\vee}:so(3)\rightarrow \mathbb{R}^3$ is defined as the inverse of the cross-map~, i.e., $(\hatmap{y})^{\vee}=y$. Properties of cross-map~ useful in this paper are presented in Appendix A. .

\begin{table}[t]
\centering
\begin{tabular}{l p{5cm}}
\hline
 $m \in \mathbb{R}$ & Mass of the quadrotor \\
 \hline
 $J \in \mathbb{R}^{3\times 3}$ & Inertia matrix of the quadrotor with respect to the body-fixed frame \\
 \hline
$R \in SO(3) $ & Rotation matrix of the quadrotor from body-fixed frame to the inertial frame \\
\hline
$\Omega \in \mathbb{R}^3$ & Body-frame angular velocity\\
\hline
$x \in \mathbb{R}^3$ & Position vector of the quadrotor's center-of-mass in the inertial frame\\
\hline
$v \in \mathbb{R}^3$ & Velocity vector of the quadrotor's center-of-mass in the inertial frame\\
\hline
$f \in \mathbb{R}$ & Magnitude of the thrust of the quadrotor and is in the direction of $\bm{-b_3}$\\
\hline
$M\in \mathbb{R}^3$& Moment vector of the quadrotor in the body-fixed frame\\
\hline
$\bm{ e_1}, \bm{e_2}, \bm{ e_3 }\in \mathbb{R}^3$ & Unit vectors along the x,y,z directions of the inertial-frame\\
\hline
$\bm{b_1}, \bm{b_2}, \bm{b_3 }\in \mathbb{R}^3$ & Body fixed axis of the quadrotor represented in the inertial-frame; $\bm{b_3}$ is orthogonal to the plane of the quadrotor \\
\hline
$g\in \mathbb{R}$ & Acceleration due to gravity, is along the direction $\bm{e_3}$ \\
\hline
\end{tabular}
\caption{Various symbols used in representing the dynamics of the quadrotor on SE(3). }
\label{table:1}
\end{table}

\subsection{Geometric Tracking Control for Quadrotor}

The geometric tracking control presented in \cite{lee2011geo} tracks the desired quadrotor trajectory $x_d(t)$.
The position controller calculates thrust $f$ and a desired orientation $R_d$, while the attitude control calculates moment $M$ to track the desired orientation $R_d$.

The tracking errors for the attitude dynamics, with desired orientation $R_d$ and body angular velocity $\Omega_d$, are defined on the tangent bundle of $SO(3)$ as follows. The attitude tracking error is defined as,
\begin{align}
\label{eq:eRdef}
e_R = \frac{1}{2}(R_d^TR-R^TR_d)^{\vee},
\end{align}
and the angular velocity tracking error is calculated
on $T_{R}SO(3)$ as,
\begin{align}
\label{eq:eOmdef}
e_{\Omega} = \Omega - R^TR_d\Omega_d.
\end{align}

The configuration error function between the system attitude and desired attitude is defined as,
\begin{align}
\label{eq:att_config_error}
\Psi=\frac{1}{2}Trace[ I-R_d^TR].
\end{align}
Note that, {$\Psi$ is almost globally positive definite} and upper bounded by 2.
The attitude error dynamics are then given as, see~\cite{lee2011geo} for details,
\begin{align}
\dot{e}_R &= C(R_d^TR)e_{\Omega}, \label{eq:eR1}
\end{align}
\begin{align}
J\dot{e}_{\Omega}& = J\dot{\Omega}
+ J(\hatmap{\Omega}R^TR_d\Omega_d-R^TR_d\dot{\Omega}_d), \label{eq:eOm1}
\end{align}
\begin{align}
& = M - (\Omega\times J\Omega) \nonumber\\
&\quad +J(\hatmap{\Omega}R^TR_d\Omega_d-R^TR_d\dot{\Omega}_d).\label{eq:eOm2}
\end{align}
where $C(R_d^TR)\coloneqq \frac{1}{2}(Trace[R^TR_d]I-R^TR_d)$. It can be easily noticed that choosing the control moment \highlight{$M$} as,
\begin{align}
\label{eq:Mactual}
\begin{split}
{M} = \mu + (\Omega\times J\Omega)
-J(\hatmap{\Omega}R^TR_d\Omega_d - R^TR_d\dot{\Omega}_d),
\end{split}
\end{align}
cancels the nonlinearities in \eqref{eq:Mactual}. Then a choice of $\mu$ as,

\begin{align}
\label{eq:g_pd}
\mu = -k_Re_R - k_{\Omega}e_{\Omega},
\end{align}
for any positive constants, ${k}_R,\,{k}_{\Omega}$, would result in,
\begin{align}
J\dot{e}_{\Omega}&=-k_Re_R-k_{\Omega}e_{\Omega}.
\end{align}

For initial conditions that satisfy,
\begin{gather}
\Psi(R(0),R_d(0))<2,\\
\| e_{\Omega}(0)\|^2<\frac{2}{\lambda_{m}(J)}{k}_R(2-\Psi(R(0), R_d(0))),
\end{gather}
(where $\lambda_{m}$ is the minimum eigenvalue of the matrix and similarly, $\lambda_M$ is the maximum eigenvalue), it is shown in \cite{lee2011geo} that the zero equilibrium of the attitude tracking errors $(e_R,e_{\Omega})$ is exponentially stable.
Moreover, a control Lyapunov candidate,
\begin{align}
V&= \frac{1}{2}e_{\Omega}\cdot Je_{\Omega} + {k}_R\Psi(R,R_d) + c_2e_R\cdot e_{\Omega},
\end{align}
is defined to show that the above error dynamics is exponentially stable for
\begin{equation*}
c_2<\bigg\{k_{\Omega},\frac{4k_{\Omega}k_R\lambda_m(J^2)}{k^2_{\Omega}\lambda_M(J)+4k_R\lambda_m(J^2)},\sqrt{k_R\lambda_m(J)} \bigg\},
\end{equation*}
by proving that $\dot{V}\leq \eta^TW\eta$, where $\eta=[e_R \quad e_{\Omega}]^T$ and $W$ is a positive definite matrix. A detailed proof can be found in \cite{lee2011geo}.

Having discussed the geometric attitude control, the following section describes the attitude dynamics of quadrotor in the presence of disturbances and model uncertainties.

\section{Preliminary Experimental Results}
\label{sec:exp}
In this Section, we present the experimental results for the Geometric $L_1$ Adaptive Control developed in the previous sections.

\subsection{Setup}
The experiments are conducted using the Autel-X star quadrotor equipped with a Raspberry Pi 3 based Navio-2. A ROS node on Raspberry Pi 3 runs the on-board attitude control at rate of $1kHz$. Figure~\ref{fig:exp-setup} illustrates the experimental setup used in this paper. A motion capture system Optitrack is used to estimate the pose, velocity and yaw of the quadrotor at $250Hz$. The Inertial Measurement Unit (IMU) on the Navio2 is used to estimate the body-attitude and body-rates. A Lenovo-Thinkpad with Ubuntu 14.04 and ROS constitutes the ground control. A ROS node runs the position control on the ground control and communicates with the onboard control through WiFi at $125Hz$.

\highlight{To generate disturbances and model uncertainty to the quadrotor system, a weight of $\bm{m_a}= 0.2kg$ is rigidly attached to the fuselage of the quadrotor at approximately $[0.1, 0.1, 0.1]^Tm$ in the body-frame. This additional mass is unknown to the controller(s) and constitutes both model uncertainty, with true inertial ${\bar{J}}$ (see \eqref{eq:true_inertial_calc}) and disturbance in the system; added mass generates a moment due to gravity about the quadrotor center-of-mass, given as,
    \begin{align*}
        \theta_m = \bm{m_a}g(r\times R^T\bm{e_3}).
    \end{align*}
Since, this moment varies with $R$, especially for a circular trajectory it would result in a time-varying disturbance.   }

\begin{figure}
\centering
\begin{subfigure}[t]{\linewidth}
	\includegraphics[width=1\columnwidth]{exp_setup_new_V2}
	\caption{Setup used to validate the Geometric $L_1$ control consisting of  \textit{(i)} Motion capture system to track the pose of the quadrotor; \textit{(ii)} Ground control with the position control for the quadrotor; and \textit{(iii)} Autel quadrotor with on-board Geometric Attitude control with $L_1$ adaptation.}
	\label{fig:exp-setup}
\end{subfigure}
\begin{subfigure}[t]{\linewidth}
    \includegraphics[width=\linewidth]{exp_ctrl_structure}
    \caption{Control architecture used in the experiments showing the ground and on-board controls.}
    \label{fig:ctrl_struct}
\end{subfigure}
\caption{Experimental setup and the control architecture to track the quadrotor trajectory with $L_1$ adaptation to estimate the uncertainty $\theta$.}
\label{fig:exp-setup_full}
\end{figure}

\subsection{Control Architecture}
The control technique used to track the desired trajectory using $L_1$ Geometric Attitude controller consists of $(i)$ a position controller, along with a reference model for position dynamics and $(ii)$ an attitude controller with a reference attitude dynamics.
Figure~\ref{fig:ctrl_struct} illustrates the control architecture used in the experiments.
From the desired trajectory, positions and its higher derivatives are calculated and used to calculate the desired states and the feed forward inputs using differential flatness~\cite{mellinger2011minimum}. From the desired position, velocity and acceleration, the desired thrust vector $\vec{F}$ is calculated. A reference position dynamics is simulated using Euler integration and the uncertainty in the position dynamics is estimated and is compensated in the thrust calculation. Based on this thrust vector information, the desired attitude is calculated on-board and is used to compute the desired moments for the quadrotor $M$ and reference model $\hat{M}$.
$\hat{M}$  is used in the reference attitude dynamics simulation, achieved through on-board Euler integration. The scalar thrust, $f$, is calculated using the thrust vector, $\vec{F}$, and the attitude $R$ using \eqref{eq:f}. The moment, $M$, along with the thrust, $f$, is used to generate the desired angular speed for the motors as presented in \cite{mahony2012multirotor}.

\subsection{Results}

To validate the developed controller, we show the tracking performance of the quadrotor (with the weight $\bm{m_a}$ attached) with geometric $L_1$ adaptive control and geometric PD control in \eqref{eq:Mactual} \highlight{without $L_1$ adaptation (referred to as \textit{without} $L_1$)}.
\highlight{
\begin{remark}
Note that the position controller in the ground control (see Figure~\ref{fig:ctrl_struct}) is same for both $L_1$ and \textit{without} $L_1$ controllers (i.e, we are comparing only the attitude control).
\end{remark} }

The different experimental system parameters for the quadrotor are,
\begin{gather*}
\bm{m} = 1.129kg,~\bm{m_a} = 0.2kg,\,\highlight{\bm{r} = [
0.1, 0.1, 0.1]^Tm}
\end{gather*}
{\scriptsize \begin{gather*}
\bm{J} = \begin{bmatrix}
6.968 & -0.02909 & -0.2456 \\ -0.02909 & 6.211 & 0.3871 \\ -0.2456 & 0.871 & 10.34
\end{bmatrix}10^{-3}kgm^2.
\end{gather*}}
We show the performance for Hover and a Circular trajectory tracking in the following subsections. \highlight{Video showcasing the experiments can  can be found at this link, \href{https://youtu.be/nBDDxpkz6Pg}{https://youtu.be/nBDDxpkz6Pg}. }

\subsubsection{\bf Hover}
The desired states for the Hover are, \highlight{$x_d=[0, -1, 1]^T$, $v_d = [0, 0, 0]^T$, $R=I_{3\times 3}$ and $\Omega_d=[0, 0, 0]^T$}. Figure~\ref{fig:hover_exp} presents the tracking performance in terms of (a) position error, and (b) the attitude configuration error for Hover. The mean and standard-deviation for these errors are presented in Table~\ref{table:3_errors}.

\begin{figure}
\begin{subfigure}[t]{\linewidth}
    \includegraphics[width=\linewidth]{Hover_Geo_position_error.eps}
    \caption{Position error $\|x-x_d\|_2$(m)}
    \label{fig:case2pos}
\end{subfigure}

\begin{subfigure}[t]{\linewidth}
    \includegraphics[width=\linewidth]{Hover_Geo_config_error.eps}
    \caption{Attitude configuration error $\Psi$}
    \label{fig:case2Psi}
\end{subfigure}
\caption{\textit{Hover}: Tracking performance with and without $L_1$ controller on quadrotor with attached weight. (a) shows the position error, and (b) the attitude error.}
\label{fig:hover_exp}
\end{figure}

\subsubsection{\bf Circular Trajectory}
We chose the following circular trajectory in flat-outputs:

\begin{gather}
\label{eq:trajectory_flat}
\highlight{x = [ x_0{+}\rho\cos(\omega (t)), y_0{+}\rho\sin(\omega (t)),z_0]^T, \psi(t) = 0}
\end{gather}
where, $\omega(t) = \frac{2\pi a}{b+\exp^{-c(t-t_0)}}$ and $[x_0,\,y_0,\,z_0]$ is the center of the circle and \highlight{$\rho$} is the radius of the circle. The parameters used in the experiment are \highlight{$\rho=1$, $x_0=y_0=0,~z_0=1.5$} $a=13$, $b=1$, $c=0.1$ and $t_0 = 80$. These values result in a circular trajectory with increasing speed to a maximum of $2m/s$ and then decreasing to zero. Tracking performance for this trajectory is presented in Figure~\ref{fig:circle_exp} and the mean and standard-deviation of the errors are presented in Table~\ref{table:3_errors}.

\begin{figure}
\begin{subfigure}[t]{\linewidth}
    \includegraphics[width=\linewidth]{Circle_Geo_position_error.eps}
    \caption{Position error $\|x-x_d\|_2$(m)}
    \label{fig:case2pos}
\end{subfigure}

\begin{subfigure}[t]{\linewidth}
    \includegraphics[width=\linewidth]{Circle_Geo_config_error.eps}
    \caption{Attitude configuration error $\Psi$}
    \label{fig:case2Psi}
\end{subfigure}
\caption{\textit{Circular Trajectory}: Tracking performance with and without $L_1$ controller on quadrotor with attached weight. (a) shows the position error, (b) the attitude error.}
\label{fig:circle_exp}
\end{figure}

\begin{table}
\scriptsize
\centering
\begin{tabular}{| l | c |  c | c|}
\hline
\multirow{2}*{Experiment} & \multirow{2}*{Error} & Without $\bm{L_1}$ & With $\bm{L_1}$\\
						& 						& mean [std-dev] & mean [std-dev]\\
\hline \hline
\multirow{2}*{Hover} & $\| x-x_d\|_2 $ & $0.0152$ [$0.0118$] & $0.0182$ [$0.0132$]\\

					& $\Psi $ & $0.0055$ [$0.0462$] & $0.0021$ [$0.0452$]\\
\hline
\multirow{2}*{\parbox{1.5cm}{Circular \\ Trajectory}} & $\| x-x_d\|_2$ & $0.0250$ [$0.0220$]  & $0.0126$ [$0.0120$] \\

					& $\Psi $ & $0.0056$ [$0.0428$]  & $0.0027$ [$0.0423$] \\
\hline
\end{tabular}
\caption{Mean and standard-deviation for position and attitude errors for Hover and Circular Trajectory with and without $L_1$ adaptation.}
\label{table:3_errors}
\end{table}

\begin{remark}
As it can be noticed from Figures~\ref{fig:hover_exp} \& ~\ref{fig:circle_exp} and Table~\ref{table:3_errors}, controllers with and without $L_1$ have similar performance in case of Hover, while the $L_1$ controller shows approximately a factor of two better performance in the circular trajectory case. This could be attributed to the fact that the states and especially the body-angular velocity has an effect on the uncertainty as can be seen from \eqref{eq:Om_real_3} \& \eqref{eq:theta_def}. In particular, in case of hover the angular velocity $\Omega$ is close to zero resulting in a small uncertainties $\theta_m \approx 0$ while in case of the circular trajectory, the feed-forward angular velocity results in significant uncertainty $\theta$.
\end{remark}

\section{Introduction}
\label{sec: intro}

In recent years, quadrotor unmanned aerial vehicles (UAVs) have been an area of increasing interest. Due to their small size and simple mechanical structure, quadrotors have a large range of potential applications including visual inspection and transportation, as well as a medium for testing control techniques for research purposes.
Generally, an attitude controller for a quadrotor uses Euler angles or quaternions as the attitude states of the system. Instead of these typical attitude controllers, in geometric control, the entries of the rotation matrix between the body-fixed frame and inertial frame are used as the attitude states. Geometric control can be used for complex flight maneuvers as seen in \cite{lee2011geo} and it completely avoids singularities and complexities that arise when using local coordinates. Geometric control has also been used in robust tracking \cite{lee2011geo} and carrying suspended loads with cables \cite{koushil2013geo, lee2015adapt, wu2014geo}.

\begin{figure}
	\centering
	\includegraphics[width=0.8\columnwidth]{quadonSE3}
	\caption{An Autel X-star quadrotor system is shown. The Quadrotor model evolves on $SE(3)$, with the attitude represented by a rotation matrix $R\in SO(3)$, from body-frame to inertial-frame. The origin of the body-frame $\bm{\{b_1, b_2, b_3\}}$ is at the center-of-mass of the quadrotor. \highlight{Video link for the experiments: \href{https://youtu.be/nBDDxpkz6Pg}{https://youtu.be/nBDDxpkz6Pg} }}
	\label{fig:quad_geo}
\end{figure}

However, these controllers are model dependent and assume accurate representation of the dynamics. In the presence of disturbances or uncertainties, the controllers would result in unstable control or large tracking errors. Lately, there has been much work done with adaptive control, to achieve higher performance and robustness in the presence of model uncertainties and disturbances.

\subsection{\rebuttal{Related Work}}
Model Reference Adaptive Control (MRAC) is a standard approach to adaptive control, where an ideal reference system is simulated, and the differences between the real
and reference systems are used to predict and cancel the
disturbances in the system \cite{whitehead2010mrac, ghaffar2016mrac}.
However, this approach has some important practical drawbacks. If the adaptation rate is pushed too high, the system is given high-frequency input commands, which may not be feasible for the system. \highlight{Also, high adaptation gain might result in deteriorated closed-loop stability or unpredictable transient behaviours \cite{zuo2014adapt, cao2006design}.} Furthermore, the high-frequency commands may excite the system, which is not desired. Because of this, the adaptation rate will be low, leading to a long prediction in the system  uncertainties.
$L_{1}$ adaptive control is an extension of MRAC, where the adaptation and control are decoupled through the use of a low pass filter. The designer can choose the cutoff frequency for the low pass filter, removing the high-frequency components of the adaptation from the control input. This promotes a very fast adaptation rate while keeping the control input sufficiently smooth, making $L_{1}$ { a much more practical adaptive control technique \cite{dodenhoft2017design, ackerman2016l1}}.

$L_1$ attitude controllers have been developed for attitude control of quadrotors, using Euler angles (or quaternions) as attitude states  \cite{zuo2014adapt, michini2009adapt, monte2013adapt, mallikarjunan2012l1} or for general linear systems \cite{Cao2006adapt}. Geometric adaptive schemes have been previously developed for quadrotor control in \cite{lee2015adapt, kulumani2016adapt}. Similar to \cite{lee2015adapt}, our work also develops the attitude dynamics and control laws for the quadrotor directly on the $SO(3)$ manifold without any local simplifications. However, in contrast to \cite{lee2015adapt}, we implement a model reference approach, consider time-varying disturbances and uncertainties, estimate uncertainties using a $L_1$ adaptation scheme, and show exponential input-to-state stability.

\subsection{\rebuttal{Challenges}}
\rebuttal{Challenges when implementing the $L_1$ adaptation scheme to a geometric setting is to ensure correct formulation for the errors between the \textit{reference model}~(or state predictor) and \textit{true model}~(or plant). A simple difference between the states of the state predictor and the plant cannot be used\cite{hovakimyan2010l1}, because these states belong to different tangent spaces and thus their difference often lead to incorrect measure of the error, especially for large errors. Similarly, care should be taken when defining the uncertainty prediction error. The adaptation law for the uncertainty requires a careful choice of prediction law that ensures the Lyapunov function for the prediction errors decreases with time.}

\subsection{\rebuttal{Contribution}}
In this paper, we study the problem of a quadrotor with unknown disturbances and model uncertainties.

\highlight{The main focus of this work is on implementing the $L_1$ adaptation directly on the $SO(3)$ manifold. In particular, the contributions of this paper with respect to prior work are,}
\begin{enumerate}
	\item We define attitude tracking errors, between the quadrotor model and a reference model (without disturbances), directly on the tangent bundle of the $SO(3)$ manifold and develop the control law to show that these attitude errors exhibit exponential input-to-state stability.
	\item We propose a geometric $L_1$ adaptation law to estimate the uncertainties and formally prove the resulting geometric input-to-state stability.
	\item We present numerical results to validate the performance of the proposed geometric $L_1$ adaptive control and show that the proposed control outperforms \highlight{geometric control \textit{without} $L_1$ (geometric $PD$ control in \cite{lee2011geo})}.

	\item \highlight{We also compare the geometric $L_1$ with a traditional Euler $L_1$ and numerically establish that the Geometric $L_1$ outperforms the Euler $L_1$.
    \item Finally, we present experimental results to show the tracking performance of the $L_1$ adaptive control w.r.t. the baseline geometric PD controller (\textit{without} $L_1$).
\end{enumerate}

\subsection{\rebuttal{Organization}}
The rest of the paper is structured as follows. Section~\ref{section: quad_dynamics} revisits the dynamics and control of quadrotor on SE(3). Section~\ref{sec:disturb} defines dynamics in the presence of disturbances and model uncertainties and presents the dynamics in terms of attitude tracking errors. Section~\ref{section: control} proposes a reference model without any uncertainties and defines attitude errors between the actual model and reference model. It proposes the Geometric $L_1$ adaptive control method. Section~\ref{section:sim} shows the simulation results of a quadrotor under various disturbances and uncertainties, while Section~\ref{sec:exp} presents the experimental results. Section~\ref{section: con} summarizes the work presented and provides concluding remarks.

\section{$L_1$ Scheme}

\section{Mathematical Background}
\editWu{I will revise this section once I am done with it }
\subsection{Singular Perturbations}
\label{section:perturbations}
A standard {\it singular perturbation model} {\color{red} Tikhonov's theorem [CITE]} for a dynamical system is given by the following model \cite{khalil1996nonlinear},
\begin{equation}
\label{eq:sing1}
\dot{x} = f(t,x,z,\varepsilon),
\end{equation}
\begin{equation}
\label{eq:sing2}
\varepsilon \dot{z} = g(t,x,z,\varepsilon),
\end{equation}
where $x$ and $z$ are two different set of system states and $f$ and $g$ are continously differentiable with respect to their arguments $t$, $x$, $z$ and $\varepsilon$. Domain for the given system is given as,
\begin{equation*}
(t,x,z,\varepsilon) \in [0,t_1]\times D_x \times D_z \times [0,\varepsilon_0],
\end{equation*}
where $D_x \subset \mathbb{R}^n$ and $D_z \subset \mathbb{R}^m$ are open connected sets and $t_1\in \mathbb{R}$, $\varepsilon_0 \in \mathbb{R}$.

Setting $\varepsilon=0$, results \eqref{eq:sing2} into the following algebraic equation,
\begin{equation}
\label{eq:sing3}
0 = g(t,x,z,\varepsilon).
\end{equation}

The dynamics of the system, \eqref{eq:sing1}, \eqref{eq:sing2} degenerates into the dynamics given in \eqref{eq:sing1} and the algebraic equation \eqref{eq:sing3}. Dimension of the system reduces from $n+m$ to $n$. The positive real roots for \eqref{eq:sing3} can be expressed as,
\begin{equation}
z = h_i(t,x),\quad i=1,2,\hdots,k,\quad k\geq 1,
\end{equation}
for $t\in [0,t1]$ and $x\in D_x$. Dynamics of the system corresponding to a well-defined root $h_i$ is,
\begin{equation}
\label{eq:sing4}
\dot{x} = f(t,x,h_i(t,x),0).
\end{equation}

We have $\dot{z} = g/\varepsilon$ from \eqref{eq:sing2}, thus, having a very small $\varepsilon$ tending to zero, results in a very high value for $\dot{z}$, for $g\neq 0$, implying that the system may converge to the roots of \eqref{eq:sing3} rapidly. As stated in \cite{khalil1996nonlinear}, the dynamics given in \eqref{eq:sing4} is called {\it the slow model}.

{\color{red} have to write a connecting paragraph}
Performing a change of variable, with $y = z-h(t,x)$, scaling the time $t$, such that we get a new variable $\tau = \frac{t-t_)}{\varepsilon}$, where $t_0$ is the initial time and setting the value of $\varepsilon$ to zero, we get,
\begin{equation}
\label{eq:boundary}
\frac{\partial y}{\partial \tau} = g(t,x,y+h(t,x),0),
\end{equation}
where $(t,x)\in [0,t_1]\times D_x$ is constant w.r.t. $\tau$. This above equation is refered to as boundary layer system.

{\color{red} the following paragraph is exactly copied from Khalil book}
\begin{thm}
\label{thm1}
Singular perturbation model,
\begin{equation}
\dot{x} = f(t,x,z,\varepsilon),\quad x(t_0)=\xi(\varepsilon),
\end{equation}
\begin{equation}
\varepsilon\dot{z} = g(t,x,z,\varepsilon),\quad z(t_0)=\eta(\varepsilon),
\end{equation}
where, the initial conditions for $x(t_0)$ and $z(t_0)$ are smooth functions of $\varepsilon$ given by $\xi(\varepsilon)$ and $\eta(\varepsilon)$ respectively. Let $z = h(t,x)$ be an isolated root of \eqref{eq:sing3}. We assume that the following conditions are satisfied for all,
\begin{equation*}
[t,x,z-h(t,x),\varepsilon]\in [0,\infty)\times D_x \times D_y \times [0,\varepsilon_0]
\end{equation*}
for some domains $D_x \subset \mathbb{R}^n$ and $D_y\subset \mathbb{R}^m$, which contain their origins:
\begin{itemize}
\item On an compact subset of $D_x\times D_y$, the functions f, g, their first partial derivatives with respect to $(x, z, \varepsilon)$, and the first partial derivative of with respect to $t$ are continous and bounded. $h(t,x)$ and $[\partial g(t,x,z,0)/\partial z]$ have bounded first partial derivatives with respect to their arguments, and $[\partial f(t,x,h(t,x),0)/\partial x]$ is Lipschitz in $x$, uniformly in t;

\item the origin is an exponentially stable equilibrium point of the reduced system \eqref{eq:sing4}; there is a Lyapunov function $V(t,x)$ that satisfies the conditions of a exponential stable function for $(t,x)\in[0,\infty)\times D_x$ and $\{W_1(x)\leq c\}$ is a compact subset of $D_x$;

\item the origin is an exponentially stable equilibrium point of the boundary-layer system \eqref{eq:boundary}, uniformly in (t,x); let $R_y \subset D_y$ be the region of attraction of $\partial y/\partial \tau = g(t,x,y+h(t,x),0)$ and $\Omega_x$ be compact subset of $R_y$.
\end{itemize}

Then, for each compact set $\Omega_x\subset \{W_2(x) \leq \rho c, 0\leq \rho <1\}$ there is a positive constant $\varepsilon^*$ such that for all $t_0\geq 0$, $\xi_0 \in \Omega_x$, $\eta_0 - h(t_0,\xi_0)\in \Omega_y$, and $0<\varepsilon<\varepsilon*$, the singular perturbations model has a unique solution $x(t,\varepsilon)$, $z(t,\varepsilon)$ on $[t_0, \infty)$, and
\begin{equation}
x(t,\varepsilon) - \bar{x}(t) = O(\varepsilon)
\end{equation}
\begin{equation}
z(t,\varepsilon) - h(t,\bar{x}(t)) - \hat{y}(t/\varepsilon) = O(\varepsilon)
\end{equation}
hold uniformly for $t\in [t_0, \infty)$, where $\bar{x}(t)$ and $\hat{y}(\tau)$ are the solutions of the reduced and boundary-layer problems
\begin{equation*}
\dot{x} = f(t,x,h(t,x),0),\quad x(t_0)=\xi_0 \equiv	\xi(0)
\end{equation*}
and
\begin{equation*}
\frac{\partial y}{\partial \tau} = g(t_0,\xi_0, y+h(t_0,\xi_0),0),\quad y(0) = \eta(0)-h(t_0,\xi_0).
\end{equation*}
Moreover, given $t_b > t_0$, there is $\varepsilon^{**}\leq \varepsilon^*$ such that
\begin{equation}
z(t,\varepsilon)-h(t,\bar{x}(t)) = O(\varepsilon)
\end{equation}
holds uniformly for $t\in [t_b,\infty)$ whenever $\varepsilon < \varepsilon^{**}$.
\end{thm}

Proof for the above theorem is given in \cite{khalil1996nonlinear}.

\section{Numerical Validation}
\label{section:sim}

In this section, we present numerical examples to validate the controller presented in the previous section. We discuss the performance of geometric $L_1$ control compared to geometric control \textit{without} $L_1$ \highlight{(geometric PD control) \cite{lee2011geo}}. Two different scenarios are considered to evaluate the performance of geometric $L_1$ controller. {We also compare geometric $L_1$ control performance to Euler angle $L_1$ control to present a better insight into the performance of geometric control.}

The following system properties are considered, $m = 1.129kg$, $J =diag([6.968,\,6.211,\,10.34])\times10^{-3} kg \cdot m^{2}$,
and the following control parameters are used,
$ k_{x} = 4, k_{v} = 3.2, k_{R}=\tilde{k}_R = 2, k_{\Omega}=\hat{k}_{\Omega}=\tilde{k}_{\Omega} = 0.25.
$
A first-order low-pass filter of form, $
C(s) = \frac{a}{s + a}$, is used with $a=2$ and an adaptation gain of $\Gamma = 10^{6}I_{3\times3}$.

We present simulations for a quadrotor tracking a desired circular trajectory given below,
\begin{equation}
\label{eq:circ_traj}
\highlight{x(t) = [\rho\cos(\omega t),\, \rho\sin(\omega t),\, 0]^T,\, \psi(t)=0,}
\end{equation}

where $\highlight{\rho=1}$, $\omega = 2$. The two different scenarios considered are, (i) a constant external disturbance and (ii) a time varying disturbance. In both scenarios, we consider a mass $m_a=0.5kg$ attached to the quadrotor at $r=[0.2, 0.2, 0.2]^Tm$ in the body frame, this added mass and its location is unknown to the controller. Presence of this added mass will also result in a moment about the center-of-mass due to gravity. Thus the external disturbance due to the mass is given as,
\begin{align}
\label{eq:theta_e_1}
\theta_e = m_ag(r\times R^T\bm{e_3})
\end{align}
and the inertia is
\rebuttal{
\begin{align}
{\bar{J}}=J+J_{m_a}, \label{eq:true_inertial_calc}
\end{align}
where, $\bar{J}$ is the true inertia used in simulating the dynamics of the \textit{true model}\, and $J$ is the nominal inertia used to calculate the control moment and $J_{m_a}= -m_a(\hatmap{r})^2$ is inertia tensor due to $m_a$ in the body-frame.}

\begin{figure}
    \centering
    \begin{subfigure}[t]{0.5\columnwidth}
        \centering
        \includegraphics[width=\columnwidth]{config_errors_1a}
        \caption{Configuration Errors for $L_1$: $\Psi\text{ vs }\hat{\Psi}\text{ vs }\tilde{\Psi}$}
        \label{fig_sim_1a}
    \end{subfigure}%
    ~
    \begin{subfigure}[t]{0.5\columnwidth}
        \centering
        \includegraphics[width=\columnwidth]{config_errors_1b}
        \caption{Configuration Errors: $L_1$ vs without $L_1$}
        \label{fig_sim_1b}
    \end{subfigure}

    \begin{subfigure}[t]{0.5\columnwidth}
        \centering
        \includegraphics[width=\columnwidth]{ang_vel_error_1a}
        \caption{Angular Velocity Errors for $L_1$: $e_{\Omega}\text{ vs }\hat{e}_{\Omega}\text{ vs }\tilde{e}_{\Omega}$}
        \label{fig_sim_1c}
    \end{subfigure}%
    ~
    \begin{subfigure}[t]{0.5\columnwidth}
        \centering
        \includegraphics[width=\columnwidth]{ang_vel_error_1b}
        \caption{Angular Velocity Errors: $L_1$ vs without $L_1$}
        \label{fig_sim_1d}
    \end{subfigure}
    \caption{\textit{Circular Trajectory - Case I}: Comparison of errors between \textit{true model}\, and \textit{reference model}\, in the presence of constant external disturbance $\theta_t = [.95,.25,-.5]^T$ and model uncertainty ($m_a=0.5kg$ at $r = [0.2,0.2,0.2]\highlight{^T}m$). Subfigures \ref{fig_sim_1a} \& \ref{fig_sim_1c} show that $\tilde{\Psi}$ and $\|\tilde{e}_{\Omega}\|$ decrease to zero even though the \textit{true model}~and \textit{reference model}~are initialized to different values (see \ref{fig_sim_1a}). Subfigures \ref{fig_sim_1b} and \ref{fig_sim_1d} show that the errors do not converge to zero in case of geometric  control \textit{without} $L_1$ (i.e, Geometric control without the $L_1$ adaptation law).}
    \label{fig:circ_case_b_errors}
\end{figure}

\begin{figure}
\centering
\includegraphics[width=1\columnwidth]{circ_case_b_theta2.eps}
\caption{\textit{Circular Trajectory - Case I}: Uncertainty in the system calculated using \eqref{eq:theta_def}. }
\label{fig:circ_case_b_theta}
\end{figure}

\begin{figure}
\centering
\includegraphics[width=1\columnwidth]{circ_case_b_traj.eps}
\caption{\textit{Circular Trajectory - Case I}: Trajectory response for the two controllers defined earlier. Note that the geometric control \textit{without $L_1$} and with model uncertainty resulted in an unstable response (shown in red).}
\label{fig:circ_case_b_traj}
\end{figure}

\subsection{Geometric $L_1$ control vs Geometric control $\textit{without } L_1$}
\subsubsection{Case I: Constant External Disturbance $\theta_e$}
External disturbance of $\theta_t= [0.95,0.25,-0.5]^{T} \textit{Nm}$ in the body-frame is considered. $\theta_t$ along with an off-center added mass results in,
\begin{equation}
\label{eq:theta_e_sim}
\theta_e=[0.95,0.25,-0.5]^{T} + m_ag(r\times R^T\bm{e_3})\textit{Nm}.
\end{equation}
Note that, this value is unknown to the controller. The initial condition for the controller is almost an inverted case with a roll of $178^{\circ}$. Figure~\ref{fig:circ_case_b_errors} shows different errors in the system, including the errors between the \textit{true model}~and the \textit{reference model}~in the sub-figures \ref{fig_sim_1a} and \ref{fig_sim_1c}. Comparison between the controllers with $L_1$ and without $L_1$ are shown in the subfigures \ref{fig_sim_1b} and \ref{fig_sim_1d}. As shown in these figures, only $L_1$ control errors converge to zero.

Figure~\ref{fig:circ_case_b_theta} shows the uncertainty $\theta$ in the system, along with the predicted disturbance $\hat{\theta}$ and the filtered disturbance $C(s)\hat{\theta}$. As shown in the figure, the unfiltered uncertainty estimate is noisy while the filtered uncertainty estimate closely follows the actual uncertainty.

The quadrotor position, $x$, using the two different Controllers $L_1$, $\textit{without }L_1$ is shown in Figure~\ref{fig:circ_case_b_traj}. Note that the control $\textit{without }L_1$ fails to track the desired trajectory due to the large unknown model uncertainty in the system.

\subsubsection{Case II: Time varying disturbance $\theta_e(t)$}
Here, we consider a time varying disturbance along with model uncertainty. The following expressions denote the external disturbance used in this simulation example:
\begin{align}
\theta_t =& \frac{1}{2}(\cos(t)+0.5\cos(3t+0.23)\nonumber \\
&+0.5\cos(5t-0.4)+0.5\cos(7t+2.09), \label{eq:time_varying_theta}\\
\theta_e =&\theta_t + m_ag(r\times R^T\bm{e_3}).
\end{align}

\begin{figure}
    \centering
    \begin{subfigure}[t]{0.5\columnwidth}
        \centering
        \includegraphics[width=\columnwidth]{config_errors_2a}
        \caption{Configuration Errors for $L_1$: $\Psi\text{ vs }\hat{\Psi}\text{ vs }\tilde{\Psi}$}
        \label{fig_sim_2a}
    \end{subfigure}%
    ~
    \begin{subfigure}[t]{0.5\columnwidth}
        \centering
        \includegraphics[width=\columnwidth]{config_errors_2b}
        \caption{Configuration Errors: $L_1$ vs without $L_1$}
        \label{fig_sim_2b}
    \end{subfigure}

    \begin{subfigure}[t]{0.5\columnwidth}
        \centering
        \includegraphics[width=\columnwidth]{ang_vel_error_2a}
        \caption{Angular Velocity Errors for $L_1$: $e_{\Omega}\text{ vs }\hat{e}_{\Omega}\text{ vs }\tilde{e}_{\Omega}$}
        \label{fig_sim_2c}
    \end{subfigure}%
    ~
    \begin{subfigure}[t]{0.5\columnwidth}
        \centering
        \includegraphics[width=\columnwidth]{ang_vel_error_2b}
        \caption{Angular Velocity Errors: $L_1$ vs without $L_1$}
        \label{fig_sim_2d}
    \end{subfigure}
    \caption{\textit{Circular Trajectory - Case II}: Comparison of errors between \textit{true model}\, and \textit{reference model}\, in the presence of time-varying external disturbances and model uncertainties (see \eqref{eq:time_varying_theta}, \eqref{eq:theta_e_1}). The \textit{true model}~errors and \textit{reference model}~errors did not converge to zero, however reached a bounded region about zero in case of geometric control \textit{with} $L_1$. Errors in case of geometric control \textit{without} $L_1$ are not-bounded as shown in \ref{fig_sim_2b} and \ref{fig_sim_2d}.}
    \label{fig:circ_case_c_errors}
\end{figure}
\begin{figure}
\centering
\includegraphics[width=1\columnwidth]{circ_case_c_theta2.eps}
\caption{\textit{Circular Trajectory - Case II}: Uncertainty in the system calculated using \eqref{eq:theta_def}. }
\label{fig:circ_case_c_theta}
\end{figure}
\begin{figure}
\centering
\includegraphics[width=1\columnwidth]{circ_case_c_traj.eps}
\caption{\textit{Circular Trajectory - Case II}: Trajectory response for the two controllers defined earlier. Note that the geometric $L_1$ controller is able to track the desired trajectory even in the presence of time-varying disturbances (shown in blue).}
\label{fig:circ_case_c_traj}
\end{figure}
The uncertainty due to both the time-varying disturbance and model uncertainty and the corresponding estimation through $L_1$ adaptation is shown in Figure~\ref{fig:circ_case_c_theta}. Attitude tracking errors and resultant trajectory is shown in Figures~\ref{fig:circ_case_c_errors} and ~\ref{fig:circ_case_c_traj}. From sub-figures \ref{fig_sim_2a} and \ref{fig_sim_2c} it can be noticed that the errors between \textit{true model}\, and the \textit{reference model}\,,~$\tilde{\Psi}$ converge to zero very quickly, however the error between the \textit{true model}\, and the desired trajectory $\Psi$ doesn't completely converge to zero but reaches a bounded region about zero, this corresponds to the input-to-state stability discussed in Appendix C. As seen from Figure \ref{fig:circ_case_c_traj}, $L_1$ control performs better at tracking the trajectory even in the presence of time-varying disturbances.
\highlight{\subsection{Geometric $L_1$ vs Euler $L_1$}}
\begin{figure*}
\centering
\includegraphics[width=2\columnwidth]{./euler_geo_ic2.eps}
\caption{\highlight{Comparison between Euler $L_1$ and Geometric $L_1$ \rebuttal{for various initialization errors}: Attitude configuration error, $\Psi$, after $3$ sec. of simulation for different added mass $\bm{m_a}$, different initial roll angle errors between reference model and the desired, $\hat \phi(0) - \phi_d(0)$, and between true model and desired, $\phi(0) - \phi_d(0)$.
Initial roll angles for \textit{true model}~$\phi(0)$ and \textit{reference model}~$\hat{\phi}(0)$ are swept from $0^\circ$ to $179^\circ$ with $5^\circ$ increments, while the desired angles are $roll\equiv\phi_d\equiv~pitch{\equiv}~yaw{\equiv}0^\circ$. Note, that geometric $L_1$ works for all considered configuration errors while the Euler $L_1$ failed for larger configuration errors (shown in grey). With increased added mass, $\Psi$ increases and the range of errors for which the Euler $L_1$ control works decreases. }

\label{fig:evsg1}
\end{figure*}

\highlight{In order to establish the need for the geometric $L_1$ control,
in this section we study and compare the initial condition response of Euler $L_1$ and geometric $L_1$. Similar to geometric $L_1$, an Euler $L_1$ control consists of a \textit{reference model}~and a \textit{true model}~, with the control moment computed using Euler angles and body-rates. The $L_1$ adaptation is implemented by considering a Lyapunov candidate for the Euler dynamics.
In order to keep the comparison fair and avoid singularities, both controllers are simulated with the geometric rotational dynamics in \eqref{eq:R}-\eqref{eq:Omega}. }

\highlight{
We consider initial condition responses for several different initial roll angle errors between the \textit{reference model}~and the \textit{desired}, $\hat{\phi}(0)-\phi_d(0)$, and the \textit{true model}~and the \textit{desired}, $\phi(0)-\phi_d(0)$, for various added masses $\bm{m_a} \in \{0, 250g, 500g\}$.  We keep all other errors zero and consider zero desired angles, $roll\equiv\phi_d{\equiv}0^\circ,~pitch{\equiv}0^{\circ},~yaw{\equiv}0^\circ$. We ran the simulations varying $\hat{\phi}(0)-\phi_d(0)$ and $\phi(0)-\phi_d(0)$ from $0^\circ$ and $179^\circ$ in $5^\circ$ increments. The attitude configurations $\Psi$ after 3 seconds of simulations is shown in Figure~\ref{fig:evsg1} indicated by the colormap.  Each of the plots in Figure~\ref{fig:evsg1} illustrate $37 \times 37 \times 3 = 4107$ simulations.}

\highlight{We infer the following observations from the Figure,
\begin{enumerate}[{\it (i)}]
    \item Euler $L_1$ fails for larger attitude errors (shown in grey in the Figure), while geometric $L_1$ works for all considered configuration errors.
    \item Attitude configuration errors $\Psi$ increases with increasing model uncertainty (i.e., the added mass $\bm{m_a}$)
    \item The range of errors for which the Euler $L_1$ control works decreases with increased added mass $\bm{m_a}$
    \item Also, note that in the case of no added mass ($\bm{m_a}=0$), Euler $L_1$ works for all initial angles when \textit{reference model}~and \textit{true model}~ are initialized to the same angle, i.e., $\phi(0)=\hat{\phi}(0)$ corresponding to the diagonal line.
\end{enumerate}}

\highlight{\subsection{Step Input Response}
\label{sec:step-input-response}
In the section, we study the step response for geometric $L_1$ as well as other controllers.  We consider a step input change in desired angles $roll{=}30^\circ$, $pitch{=}30^{\circ}$, $yaw{=}30^\circ$, along with an uncertainty of $0.5kg$ added mass and a time-varying disturbance. We compare the performance of geometric $L_1$, geometric $PD$ \textit{without } $L_1$, and geometric $PID$ \cite{goodarzi2013geometric} (\textit{without } $L_1$). We compare these controllers both without and with an input saturation of $5$ Nm.
The PD gains for all three controllers are chosen the same.
The integral gain for the PID was increased to achieve the best performance for the case of no input saturation, and for the case of input saturation, the integral gain was chosen so that the input is just below the saturation in order to avoid integral windup.  The resulting step responses are shown in Figure~\ref{fig:step_responses}.
As seen from the Figure, the geometric $L_1$ control outperforms the geometric PD and also has a better transient performance than the geometric PID, irrespective of input saturation.  Furthermore, the geometric $L_1$ has a better steady-state performance compared to the geometric PID (with input saturation) and a similar steady-state performance compared to the geometric PID (without input saturation).

It is important to note that comparing different controllers is difficult as it involves tuning several parameters. For instance, PID control depends on the integral gain, while $L_1$ control depends on the adaptation gain and the cut-off frequency. In order to have a fair comparison, we applied the same input saturation to all controllers and studied their step response performance.}
\begin{figure}
    \centering
    \begin{subfigure}[t]{0.49\columnwidth}
        \centering
        \includegraphics[width=\columnwidth]{step_response_angle1}
        \caption{With Input Saturation}
        \label{fig_sim_2a}
    \end{subfigure}%
    ~
    \begin{subfigure}[t]{0.49\columnwidth}
        \centering
        \includegraphics[width=\columnwidth]{step_response_angle3}
        \caption{Without Input Saturation}
        \label{fig_sim_2b}
    \end{subfigure}
    \caption{\highlight{Step response comparison between different controls $(i)$ Geometric $L_1$, $(ii)$ Geometric PD $\textit{without }L_1$, $(iii)$ Geometric PID ($\textit{without }L_1$). Following desired Euler angles $roll{=}30^\circ$, $pitch{=}30^{\circ}$, $yaw{=}30^\circ$ are considered with added mass $\bm{m_a}=0.5kg$ and a time-varying disturbance. Note that PID control improves the steady-state performance when there is no input saturation, however, $L_1$ control has better transient performance in both cases.}}
    \label{fig:step_responses}
\end{figure}

redpajama_set_name: RedPajamaArXiv


text:
Planomonospora is a genus in the phylum Actinomycetota (Bacteria).

Etymology
The name Planomonospora is derived from ancient Greek. Planos meaning wanderer or vagabond, monos meaning solitary, single and spora meaning a seed, or in biological context a spore. The name therefore describes a motile organism with a single endospore.

Species
The genus contains four species.
 Planomonospora alba Mertz 1994
 Planomonospora parontospora Thiemann et al. 1967
 Planomonospora sphaerica Mertz 1994
 Planomonospora venezuelensis Thiemann 1970

See also
 Bacterial taxonomy
 Microbiology

References

Bacteria genera
Actinomycetales

redpajama_set_name: RedPajamaWikipedia


text:
Q: Randomize letter color in javascript I am trying to create a script that gives each individual letter inside "p" tags on my website a random color. The coloring part works fine, the problem is that my script overwrites "br" and "a" tags. Is there any workaround for this?
Here is my code so far:

function changeColor() {
    var paragraphs = document.getElementsByTagName("p");

    for(var i = 0; i < paragraphs.length; i++)
    {
        var innerText = paragraphs[i].innerText;
        var innerTextSplit = innerText.split("");
        paragraphs[i].innerText = ""

        for(var j = 0; j < innerTextSplit.length; j++) {
            var randomColor = "rgb(" + Math.floor((Math.random() * 255) + 1) + ", " + Math.floor((Math.random() * 255) + 1) + ", " + Math.floor((Math.random() * 255) + 1) + ");"

            innerTextSplit[j] = '' + innerTextSplit[j] + '';
            paragraphs[i].innerHTML += innerTextSplit[j];
        }
    }
}

Any help is greatly appreciated, thanks in advance :)
-jAndersen

A: Please find below snippet there is one function getRandomColor() for generating random color hexa code

$(function(){
changeColor();
});

function changeColor() {
    var paragraphs = document.getElementsByTagName("p");

    for(var i = 0; i < paragraphs.length; i++)
    {
        var innerText = paragraphs[i].innerText;
        var innerTextSplit = innerText.split("");
        paragraphs[i].innerText = ""

        for(var j = 0; j < innerTextSplit.length; j++) {
            var randomColor =getRandomColor();

            innerTextSplit[j] = '' + innerTextSplit[j] + '';
            paragraphs[i].innerHTML += innerTextSplit[j];
        }
    }
}

function getRandomColor() {
    var letters = '0123456789ABCDEF';
    var color = '#';
    for (var i = 0; i < 6; i++ ) {
        color += letters[Math.floor(Math.random() * 16)];
    }
    return color;
}

geloosmsd

geloosmsd

geloosmsd

geloosmsd

geloosmsd

geloosmsd

geloosmsd

geloosmsd

geloosmsd

geloosmsd

geloosmsd

geloosmsd

A: Not elegant, but try:
function changeColor() {
var paragraphs = document.getElementsByTagName("p");

for(var i = 0; i < paragraphs.length; i++)
{
    var innerText = paragraphs[i].innerHTML;
    var innerTextSplit = innerText.split("");
    paragraphs[i].innerText = "";

    var isHTMLElement = false;

    for(var j = 0; j < innerTextSplit.length; j++) {
        if(innerTextSplit[j] == "<")
          isHTMLElement = true;

        if(!isHTMLElement){
          var randomColor = "rgb(" + Math.floor((Math.random() * 255) + 1) + ", " + Math.floor((Math.random() * 255) + 1) + ", " + Math.floor((Math.random() * 255) + 1) + ");"
          innerTextSplit[j] = '' + innerTextSplit[j] + '';
        }

        if(innerTextSplit[j] == ">")
            isHTMLElement = false;

    }

    innerTextSplit = innerTextSplit.join('');
    paragraphs[i].innerHTML += innerTextSplit;
}
}

redpajama_set_name: RedPajamaStackExchange


The many species of showy flowering plants in the genus hydrangea include shrubs, vines and small trees. The cultivars in tree form are the rapidly growing deciduous species Hydrangea paniculata, which grow white flowers in clusters that turn purplish-pink with age. You can grow these lovely hydrangeas in U.S. Department of Agriculture plant hardiness zones 3 through 8.
Hydrangeas are classified as rapid growers, or 25 or more inches per year until the plant reaches maturity. A "tree" format plant will become at least 3 inches wide at a point 4 1/4 feet high and grow at least 13 feet high. By that definition, at least three cultivars of Hydrangea paniculata are large enough to qualify as trees.
Hydrangea paniculata cultivars growing more than 2 feet a year will quickly fill a space. You may want to consider how close to plant a hydrangea tree to a patio, building, sidewalk or driveway. You'll need to know ahead of time how high and how wide that particular cultivar can grow.
The popular 'Peegee' (Hydrangea paniculata 'Grandiflora') is typically available in both shrub and tree forms. It will grow from 10 to 20 feet high with a canopy 10 to 20 feet wide. Two more paniculata cultivars qualify as tree forms. 'Tardiva' (Hydrangea paniculata 'Tardiva') grows from 10 to 15 feet tall with a canopy 18 to 20 feet wide. 'Praecox' (Hydrangea paniculata 'Praecox') grows 10 to 15 feet high and 10 to 15 feet wide. You can prune these hydrangeas to shape them into trees with single or multiple trunks.
Urban growing conditions suppress the growth rate of many plants. Hydrangea paniculata cultivars are not among them. They will grow rapidly in partial shade to full sun and will tolerate air pollution. These hydrangeas like organically rich soil with medium moisture that drains well. If you want a hydrangea tree to grow rapidly and flourish, do not plant it where it will be growing in the shade all day. A hydrangea in the shade may not blossom or may look scraggly.
Hoyt, Richard. "The Growth Rate of the Hydrangea Tree." Home Guides | SF Gate, http://homeguides.sfgate.com/growth-rate-hydrangea-tree-69567.html. 28 November 2018.


text:
package com.beanframework.accountpolicy.service;

import java.util.ArrayList;
import java.util.List;
import java.util.UUID;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.annotation.CacheConfig;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import com.beanframework.accountpolicy.AccountpolicyConstants;
import com.beanframework.accountpolicy.domain.Accountpolicy;
import com.beanframework.accountpolicy.domain.AccountpolicyRepository;
import com.beanframework.accountpolicy.domain.AccountpolicySearchCriteria;
import com.beanframework.accountpolicy.domain.AccountpolicySpecification;
import com.beanframework.platform.core.base.BaseService;

@Service
@Transactional(readOnly = true)
@CacheConfig(cacheNames = AccountpolicyConstants.CACHE_ACCOUNTPOLICIES)
public class AccountpolicyService extends BaseService {

	@Autowired
	private AccountpolicyRepository AccountpolicyRepository;

	public boolean isAccountpolicyExists(UUID uuid) {
		return AccountpolicyRepository.isAccountpolicyExists(uuid);
	}

	public boolean isNameExists(String name) {
		return AccountpolicyRepository.isNameExists(name);
	}

	public List<Accountpolicy> find(UUID... ids) {

		List<Accountpolicy> Accountpolicys = new ArrayList<Accountpolicy>();

		if(ids == null){
			return Accountpolicys;
		}

		for (UUID uuid : ids) {
			Accountpolicys.add(findByUuid(uuid));
		}

		return Accountpolicys;
	}

	public Accountpolicy findByUuid(UUID uuid) {

		if (!isAccountpolicyExists(uuid)) {
			return null;
		}

		Accountpolicy Accountpolicy = AccountpolicyRepository.findOne(uuid);
		return Accountpolicy;
	}

	public Accountpolicy findByName(String name) {

		if (!isNameExists(name)) {
			return null;
		}

		return AccountpolicyRepository.findByName(name);
	}

	public List<Accountpolicy> findAllAccountpolicys() {
		return AccountpolicyRepository.findAll();
	}

	public Page<Accountpolicy> findAllAccountpolicys(AccountpolicySearchCriteria searchCriteria, Pageable pageable) {
		if (searchCriteria == null) {
			return AccountpolicyRepository.findAll(pageable);
		} else {
			return AccountpolicyRepository.findAll(AccountpolicySpecification.findByCriteria(searchCriteria), pageable);
		}
	}

	@Transactional(readOnly = false)
	public Accountpolicy save(Accountpolicy Accountpolicy) {
		return AccountpolicyRepository.save(Accountpolicy);
	}

	@Transactional(readOnly = false)
	public void delete(UUID uuid) {
		AccountpolicyRepository.delete(uuid);
	}

	@Transactional(readOnly = false)
	public void deleteByName(String name) {
		AccountpolicyRepository.deleteByName(name);
	}

	@CacheEvict(allEntries = true)
	@Transactional(readOnly = false)
	public void deleteAll() {
		AccountpolicyRepository.deleteAll();
	}
}

redpajama_set_name: RedPajamaGithub


text:
Villars-le-Sec () is a commune in the Territoire de Belfort department in Bourgogne-Franche-Comté in northeastern France.

Politics and administration

See also

Communes of the Territoire de Belfort department

References

Communes of the Territoire de Belfort


Kendraw LilyYoung69X livejasmin. ambam97. Vyvi. KellyMonroe.
MaddeLynneMAXXIMUSX0FUCKINGHOT0LindzyLuv .VyviBritneyCastellohappiness777Lukesexyboy0994 .ArchiteepAngelMarkmegken25Peachie .ambam97FhobiaTeoPrettyCuteAsiaBIGcockMARIEL .KayneWilsonKayneWilsonILITIASEXYValeryEbony .LindzyLuvambam97RainsongZarinaX .belloRyan69TUNDERmasterDanielaRios2PrettyCuteAsia .Tron69KaisyPrinceZhenyaHotBoyNancyMacey .SugarxxxxhotcutyXXXangelhappiness777MistressCOCOxxl .YARCEANDKEVINMistressCOCOxxlRoseMaryKisseSLinella .ExcoticBarbaraXNakedLustRosaRossalyinda1Saoni .
BlondeElisssLeSliE8InCH4UTUNDERmasterExcoticBarbaraX .AspasiaLuvApricot1LianaLupeDanielaRios2 .DiannaMonroeDanielaRios2LianaLupeKellyMonroe .naughtydolliLilMaryKateAndAnetteTirelessBrooke .love888DesireDiamondLindzyLuvbeautifuldwarf .RosaRossalyinda1ZarinaXDiannaMonroeGreyana .a0ChampionLarryxxDREAMcumTRUExxxxDREAMcumTRUExxTiifanyx .GraceShawcutyXXXangelApricot1GraceShaw .ArchiteepValeryEbonyTUNDERmastermegken25 .WantedKellyVyvinaughtydolliExcoticBarbaraX .SoniaDanielsAmyTaylerrRainsongSszeBSsexylove .


text:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Frameset//EN""http://www.w3.org/TR/REC-html40/frameset.dtd">

<META http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<TITLE>
HttpClient 3.0.1 API: Uses of Class org.apache.commons.httpclient.methods.EntityEnclosingMethod
</TITLE>
<LINK REL ="stylesheet" TYPE="text/css" HREF="../../../../../../stylesheet.css" TITLE="Style">

      Overview
      Package
      Class
    Use
      Tree
      Deprecated
      Index
      Help

 PREV
 NEXT

  FRAMES
 NO FRAMES

Uses of Class
org.apache.commons.httpclient.methods.EntityEnclosingMethod

Packages that use EntityEnclosingMethod

org.apache.commons.httpclient.methods
Classes implementing HttpMethod for the base HTTP methods.

Uses of EntityEnclosingMethod in org.apache.commons.httpclient.methods

Subclasses of EntityEnclosingMethod in org.apache.commons.httpclient.methods

 class
PostMethod

          Implements the HTTP POST method.

 class
PutMethod

          Implements the HTTP PUT method.

      Overview
      Package
      Class
    Use
      Tree
      Deprecated
      Index
      Help

 PREV
 NEXT

  FRAMES
 NO FRAMES

Copyright © 2001-2006 Apache Software Foundation. All Rights Reserved.


text:
package org.apache.camel.component.jdbc;

import javax.sql.DataSource;

import org.apache.camel.builder.RouteBuilder;
import org.apache.camel.component.mock.MockEndpoint;
import org.apache.camel.impl.JndiRegistry;
import org.apache.camel.test.junit4.CamelTestSupport;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.datasource.DriverManagerDataSource;

/**
 * Unit test based on user forum request about this component
 */
public class JdbcAnotherRouteTest extends CamelTestSupport {
    private String driverClass = "org.hsqldb.jdbcDriver";
    private String url = "jdbc:hsqldb:mem:camel_jdbc";
    private String user = "sa";
    private String password = "";
    private DataSource ds;

    @Test
    public void testTimerInvoked() throws Exception {
        MockEndpoint mock = getMockEndpoint("mock:result");
        mock.expectedMessageCount(1);

        mock.assertIsSatisfied();
    }

    protected JndiRegistry createRegistry() throws Exception {
        JndiRegistry reg = super.createRegistry();
        reg.bind("testdb", ds);
        return reg;
    }

    protected RouteBuilder createRouteBuilder() throws Exception {
        return new RouteBuilder() {
            public void configure() throws Exception {
                from("timer://kickoff?period=10000").
                    setBody(constant("select * from customer")).
                    to("jdbc:testdb").
                    to("mock:result");
            }
        };
    }

    @Before
    public void setUp() throws Exception {
        DriverManagerDataSource dataSource = new DriverManagerDataSource(url, user, password);
        dataSource.setDriverClassName(driverClass);
        ds = dataSource;

        JdbcTemplate jdbc = new JdbcTemplate(ds);
        jdbc.execute("create table customer (id varchar(15), name varchar(10))");
        jdbc.execute("insert into customer values('cust1','jstrachan')");
        jdbc.execute("insert into customer values('cust2','nsandhu')");
        super.setUp();
    }

    @After
    public void tearDown() throws Exception {
        super.tearDown();
        JdbcTemplate jdbc = new JdbcTemplate(ds);
        jdbc.execute("drop table customer");
    }

}


Over the weekend, Microsoft teams accompanied by United States marshals raided buildings and seized hundreds of web addresses to shut down a major botnet syndicate. The sting was part of a civil suit brought by Microsoft—because it was tired of waiting for law enforcement bodies to act.
The New York Times reports that the raids were masterminded by Richard Boscovich, "a former federal prosecutor who is a senior lawyer in Microsoft's digital crimes unit." Botnets—collections of compromised computers used for malicious purposes—are notoriously hard to take down.
"On Friday, Microsoft was attacking its most complex target yet, known as the Zeus botnets. The creators of Zeus offer their botnet code for sale to others and, depending on the level of customer support and customization of the code that clients require, charge them $700 to $15,000 for the software, Microsoft said in a lawsuit filed in federal court in Brooklyn on March 19.
"Microsoft does not believe the operators of the facilities it raided on Friday, which rent space to clients on computers connected to the Internet, are in league with the people behind the botnets. And those operators said they had no idea that equipment inside their facilities was being used to issue commands to Zeus."


Receiving an official Disney name tag is a magical day for Disney cast members at all Disney destinations. Have you ever wondered how the name tag tradition got started, or how Disney makes all those name tags?
The iconic "first name only" name tags were a tradition inspired by Walt Disney himself, who wanted cast members to call each other by their first names to create a family friendly atmosphere. Pretty smart huh? Watch the video below and take a behind the scenes look at this iconic process.
The Engraving Shop at Walt Disney World creates more than 100,000 new name tags each year for cast members at theme parks, Disney Springs, Disney Cruise Line, Walt Disney Imagineering and more. That's roughly 400 name tags a day!
Are you a Disney cast member? Share a picture of your name tag with us below.
Find these tips helpful and would like some more to make your Disney vacation the most magical and stress-free ever? As an agent with MickeyTravels, I'll be on hand to help you with everything from finding your perfect package to nabbing those hard-to-get dining and FastPass reservations. I work with all Disney Destinations. Best of all, my services are absolutely FREE. Get in touch at 1.770.800.6500, via email at kkelly@mickeytravels.com or follow along on Facebook.
Best Food and Drinks from the 2018 Epcot Food and Wine Festival!


text:
Kings of Old
by Sarah Delahaye
The palace was on fire, everything around him burning, and he could feel the heat on his skin - searing the hair on his arms, and he could hear people screaming and yelling out in the hallway and from the floors below. The door to the room burst open and a terrified looking young woman ran in dragging another boy by the hand; he was covered in soot, with tears leaving smudgy trails as they ran down his face. The woman ran across the room, grabbed him by the arm and pulled him out through the door and into the hallway. There were people running in every direction, and they were jostled constantly by people passing in both directions, terror etched onto everyone's face. The smell of smoke was so thick it got in his eyes, making them sting, causing them to tear up and for his vision blur. As they reached the end of the hallway a man in a black hooded cloak appeared at the top of the stairs; he was holding a sword, with a bow and quiver strapped to his back. He was young, bulky, rugged, and he wore a blue soldier's uniform with a Captain's emblem on the breast. He greeted the woman with a curt nod, turned on his heel and swept back down the stairs, his cloak sweeping out behind him, and grunted over his shoulder, "Keep up." The woman followed as quickly as she could, still dragging the petrified boys behind her. The staircase was long and winding and it covered many floors, but they finally reached an entrance hall that was both vast and beautiful. Although the room was filled with smoke - and parts of the walls were blackened by soot, you could still see the beautifully coloured and intricate murals painted across the walls. The mural on the furthest wall reached from floor to ceiling, and it depicted the King hunting in the forest. He was sat regally on a large white steed and he held a spear, and running from him was a gigantic boar that looked too big to be real - its tusks were at least three foot long, and lagging behind the King were several attendants and the head huntsman. The great oak front doors lay in shards on the floor; they had clearly been blown apart with some great force. Through the doorway they could see people running through the streets trying to get away from the soldiers fighting. There were men dressed in red cloaks - they seemed to have balls of light shooting from their hands, and they were fighting a large group of men dressed in the blue of the City Guard. Everything the balls touched burst into liquid blue flames, including the men trying to fend them off. Their screams echoed in the streets. The small group ran across the entrance hall, out into the street and into the tiny alleyway beside the castle. Many of the buildings surrounding the Palace were alight, and from the colour of the fire they had been caught by the balls the men in red were throwing. He was terrified, and he kept a hold of the lady's hand as tight as he could so he did not fall behind and lose them as they ran. They kept to the shadows as much as they could as they moved away from the front gates of the castle and down towards the docks, which to his relief seemed to be away from the men in red cloaks. The men in red terrified him; their faces were contorted into such evil snarls. The Captain they were following stopped at every corner so he could check each street before they entered, which made their progress excruciatingly slow, but it ensured they would not meet any enemies. As they ran out onto the last road down to the dock they could see a small boat with a heavy set man standing alongside it. When he caught sight of them he yelled, "Hurry! We must get out of here!" They hurtled towards the boat, but the lady stumbled, pushing the boys forward to continue running and the men threw the two boys in and began to untie the ropes, the boat already starting to move away. Suddenly an arrow appeared out of nowhere and pierced the woman through the chest. The boy saw the life leave her eyes as she fell forwards. He screamed. "NOOOOO!"
Dimensions : N/A
The twins Penthos and Thomas had only ever known life on the farm. Their quiet, idyllic lives are shattered when soldiers storm their small farming village, seeking to destroy them. Why does the High Lord want them dead? What deadly secret does their father hold? With their lives at stake, they join the rebels in a deadly fight for survival. The battle for their lives begins.
Sarah Delahaye grew up in the outback of Australia before moving to the UK with her mother. She has been reading fantasy novels since she was six and has drawn inspiration from all of her favorite authors and the beautiful countryside around her.

redpajama_set_name: RedPajamaCommonCrawl


Charles Herbert Allen was an American politician and businessman. After serving in state and federal elected positions, he was appointed as the first United States-appointed civilian governor of Puerto Rico when the U.S. acquired it after the Spanish–American War. He previously had served as Assistant Secretary of the Navy under President William McKinley. After returning to the U.S. from Puerto Rico, Allen headed for Wall Street and became a vice president of Morton Trust Company and its successor, the Guaranty Trust Company of New York. He formed the American Sugar Refining Company—a sugar syndicate which, by 1907, was the largest in the world. It owned or controlled 98% of the sugar processing capacity in the U.S. and was known as the Sugar Trust. Allen was treasurer of American Sugar Refining in 1910, its president in 1913, and in 1915 he joined its board of directors. In the early 21st century, the company is known as Domino Sugar.


text:
tags: programming
layout: post
title: "Small presentation about mock objects online"
---

I gave a presentation about mock objects to the Pittsburgh Perlmongers last night. It went okay (a little rushed, not enough interactivity), but not too bad for a rush job. Google image search is a presenter's best friend...

I'm lucky I went first. Having to follow Tom's excellent presenation and demo on Asterisk (and a Perl interface) would have been really tough. His presentation and the possibilities for the project really set my mind spinning, and I try to keep away from telecom stuff just because there's so much to learn... Damn those curiosity piquers!


Marriott International and YTL Hotels today announced agreements for new hotels across Asia. During an official ceremony held at The Ritz-Carlton, Kuala Lumpur, the two companies agreed to develop two new luxury hotels in Malaysia under the JW Marriott and EDITION brands and signed Memorandums of Understanding for two hotels in Japan, an EDITION and a W Hotel in Niseko Village, Hokkaido.
In Malaysia, YTL Hotels' second JW Marriott hotel will be strategically located near KL Sentral, an exclusive urban centre in the country's largest transit hub, offering guests seamless connectivity and easy access to the city's premier business and leisure destinations. The EDITION in Kuala Lumpur, Malaysia's first, will boast a prestigious address neighbouring the Kuala Lumpur City Centre (KLCC), home to the Petronas Towers, the world's tallest twin towers. The 350-key property will deliver distinctive rooms that ensure the finest contemporary luxury experience.
In Japan, the EDITION and W hotels will further complement the luxury hotel experience in the fully integrated Niseko Village. YTL Hotels' prominent presence in the powder mecca of Japan – Niseko Village in Hokkaido – is growing with the upcoming development of a Ritz-Carlton Reserve. The highly lauded ski resort currently features two existing hotels with ski-in ski-out accommodation and a collection of bespoke townhouses. It is world-renowned for its dry champagne powder snow in the winter and in the summer, guests are awed by the breathtaking wildlife, fresh harvest and a wide array of outdoor recreation including golf, trekking and horse riding.
Separately, YTL Hotels celebrated the relaunch of the 578-room JW Marriott Kuala Lumpur on 5 December after having undergone a complete refurbishment. The hotel combines contemporary elegance with the convenience of being located right in the heart of the city's Golden Triangle. The hotel is now open to guests, offering luxurious rooms and facilities.
Marriott International, Inc. (NASDAQ: MAR) today announced the company is set to open nearly 40 luxury hotels in 2018. Offering globetrotters with a truly global perspective and an unparalleled portfolio of eight distinct luxury brands ; The Ritz-Carlton, Ritz-Carlton Reserve, St. Regis, W Hotels, The Luxury Collection, EDITION and JW Marriott.


text:
Q: Java embedded applet page security, how to meet requirements? If I have an applet embedded in a webpage and I want it to connect to server side software (also written in Java) how can I do this properly on a windows machine running local host? Would I have to run the java application from within the localhost directory and access the applet HTML from a browser (i.e. localhost/applet.html)?
From what I understand if you don't have everything setup correctly you won't be able to connect because of Java's security requirements.

A: You'll have to run a webserver (a very simple one will do) and access the page with the applet through that.


Indian stone war hammers, axe, celt and tool sale. Now imagine grinding TWO grooves around the one stone - for ...Indian stone tools, artifacts, CELT sale.American Indian Stone Age Tools.
The powerful 110V motor is designed for the Indian-American ... The drum has a stone bottom to give that authentic taste you get only from stone on stone grinding.
mobile stone grinder american Quern-stone - Wikipedia, the free encyclopedia Quern-stones are stone tools for hand-grinding a wide variety of materials .
mobile iron ore crusher and grinding machine which is one of the most important sales markets of GME in South America.MTM Trapezium Grinder PFW Impact Crusher Stone Crushers Mill Electric Cable Sepa.
mobile stone grinder american-Mining Equipment For Sale . indian grinding stone eBay – Electronics, Cars, Fashion … Newly listed Native Ameri grinding .
Worldcrushers stone crusher, mobile 2012 This is my home built tool cutter grinder And here Comprising A Complete Review Of Contemporary American American made chili grinder milling machine At Syil America we specialize in Bench top stone grinder for sale stone grinder for, K Series Mobile Crushing Plant ;.
mobile stone grinder american. Pleasant Hill GrainGrain Mill Nutrimill Bosch Mixer . Pleasant Hill Grain also offers the Bosch Universal mixer, the most popular heavy duty stand mixer on the market.
Museum/gallery quality Native American stone portable grinding ... portable mobile stone crusher india – Grinding Mill China . portable mobile stone crusher india.
mobile stone grinder american - praiseagchurch.in. mobile stone grinder american ; Traditional grinding stone used for making chutney, dosa batter and idli batter, ..


text:
Q: What is the difference between a Protocol method in Swift and an abstract method in Java? I'm new to Java and I'm currently learning about abstract methods and they sound exactly like Protocol methods in Swift. They are both methods that must be implemented and cannot have a default implementation.
However, when I Google, "Are Java abstract methods the same as Swift Protocol methods," all of the answers basically say that Swift doesn't offer abstract methods.
So my questions are:

*

*Am I right to assume that an abstract method is at least similar to a protocol method?

*What is the key difference between the two?


Posted by Wendy Hay in All recipes, Chicken, More or Less!
Well I have made lots of soup in my time. Pre primal I would just mix up a stock cube or 5 with water and throw that in the mix. And it all tasted fine.
Going primal made me actually look at what was in this so called "stock cube", OMG yuk and double yuk!! So, I progressed onto the purest store bought stock I could find, and I found my soups tasted 100% better (well surprise, surprise). Next step, of course, is to make my own – then I will know for sure what's in it and can cook it long and slow to make sure all that lovely goodness is got.
The first step was to actually find some chicken carcasses or meaty bones. Not as hard as I thought, just in the chicken section at the supermarket – fairly obvious! The cooking was even easier, cover the meaty bones with cold water – better to draw out the nutrients.
First thing the next morning (yes I know you need to go to work, but it only takes a tick), throw into the mix (which is smelling divine), roughly chopped carrot, onion, celery. Add some bay leaves and dried thyme or herbs of your choice Go to work.
Just strain this off and volia!!
Once cooled there will be a layer of fat on the top, so scrape this off and underneath you have a wibbly, wobbly jelly like stock.
2kgs (5.5 pounds more or less) Chicken carcass or meaty bones (include feet if you dare!). You can use a mix of uncooked or cooked if you have some.
2 tsps dried herbs such as Thyme, an Italian mix or Bouquet Garni.
• Put chicken in the slow cooker/crock pot turned on to low.
• Cover chicken with cold water and cover with lid.
• Cook overnight or for 12 hours.
• Add roughly chopped onion, carrot and celery, along with the herbs.
• Cook for a further 8 to 10 hours for stock.
• Strain and place into containers.
• On cooling a layer of a fat will form on the top, use this and don't scrape this off!.
So how hard was that!


We're gearing up for our next testing ISO, I wanted to post my left-panel tint2 so I can easily re-use it after I wipe everything.
Thanks man, shame I had to steal the colour scheme. It looks nice though.
@dobbie - Yes it is.
helium with a tweak of notifications. Hoping the wall sells this.
^looking good H3. Like it a lot.
@PackRat That screenshot made me thinking of two things: 1. A shortcut-editor is a good idea. 2. There is no "post your jgmenurc" thread yet, while there are very nice configurations out there (like yours). I like that dark/gold theme too.
Lost my Alpine Linux system (don't ask) so just OpenBSD for me for now, managed to get synaptics loading again (it's the only touchpad driver that allows for coasting and so is still the best) and the desktop is super-responsive with `glxgears` showing a (marginally) higher framerate than either Alpine or BunsenLabs, surprisingly.
EDIT: that's Windows' Arial font in the status bar with -*-fixed-medium-r-*-*-12-*-*-*-*-*-*-* as the xterm font (bold disabled).
^Oh, sorry to hear it. Always found your Alpine-related posts interesting, just like the distro. I will give it a try one day. I´m not supposed to ask, so I won't ask if it's distro-related loss or "self-wrongdoing". OTOH I liked your OpenBSD posts too.
I know I am probably not meant to discuss this as I haven't "Seen" anything but that is nice!
@HoaS, I'm up and running, too. Thanks for posting, and thanks to @johnraff for the build!
Always found your Alpine-related posts interesting, just like the distro. I will give it a try one day. I´m not supposed to ask, so I won't ask if it's distro-related loss or "self-wrongdoing".
Can we make that into a BLOB theme and add it to the release?
For sure I want to add the tint2 theme if the Team agrees, it's posted earlier here, but I'll restore the 24 hour clock on it. The rest is stock except for a conky tweak, and lxterminal with custom (Beam bg and fg) colors instead of terminator, and a few tweaks to thunar which are available in its menu (disable sidebar, statusbar, menubar).
The left-side tint2 could be made to look Unity-like even for those who come over to BL from Ubuntu for example. Can Tint2 replace wbar?
my fishing hole is the wallpaper. you have to have a 4x4 to get to it.
Nice! Now I am hungry, lol.
Don't worry we're gonna make trout patties for Easter dinner out of him.