From 4dbb9b02e520c9b6e81cc8e0ecc724b677072682 Mon Sep 17 00:00:00 2001
From: uninh <uninh@student.kit.edu>
Date: Tue, 7 Jan 2025 12:08:35 +0000
Subject: [PATCH] position_controller task added and small changes in
 describtion of the other tasks

---
 .../controller_task/position_controller.py    |   0
 .../controller_task/position_controller.ipynb | 222 ++++++++++++++++++
 .../move_it_basics/move_it_basics_3.ipynb     |   2 +-
 .../move_it_basics/move_it_basics_4.ipynb     |   2 +-
 .../move_it_objects/move_it_objects_1.ipynb   |   2 +-
 .../move_it_objects/move_it_objects_2.ipynb   |   2 +-
 .../move_it_objects/move_it_objects_3.ipynb   |   2 +-
 .../task_pool/task_definitions.json           |  10 +-
 8 files changed, 235 insertions(+), 7 deletions(-)
 create mode 100644 catkin_ws/src/learn_environment/task_pool/evaluation_scripts/controller/controller_task/position_controller.py
 create mode 100644 catkin_ws/src/learn_environment/task_pool/solution_scripts/controller/controller_task/position_controller.ipynb

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 0000000..e69de29
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 0000000..4ad40f7
--- /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 5be619c..9a4f3c5 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 172f8b9..9a05ef1 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 8a52ba9..04ae9c6 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 f71e067..1e7b41a 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 1e5d387..8bb63b9 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 0735fb3..7e6d945 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"
         }
       ]
     },
-- 
GitLab