This is an old revision of the document!
Configuration File for ROS
| Keyword | Type | Remarks | 
|---|---|---|
| deviceX | object | device, X is the device number | 
As described in Using ROS through EEROS HAL you can directly map EEROS signal onto ROS messages through the EEROS HAL. The wrapper library EEROS-ROS is used to connect the EEROS HAL with ROS topics. 
The EEROS HAL digital and analog inputs and outputs can be defined as usual in a JSON file. There are hundreds of different message types in ROS and it is possible to create custom types.
Because every message type has to be handled differently, only a few are supported by default.
But the wrapper library can easily be extended to support additional message types.
Chapter \ref{sectionImplementMsgType} describes how you can add a new ROS msg type to the library.
Table \ref{tableKeyValueEeros} shows the most important key-value pairs for using the HAL with ROS.
\begin{table}[]
\centering
\caption{Most important key-value pairs for ros-eeros}
\label{tableKeyValueEeros}
\begin{tabular}{@{}lll@{}}
\toprule
Key                 & Typical value                         & Description              
\midrule
library             & libroseeros.so                        & Wrapper library  for ROS 
devHandle           & testNodeHAL                           & ROS node created by HAL  
type                & AnalogIn / AnalogOut / DigIn / DigOut & Type of input / output   
additionalArguments & 'see next table'                      & 'see next table'         
\bottomrule
\end{tabular}
\end{table}
The \textit{additionalArguments} are special arguments which are parsed in the wrapper library \textit{ros-eeros}.
These arguments contain additional information which are necessary to communicate with a ROS network.
All arguments are separated with a semicolon.
The available arguments are listed in table \ref{tableAdditionalArgumentsEeros}.
An example for an additional argument could be:
\begin{snugshade*}
\textit{\char“22additionalArguments\char”22: \char“22topic=/testNode/TestTopic3; msgType=sensor\_msgs::LaserScan; 
dataField=scan\_time; callOne=false; queueSize=100\char”22,}
\end{snugshade*}
Table \ref{tableAdditionalArgumentsEeros} shows all currently available \textit{additionalArguments}.
\textbf{Topic} and \textbf{msgType} are mandatory arguments.
\begin{table}
\centering
\caption{Additional arguments specific for ros-eeros}
\label{tableAdditionalArgumentsEeros}
\begin{tabular}{@{}lll@{}}
\toprule
Key        & Typical value           & Description                                
\midrule
\textbf{topic}      & /testNode/TestTopic1    & Topic to listen / subscribe                
\textbf{msgType }   & sensor\_msgs::LaserScan & ROS message type of topic                  
dataField & scan\_time              & Desired data member of message             
callOne    & true                    & Oldest, not yet fetched message is fetched 
callOne    & false                   & Newest available message is fetched        
queueSize  & 1000                    & Size of buffer; queueSize=1000 if omitted  
useEerosSystemTime  & fals           & Use system time or timestamp of received msg  
\bottomrule
\end{tabular}
\end{table}
In table \ref{tableImplementedMsgTypes} are all currently implemented message types and associated data fields.
If your desired message type is not implemented yet, you can easily implement it yourself.
See chapter \ref{sectionImplementMsgType} for a guide to implement additional message types and data fields in \textit{ros-eeros}.
\begin{table}[]
\centering
\caption{Currently implemented message types in ros-eeros}
\label{tableImplementedMsgTypes}
\begin{tabular}{lll}
\cline{2-3}
HAL type  & msgType                    & dataField        
\cline{2-3} 
AnalogIn  & std\_msgs::Float64         & -                
& sensor\_msgs::LaserScan & angle\_min \\
& & angle\_max \\
& & angle\_increment \\
& & time\_increment \\
& & scan\_time \\
& & range\_min \\
& & range\_max \\
AnalogOut & std\_msgs::Float64         & -                
& sensor\_msgs::LaserScan & angle\_min \\
& & angle\_max \\
& & angle\_increment \\
& & time\_increment \\
& & scan\_time \\
& & range\_min \\
& & range\_max \\
DigIn     & sensor\_msgs::BatteryState & present          
DigOut    & sensor\_msgs::BatteryState & present          
\cline{2-3} 
\end{tabular}
\end{table}
You can find a complete example, including a *.json file, in the eeros framework (/examples/hal/Ros*).
\subsection{How to use}
Refere to the documentation of the EEROS HAL\footnote{http://wiki.eeros.org/eeros\_architecture/hal/start?s[]=hal} and check the example in the eeros framework (/examples/ros).
First initialize the HAL in your main function:
\lstset{language=c}
\begin{lstlisting}
…
int main(int argc, char **argv) {
...
// HAL
// ////////////////////////////////////////////////////////////////////////
HAL& hal = HAL::instance();
hal.readConfigFromFile(&argc, argv);
...
\end{lstlisting}
Add the header file to your control system:
\lstset{language=c}
\begin{lstlisting}
#include <eeros/hal/HAL.hpp>
\end{lstlisting}
You can now declare \textit{PeripheralInputs} and \textit{PeripheralOutputs}:
\lstset{language=c}
\begin{lstlisting}
PeripheralInput<double> analogIn0;
PeripheralInput<bool> digitalIn0;
PeripheralOutput<double> analogOut0;
PeripheralOutput<bool> digitalOut0;
\end{lstlisting}
Call the constructor of the peripheral IOs with the \textit{signalID} used in the *.json file
\begin{lstlisting}
class MyControlSystem {
public:
MyControlSystem(double ts, ros::NodeHandle& rosNodeHandler):
dt(ts),
...
	analogIn0("scanTimeIn0"),		// argument has to match signalId of json
	digitalIn0("batteryPresent0"),
	analogOut0("scanTimeEchoOut0"),
	digitalOut0("batteryPresentEchoOut0"),
...
}
