Integracja z systemem ROS


Integracja z systemem ROS została zrealizowana poprzez opracowanie interfejsów i komunikacji, na które składa się (patrz również rysunek niżej):

  • przesłanie ustalonych parametrów dla funkcji robota.
  • sterowanie robotem.
  • przesłanie rezultatu wykonania funkcji robota.


Zgodnie z powyższym schematem została opracowana biblioteka autero, sterująca robotem Velma. Biblioteka pozwala na sterowanie ramieniem, które przemieszcza się do pozycji wskazanej za pomocą punktów przesłanych przez sieć w prostym pliku XML. Zawiera ona skrypty w języku Python. Głównym skryptem jest velma_server.py, który odbiera dane i odpowiednio steruje ramieniem. Aby skorzystać z biblioteki, należy zainstalować odpowiednie oprogramowanie, zgodnie z instrukcjami na stronie projektu. Symulowane środowisko można skonfigurować korzystając z instrukcji na stronie https://github.com/dseredyn/velma_examples/wiki.
Serwer pośredniczący uruchamiamy w poniższy sposób (wykorzystujemy środowisko symulowane).

  1. Rozpakowujemy projekt z biblioteką autero do wybranego katalogu. W opisywanym przykładzie będzie to katalog ~/catkin_ws/
  2. Przed kompilacją projektu należy podać biblioteki Velma jako źródło. Przyjmujemy, że zostały skompilowane i znajdują się w katalogu ~/ws_velma/. Uruchamiamy więc:
    source ~/ws_velma/underlay/devel/setup.bash
    cd ~/catkin_ws/
    catkin_make
    
  3. Musimy mieć uruchomiony cały system symulowanego ramienia. Uruchamiany poniższe instrukcje w oddzielnych terminalach:
    cd ~/ws_velma/underlay
    source devel/setup.bash
    roscore
    
    cd ~/ws_velma/underlay
    devel/setup.bash
    rosrun rviz rviz
    
    cd ~/ws_velma/underlay
    source devel/setup.bash
    roslaunch velma_common velma_fake.launch
    
  4. Teraz w nowej konsoli podajemy źródło do projektu biblioteki autero i uruchamiamy serwer:
    source ~/catkin_ws/devel/setup.bash
    rosrun autero velma_server.py
    

Działanie serwera można przetestować za pomocą skryptu arm_client. Skrypt uruchamia się z trzema parametrami (X, Y, Z) będącymi pozycją obiektu do chwycenia. Dodanie kolejnych 3 parametrów uruchamia dodatkowo funkcję odkładającą przedmiot na podanym obiekcie. Podawane parametry to położenie środka obiektu, na którym odkładamy. Reszta wymaganych parametrów funkcji jest zapisana w skrypcie.
Przykład (w tym przypadku wywołuje się tylko funkcja chwytania):

rosrun autero arm_client.py 0.92 -0.15 1.2

Przykładowe wywołanie funkcji zostało przedstawione na poniższym rysunku.



Zadanie funkcji polega na odłożeniu uprzednio chwyconego obiektu na wskazanym obiekcie. Przekazywane parametry:

  • kształt trzymanego obiektu
  • kształt obiektu, na którym będzie odłożony trzymany obiekt
  • pozycja obiektu, na którym będzie odłożony trzymany obiekt


Przykładowy plik XML z wywołaniem funkcji GrabObject
<?xml version="1.0" encoding="UTF-8"?>
<functon name="GrabObject">
   <param name="PositionX">0.92</param>
   <param name="PositionY">-0.15</param>
   <param name="PositionZ">1.2</param>
   <param name="RotationX">0</param>
   <param name="RotationY">0</param>
   <param name="RotationZ">0</param>
   <param name="Shape">
      <type>ComplexJarShape</type>
      <attribute name="Radius">0.325</attribute>
      <attribute name="Height">0.375</attribute>
   </param>
</functon>

Przykładowy plik XML z wywołaniem funkcji PutObjectOn
<?xml version="1.0" encoding="UTF-8"?>
<functon name="PutObjectOn">
   <param name="Name">Jar001</param>
   <param name="Weight">1</param>
   <param name="Shape">
      <type>ComplexJarShape</type>
      <attribute name="Radius">0.325</attribute>
      <attribute name="Height">0.4</attribute>
   </param>
   <param name="PutOnObjectPositionX">1</param>
   <param name="PutOnObjectPositionY">-0.6</param>
   <param name="PutOnObjectPositionZ">0.8</param>
   <param name="PutOnObjectRotationX">0</param>
   <param name="PutOnObjectRotationY">0</param>
   <param name="PutOnObjectRotationZ">0</param>
   <param name="PutOnObjectName">TableTop001</param>
   <param name="PutOnObjectWeight">4</param>
   <param name="PutOnObjectShape">
      <type>CuboidSideBoardShape</type>
      <attribute name="Width">1.25</attribute>
      <attribute name="Height">0.8</attribute>
      <attribute name="Length">1.25</attribute>
   </param>
</functon>

biblioteki Autero