Robot Operating System, kurz ROS, ist ein Framework, um den Herausforderungen, die sich Entwicklern bei der Erstellung von Roboter-Anwendungen stellen, zu begegnen. Bereits sehr früh stellt man bei der Konzeption eines Roboter-Fahrzeugs fest, dass die vielen Sensoren, Programme und anderen Bestandteile vernetzt werden müssen.
So komplex bereits die Verzahnung der einzelnen Komponenten sind, so kompliziert ist auch der Aufbau von ROS:
Ros bietet folgende Unterstützungskomponenten an:
- Messages
- Actions
- Launcher
- Packages
- Topics
- Publisher / Subscriber
- Services
- Turtlebot Simulation
- Model
- und vieles mehr
Das ROS Mini Projekt:
Abstandsmessung
Die Abstandsmessung mit dem HCRS04 kommt wie gerufen, um die verschiedenen Tools von ROS im Zusammenspiel zu betrachten.
In diesem Beitrag wird es um die ROS Version 1 / noetic gehen. Das hat mehrere Gründe. Zum Einen ist ROS2 auf einem Raspi Zero akuell nicht verfügbar, zum Anderen ist auch die ROS 1 Welt bereits außerordentlich umfangreich, sodass es Sinn macht die verschiedenen Tools in Gesamtheit kennen zu lernen.
Roscore
Mit „roscore“ startet man den Masternode. Dieser dient als zentrale Vermittlungsstelle zwischen den verschiedenen „nodes“ (Knoten).
Publisher-Subscriber Verfahren
Die Ultrasonic Abstandsmessung überträgt ein Raspi Pico an den Raspi Zero über die serielle Schnittstelle. Von dort geht es über WLAN weiter im Publisher (Zero) – Subscriber (PI) Verfahren:
#!/usr/bin/env python3
import rospy
from robotbench.sensors.ultrasonic import UltraSonic
from ros_robotbench.msg import MSGUltrasonic
publisher = rospy.Publisher('ultrasonic_sensor_topic', MSGUltrasonic, queue_size=10)
rospy.init_node('ultrasonic_sensor_publisher_node', anonymous=True)
#set the loop rate
rate = rospy.Rate(5) # 5hz
ultra = UltraSonic()
while not rospy.is_shutdown():
sensor = MSGUltrasonic()
distance = ultra.read_one()
sensor.name="front"
sensor.distance=distance["front"]
rospy.loginfo("I publish:")
rospy.loginfo(sensor)
publisher.publish(sensor)
rate.sleep()
Der Hauptrechner, ein Raspberry Pi 4, abonniert das Publisher Topic: ultrasonic_sensor_topic.
#!/usr/bin/env python3
import rospy
from ros_robotbench.msg import MSGUltrasonic
def ultrasonic_sensor_callback(sensor_message):
rospy.loginfo(f"UltraSonic data received from {sensor_message.name}: {sensor_message.distance}")
rospy.init_node('ultrasonic_sensor_subscriber_node', anonymous=True)
rospy.Subscriber("ultrasonic_sensor_topic", MSGUltrasonic, ultrasonic_sensor_callback)
# spin() simply keeps python from exiting until this node is stopped
rospy.spin()
Messages
Die Klasse: MSGUltrasonic ist das Austauschdatenformat zwischen Publisher und Subscriber. Hierfür bietet ROS ein Tool an, um einfach Formate definieren und verwenden zu können:
In der CMakeList.txt legt man hierfür zum Einen den Hinweis für das Tool: catkin_make in Form eines add_message_files Eintrags an:
add_message_files(
FILES
MSGUltrasonic.msg
)
generate_messages(
DEPENDENCIES
std_msgs
)
Des Weiteren müssen noch die Einträge, message_generation und message_runtime in der package.xml eingetragen werden:
<buildtool_depend>catkin</buildtool_depend>
<build_depend>rospy</build_depend>
<build_depend>std_msgs</build_depend>
<build_depend>message_generation</build_depend>
<build_export_depend>rospy</build_export_depend>
<build_export_depend>std_msgs</build_export_depend>
<exec_depend>rospy</exec_depend>
<exec_depend>std_msgs</exec_depend>
<exec_depend>message_runtime</exec_depend>
Im Ordner msg legt man die Datei MSGUltrasonic.msg an:
string name
int32 distance
Auf jedem der beteiligten Rechner muss nun catkin_make im Package-Ordner ausgeführt werden, damit die Klassen und MSG Files aktualisiert bzw. generiert werden.
Mit rosrun package_name (ros_robotbench) pythonscript.py die Module auf beiden Rechnern starten und das Ergebnis auf der Konsole abwarten.
Links:
- ROS: https://www.ros.org/
- Weitere Beiträge: https://robot-bench.com/?s=ROS
- ROS Installation: http://wiki.ros.org/Installation/Ubuntu