diff --git a/catkin_ws/src/learn_environment/task_pool/evaluation_scripts/controller/controller_task/position_controller.py b/catkin_ws/src/learn_environment/task_pool/evaluation_scripts/controller/controller_task/position_controller.py new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/catkin_ws/src/learn_environment/task_pool/solution_scripts/controller/controller_task/position_controller.ipynb b/catkin_ws/src/learn_environment/task_pool/solution_scripts/controller/controller_task/position_controller.ipynb new file mode 100644 index 0000000000000000000000000000000000000000..4ad40f7e1b29861972bccc73d6d52c427c797822 --- /dev/null +++ b/catkin_ws/src/learn_environment/task_pool/solution_scripts/controller/controller_task/position_controller.ipynb @@ -0,0 +1,222 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Learn Environment Panda Robot\n", + "Author: NAME" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Controller_Task\n", + "### Position_Controller\n", + "\n", + "> In this task, you will learn ...\n", + ">\n", + "> - wie du mit einem Position Controller arbeitest, um die Gelenke eines Roboters auf spezifische Positionen zu bewegen.\n", + "> - wie man den Position Controller startet\n", + "> - wie man eine Nachricht für den Position Controller erstellt\n", + "> - wie man die Zielposition sendt und die Bewegung überprüft" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "##### DO NOT CHANGE #####\n", + "\n", + "import rospy\n", + "from controller_manager_msgs.srv import LoadController, SwitchController\n", + "from trajectory_msgs.msg import JointTrajectory, JointTrajectoryPoint\n", + "\n", + "##### DO NOT CHANGE #####" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Lade den Controller:\n", + "\n", + "ROS verwendet den Service /controller_manager/load_controller, um Controller zu laden.\n", + "Du musst den Namen des Controllers angeben, den du laden möchtest, in diesem Fall position_joint_trajectory_controller.\n", + "Aktiviere den Controller:\n", + "\n", + "Nachdem der Controller geladen ist, musst du ihn starten. Dies geschieht mit dem Service /controller_manager/switch_controller.\n", + "Du kannst mehrere Controller gleichzeitig starten und stoppen, indem du deren Namen in den Service-Request übergibst.\n", + "Verwende die folgende Vorlage:\n", + "\n", + "Nutze den Service load_controller, um den gewünschten Controller zu laden.\n", + "Starte den Service switch_controller, um den Position Controller zu aktivieren." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "##### DO NOT CHANGE #####\n", + "\n", + "# Service für das Laden des Controllers\n", + "rospy.wait_for_service('/controller_manager/load_controller')\n", + "load_service = rospy.ServiceProxy('/controller_manager/load_controller', LoadController)\n", + "response = load_service(\"position_joint_trajectory_controller\")\n", + "assert response.ok, \"Controller konnte nicht geladen werden.\"\n", + "\n", + "# Service für das Aktivieren des Controllers\n", + "rospy.wait_for_service('/controller_manager/switch_controller')\n", + "switch_service = rospy.ServiceProxy('/controller_manager/switch_controller', SwitchController)\n", + "response = switch_service(start_controllers=['position_joint_trajectory_controller'], \n", + " stop_controllers=[], strictness=1)\n", + "assert response.ok, \"Controller konnte nicht gestartet werden.\"\n", + "\n", + "print(\"Position Controller erfolgreich gestartet.\")\n", + "\n", + "##### DO NOT CHANGE #####\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Nachrichtentyp:\n", + "\n", + "Der Position Controller empfängt Nachrichten vom Typ trajectory_msgs/JointTrajectory.\n", + "Diese Nachricht enthält:\n", + "joint_names: Eine Liste der Gelenke, die gesteuert werden sollen.\n", + "points: Eine Liste von Positionen, die die Gelenke ansteuern sollen.\n", + "Erstelle die Nachricht:\n", + "\n", + "Beginne mit einer JointTrajectory-Nachricht.\n", + "Definiere die Gelenke, die du bewegen möchtest, indem du die Namen in der Liste joint_names einträgst.\n", + "Füge Zielpositionen hinzu:\n", + "\n", + "Erstelle ein JointTrajectoryPoint, um die Zielpositionen für jedes Gelenk zu definieren.\n", + "Ergänze die Felder:\n", + "positions: Die Zielpositionen in Radiant (z. B. [0.5, -0.5, 0.0]).\n", + "time_from_start: Die Dauer, die der Roboter benötigt, um die Positionen zu erreichen.\n", + "Sende die Nachricht:\n", + "\n", + "Veröffentliche die Nachricht auf dem Topic /position_joint_trajectory_controller/command." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "##### DO NOT CHANGE #####\n", + "\n", + "# Initialisiere ROS\n", + "rospy.init_node('position_control', anonymous=True)\n", + "\n", + "# Publisher für das Command-Topic\n", + "pub = rospy.Publisher('/position_joint_trajectory_controller/command', JointTrajectory, queue_size=10)\n", + "\n", + "# Warte, bis der Publisher bereit ist\n", + "rospy.sleep(1)\n", + "\n", + "# Erstelle die Nachricht\n", + "traj_msg = JointTrajectory()\n", + "traj_msg.joint_names = [...] # TODO: Füge die Gelenknamen des Roboters hier ein\n", + "\n", + "# Definiere die Zielpositionen\n", + "point = JointTrajectoryPoint()\n", + "point.positions = [...] # TODO: Füge Zielpositionen (in Radiant) für jedes Gelenk hinzu\n", + "point.time_from_start = rospy.Duration(...) # TODO: Lege die Zeit fest, bis die Bewegung abgeschlossen sein soll\n", + "\n", + "# Füge den Punkt zur Trajektorie hinzu\n", + "traj_msg.points.append(point)\n", + "\n", + "# Sende die Nachricht\n", + "pub.publish(traj_msg)\n", + "print(\"Zielposition wurde gesendet.\")\n", + "\n", + "##### DO NOT CHANGE #####" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "In dieser Erweiterung definieren Sie zwei Zielpositionen.\n", + "Die erste Zielposition wird erreicht, bevor der Roboter zur zweiten Zielposition übergeht.\n", + "Was du tun musst:\n", + "\n", + "Füge eine zweite Zielposition zu traj_msg.points hinzu.\n", + "Die zweite Zielposition sollte eine andere Pose ansteuern, um eine sichtbare Bewegung zu demonstrieren.\n", + "Planung der Bewegung:\n", + "\n", + "Verwenden Sie die Zeitsteuerung time_from_start, um sicherzustellen, dass der Roboter genug Zeit hat, die erste Position zu erreichen, bevor er zur nächsten übergeht.\n", + "Die Zeitangaben müssen aufeinander aufbauen:\n", + "Die erste Zielposition benötigt z. B. 2 Sekunden (time_from_start = 2.0).\n", + "Die zweite Zielposition wird nach weiteren 3 Sekunden erreicht (time_from_start = 5.0).\n", + "Schritte:\n", + "\n", + "Erstelle eine erste Zielposition: Definiere die Gelenkwinkel und die Dauer.\n", + "Erstelle eine zweite Zielposition: Erhöhe die Zeit und ändere die Gelenkwinkel.\n", + "Sende beide Punkte: Füge die Punkte zu traj_msg.points hinzu und sende die Nachricht." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "##### YOUR CODE HERE #####\n", + "\n", + "# Nachricht erstellen\n", + "traj_msg = JointTrajectory()\n", + "traj_msg.joint_names = ['joint_1', 'joint_2', 'joint_3', 'joint_4', 'joint_5', 'joint_6']\n", + "\n", + "# Erste Zielposition definieren\n", + "point1 = JointTrajectoryPoint()\n", + "point1.positions = [0.5, -0.5, 0.0, 0.0, 0.5, -0.5]\n", + "point1.time_from_start = rospy.Duration(2.0)\n", + "traj_msg.points.append(point1)\n", + "\n", + "# Zweite Zielposition definieren\n", + "point2 = JointTrajectoryPoint()\n", + "point2.positions = [1.0, 0.0, -0.5, 0.0, -0.5, 1.0]\n", + "point2.time_from_start = rospy.Duration(5.0)\n", + "traj_msg.points.append(point2)\n", + "\n", + "# Nachricht senden\n", + "pub.publish(traj_msg)\n", + "print(\"Zwei Zielpositionen wurden gesendet.\")\n", + "\n", + "##### YOUR CODE HERE #####" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "##### DO NOT CHANGE #####\n", + "\n", + "rospy.signal_shutdown(\"Task completed\")\n", + "roscpp_shutdown()\n", + "\n", + "##### DO NOT CHANGE #####" + ] + } + ], + "metadata": { + "language_info": { + "name": "python" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/catkin_ws/src/learn_environment/task_pool/solution_scripts/move_it/move_it_basics/move_it_basics_3.ipynb b/catkin_ws/src/learn_environment/task_pool/solution_scripts/move_it/move_it_basics/move_it_basics_3.ipynb index 5be619cdd6d3a20be63f2f138d3cc725c991e157..9a4f3c54b602804edb74a5bc4d24ddad5a4f6802 100644 --- a/catkin_ws/src/learn_environment/task_pool/solution_scripts/move_it/move_it_basics/move_it_basics_3.ipynb +++ b/catkin_ws/src/learn_environment/task_pool/solution_scripts/move_it/move_it_basics/move_it_basics_3.ipynb @@ -83,7 +83,7 @@ "roscpp_initialize(sys.argv)\n", "\n", "# Initialize the ROS Node\n", - "rospy.init_node('exercise_4_1', anonymous=True)\n", + "rospy.init_node('task3', anonymous=True)\n", "\n", "# Initialize MoveGroupCommander\n", "group = MoveGroupCommander('panda_arm')\n", diff --git a/catkin_ws/src/learn_environment/task_pool/solution_scripts/move_it/move_it_basics/move_it_basics_4.ipynb b/catkin_ws/src/learn_environment/task_pool/solution_scripts/move_it/move_it_basics/move_it_basics_4.ipynb index 172f8b97097cc8a4464bf0b5d375d13e95ec7cc8..9a05ef102ae6b44855b3e71734f7e361a0e840c6 100644 --- a/catkin_ws/src/learn_environment/task_pool/solution_scripts/move_it/move_it_basics/move_it_basics_4.ipynb +++ b/catkin_ws/src/learn_environment/task_pool/solution_scripts/move_it/move_it_basics/move_it_basics_4.ipynb @@ -50,7 +50,7 @@ "roscpp_initialize(sys.argv)\n", "\n", "# Initialize the ROS Node\n", - "rospy.init_node('exercise_4_2', anonymous=True)\n", + "rospy.init_node('task4', anonymous=True)\n", "\n", "##### DO NOT CHANGE #####\n" ] diff --git a/catkin_ws/src/learn_environment/task_pool/solution_scripts/move_it/move_it_objects/move_it_objects_1.ipynb b/catkin_ws/src/learn_environment/task_pool/solution_scripts/move_it/move_it_objects/move_it_objects_1.ipynb index 8a52ba9f16ee112d6462ddddc8bcf0eefd513b69..04ae9c6edce0d34e566fb983afeea6c5c45a5492 100644 --- a/catkin_ws/src/learn_environment/task_pool/solution_scripts/move_it/move_it_objects/move_it_objects_1.ipynb +++ b/catkin_ws/src/learn_environment/task_pool/solution_scripts/move_it/move_it_objects/move_it_objects_1.ipynb @@ -69,7 +69,7 @@ "roscpp_initialize(sys.argv)\n", "\n", "# Initialize the ROS Node\n", - "rospy.init_node('exercise_5_1', anonymous=True)\n", + "rospy.init_node('taks1', anonymous=True)\n", "\n", "# Initialize PlanningScene\n", "scene = PlanningSceneInterface()\n", diff --git a/catkin_ws/src/learn_environment/task_pool/solution_scripts/move_it/move_it_objects/move_it_objects_2.ipynb b/catkin_ws/src/learn_environment/task_pool/solution_scripts/move_it/move_it_objects/move_it_objects_2.ipynb index f71e067aa9865d79dfe1af143b9340364e8816d3..1e7b41a5e9fe63fac0da224f94e0390f5d492ca4 100644 --- a/catkin_ws/src/learn_environment/task_pool/solution_scripts/move_it/move_it_objects/move_it_objects_2.ipynb +++ b/catkin_ws/src/learn_environment/task_pool/solution_scripts/move_it/move_it_objects/move_it_objects_2.ipynb @@ -73,7 +73,7 @@ "roscpp_initialize(sys.argv)\n", "\n", "# Initialize the ROS Node\n", - "rospy.init_node('exercise_5_2', anonymous=True)\n", + "rospy.init_node('task2', anonymous=True)\n", "\n", "# Initialize the PlanningSceneInterface\n", "planning_scene_interface = PlanningSceneInterface()\n", diff --git a/catkin_ws/src/learn_environment/task_pool/solution_scripts/move_it/move_it_objects/move_it_objects_3.ipynb b/catkin_ws/src/learn_environment/task_pool/solution_scripts/move_it/move_it_objects/move_it_objects_3.ipynb index 1e5d38705343a76974cf692fcb32d224e6dcedf2..8bb63b99a8723f6d7254d5231e097f14ab066fcf 100644 --- a/catkin_ws/src/learn_environment/task_pool/solution_scripts/move_it/move_it_objects/move_it_objects_3.ipynb +++ b/catkin_ws/src/learn_environment/task_pool/solution_scripts/move_it/move_it_objects/move_it_objects_3.ipynb @@ -68,7 +68,7 @@ "roscpp_initialize(sys.argv)\n", "\n", "# Initialize the ROS Node\n", - "rospy.init_node('exercise_5_1', anonymous=True)\n", + "rospy.init_node('task3', anonymous=True)\n", "\n", "# Initialize PlanningScene\n", "scene = PlanningSceneInterface()\n", diff --git a/catkin_ws/src/learn_environment/task_pool/task_definitions.json b/catkin_ws/src/learn_environment/task_pool/task_definitions.json index 0735fb3b82c62926d639407d7c91b69a66cdc81b..7e6d9457be42767121554e7e51322ce4db3c13d3 100644 --- a/catkin_ws/src/learn_environment/task_pool/task_definitions.json +++ b/catkin_ws/src/learn_environment/task_pool/task_definitions.json @@ -125,16 +125,22 @@ ] }, { - "title": "Trajectory Controller", + "title": "Controller Basics", "folder": "/controller/controller_task", "topic": "Controller", "difficulty": "beginner", "subtasks": [ { "title": "Task 1", - "description": "TODO: Add Subtask Description Subtask 1.", + "description": "Understand the basics of the trajectory controller", "solution_file": "/trajectory_controller.ipynb", "evaluation_file": "/trajectory_controller.py" + }, + { + "title": "Task 2", + "description": "Undersatnd the basics of the position controller", + "solution_file": "/position_controller.ipynb", + "evaluation_file": "/position_controller.py" } ] },