Table of Contents
Motivation
Für das Absolvieren des Udacity Nanodegrees Robotics Software Engineer ist es notwendig, sich mit dem Robot Operating System kurz ROS zu beschäftigen.
Dieser Artikel soll eine Einführung in das Thema geben. Es wird ROS 1 in der Version Noetic Ninjemys verwendet.
Was ist ROS?
Das Robot Operating System (ROS) ist ein Open-Source-Roboter-Entwicklungs-Framework. Es bietet eine Sammlung von Tools, Bibliotheken und Konventionen, die es Entwicklern ermöglichen, Software für Roboter zu erstellen.
Es bietet Dienste, die für die Entwicklung von Roboteranwendungen erforderlich sind, einschließlich Hardware-Abstraktion, Gerätetreiber, Kommunikation zwischen Prozessen und Paketverwaltung. Es ist im strengeren Sinn also kein Betriebssystem wie der Name vermuten lassen könnte, sondern eher eine Art Middleware.
Installation
Installiert wird ROS auf einem Ubuntu 20.04.3 LTS (Focal Fossa) (https://releases.ubuntu.com/focal/ Die Installation von ROS Noetic Ninjemys erfolgt in mehreren Schritten.
Setup des Repositories
Zuerst wird das Repository hinzugefügt:
sudo sh -c 'echo "deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main" > /etc/apt/sources.list.d/ros-latest.list'
Setup des Schlüssels
Dann wird der Schlüssel hinzugefügt:
sudo apt install curl
curl -s https://raw.githubusercontent.com/ros/rosdistro/master/ros.asc | sudo apt-key add -
Installation
Jetzt wird ROS installiert:
sudo apt update
sudo apt install ros-noetic-desktop-full
Umgebungsvariablen
Damit ROS in der Konsole verfügbar ist, müssen die Umgebungsvariablen gesetzt werden:
echo "source /opt/ros/noetic/setup.bash" >> ~/.bashrc
source ~/.bashrc
Catkin
Catkin ist das Build-System von ROS. Es ist eine Erweiterung von CMake und wird verwendet, um ROS-Pakete zu bauen.
Es ist in der Lage, mehrere Pakete gleichzeitig zu bauen und Abhängigkeiten zwischen Paketen zu verwalten.
Ordnerstruktur
Ein catkin workspace ist ein Ordner, in dem catkin-Pakete gebaut werden.
Ein catkin-Paket ist ein Ordner, der die Datei package.xml enthält und in dem ein CMakeLists.txt-Datei vorhanden ist.
Die empfohlene Ordnerstruktur für ein catkin workspace sieht so au
catkin_ws/
src/
CMakeLists.txt
package_1/
CMakeLists.txt
package.xml
package_2/
CMakeLists.txt
package.xml
Ich erzeuge einen neuen catkin workspace mit dem Befehl:
mkdir -p ~/catkin_ws/src
cd ~/catkin_ws/src
catkin_init_workspace
Durch das Ausführen des Befehls catkin_init_workspace
wird ein CMakeLists.txt-Datei im src-Ordner erstellt.
Die Datei ist allerdings ein symlink auf die Datei im /opt/ros/noetic/share/catkin/cmake/toplevel.cmake
Erstellen eines catkin-Pakets
Ein catkin-Paket wird mit dem Befehl catkin_create_pkg
erstellt.
Ich erstelle ein neues Paket namens my_robot
:
cd ~/catkin_ws/src
catkin_create_pkg my_robot
Bauen des catkin-Pakets
Das Paket wird mit dem Befehl catkin_make
gebaut:
cd ~/catkin_ws
catkin_make
Das sollte fehlerfrei durchlaufen.
Erster Roboter
Jetzt erstelle ich einen einfachen Roboter mit dem Paket my_robot
.
Dazu erstelle ich ein neues Verzeichnis urdf
und eine Datei my_robot.urdf
:
cd ~/catkin_ws/src/my_robot
mkdir urdf
cd urdf
touch my_robot.urdf
Inhalt der Datei my_robot.urdf
:
<?xml version="1.0"?>
<robot name="my_robot">
<link name="base_link">
<visual>
<geometry>
<cylinder length="0.6" radius="0.2"/>
</geometry>
<origin rpy="0 0 0" xyz="0 0 0.3"/>
<material name="blue"/>
</visual>
</link>
<link name="left_wheel">
<visual>
<geometry>
<cylinder length="0.1" radius="0.1"/>
</geometry>
<origin rpy="1.5708 0 0" xyz="0 0 0"/>
<material name="black"/>
</visual>
<collision>
<geometry>
<cylinder length="0.1" radius="0.1"/>
</geometry>
<origin rpy="1.5708 0 0" xyz="0 0 0"/>
</collision>
</link>
<link name="right_wheel">
<visual>
<geometry>
<cylinder length="0.1" radius="0.1"/>
</geometry>
<origin rpy="1.5708 0 0" xyz="0 0 0"/>
<material name="black"/>
</visual>
<collision>
<geometry>
<cylinder length="0.1" radius="0.1"/>
</geometry>
<origin rpy="1.5708 0 0" xyz="0 0 0"/>
</collision>
</link>
<link name="caster_wheel">
<visual>
<geometry>
<cylinder length="0.1" radius="0.05"/>
</geometry>
<origin rpy="0 1.5708 0" xyz="0 0 0"/>
<material name="black"/>
</visual>
<collision>
<geometry>
<cylinder length="0.1" radius="0.05"/>
</geometry>
<origin rpy="0 1.5708 0" xyz="0 0 0"/>
</collision>
</link>
<joint name="base_to_left_wheel" type="continuous">
<parent link="base_link"/>
<child link="left_wheel"/>
<origin rpy="0 0 0" xyz="0.3 0 0"/>
<axis xyz="0 0 1"/>
</joint>
<joint name="base_to_right_wheel" type="continuous">
<parent link="base_link"/>
<child link="right_wheel"/>
<origin rpy="0 0 0" xyz="0.3 0 0"/>
<axis xyz="0 0 1"/>
</joint>
<joint name="base_to_caster_wheel" type="continuous">
<parent link="base_link"/>
<child link="caster_wheel"/>
<origin rpy="0 0 0" xyz="0 0 0"/>
<axis xyz="0 0 1"/>
</joint>
</robot>
Model überprüfen
Wir können das Modell mit dem Befehl check_urdf
überprüfen:
check_urdf my_robot.urdf
Falls das Tool nicht installiert ist, kann es mit dem Befehl sudo apt install liburdfdom-tools
installiert werden.
Launch-Datei
Ich erstelle eine launch-Datei, um den Roboter in RViz anzuzeigen.
Dazu erstelle ich eine Datei my_robot_rviz.launch
im Verzeichnis launch
:
cd ~/catkin_ws/src/my_robot
mkdir launch
cd launch
touch my_robot_rviz.launch
Inhalt der Datei my_robot_rviz.launch
:
<launch>
<param name="robot_description" command="$(find xacro)/xacro --inorder '$(find my_robot)/urdf/my_robot.urdf'" />
<node name="joint_state_publisher" pkg="joint_state_publisher" type="joint_state_publisher" />
<node name="robot_state_publisher" pkg="robot_state_publisher" type="robot_state_publisher" />
<node name="rviz" pkg="rviz" type="rviz" />
</launch>
In RViz anzeigen
source devel/setup.bash
roslaunch my_robot my_robot_rviz.launch