bachfeld.com

logo

Gesammelte Werke

Links

Install from source How to build just one package using catkin_make? Best way to add new package to ROS that was installed from source (rosinstall_generator) Adding or Updating packages Installing Packages How to run roscore or roslaunch when i boot Building ROS Melodic with Python3 support ROS melodic does it support Turtlebot2 ? Building a Movable Robot Model with URDF TurtleBot3Blockly TurtleBot3 Programming

Lidar

Sweep installieren und betreiben

Ordnerstruktur unter ROS

Die ROS-Installation über den Paket-Manager liegt unter /ros/opt/kinetic bzw /ros/opt/indigo.

Der Pfad dahin wird über eine Umgebungsvariable gesetzt

Eigene Paket bzw solche die über Source-Code nachinstalliert werden/wurden liegen bei mir unter ~/catkin_ws.

Die Struktur ist wie folgt:

catkin

Eigene Nodes unter ROS

Ziel: Wenn die Spannung des LiPo-Akkus unter einen bestimmten Wert sinkt, soll der Roboter eine Warnung aussprechen.

Das folgende Skript liest den Wert des AD-Wandlers 0 am Odroid XU4:

#!/usr/bin/env python

import wiringpi2 as wpi
import rospy
from std_msgs.msg import Int32

rospy.init_node('topic_publisher')
pub = rospy.Publisher('extbatterie', Int32)
rate = rospy.Rate(1)
wpi.wiringPiSetupSys()

while not rospy.is_shutdown():

  adcValue = wpi.analogRead(0)
  print adcValue
  pub.publish(adcValue)
  rate.sleep()

Wichtig ist der Befehl wpi.wiringPiSetupSys(), der die Ports für WiringPi unter dem Odroid richtig konfiguriert.

Der Node wird gestartet mit: rosrun battnode battnode.py

#!/usr/bin/env python

import wiringpi2 as wpi
import rospy
import pygame
from std_msgs.msg import Int32

samplebefore = None

def callback(msg):
  global samplebefore
  print msg.data
  if msg.data < 2600 and samplebefore < 2600:
    pygame.mixer.music.play()
  samplebefore=msg.data


pygame.mixer.init(44100,-16,2,2048)
pygame.mixer.music.load("batterie.mp3")

rospy.init_node ('topic_subscriber')
sub = rospy.Subscriber('extbatterie', Int32, callback)
rospy.spin()

rosrun battnode warnlow.py

MD25 auf Teensy

Publisher Encoders, Voltage

roscore
$:rosrun rosserial_python serial_node.py /dev/ttyACM0
[INFO] [1511208083.022703]: ROS Serial Python Node
[INFO] [1511208083.030162]: Connecting to /dev/ttyACM0 at 57600 baud
[INFO] [1511208085.203695]: Note: publish buffer size is 512 bytes
[INFO] [1511208085.204471]: Setup publisher on rosso_md25_encoder1 [std_msgs/Int32]
[INFO] [1511208085.208554]: Setup publisher on rosso_md25_encoder2 [std_msgs/Int32]
[INFO] [1511208085.212869]: Setup publisher on rosso_md25_encoders [std_msgs/Float32MultiArray]
[INFO] [1511208085.217673]: Setup publisher on rosso_md25_voltage [std_msgs/UInt8]
[INFO] [1511208085.223492]: Note: subscribe buffer size is 512 bytes
[INFO] [1511208085.224190]: Setup subscriber on rosso_md25_encoder_reset [std_msgs/Bool]
[INFO] [1511208085.229413]: Setup subscriber on rosso_md25_motor1_speed [std_msgs/Int8]
[INFO] [1511208085.236738]: Setup subscriber on rosso_md25_motor2_speed [std_msgs/Int8]
[INFO] [1511208085.243059]: Setup subscriber on rosso_md25_motors_speed [std_msgs/Int8]
[INFO] [1511208085.255203]: Setup subscriber on cmd_vel [geometry_msgs/Twist]
rostopic echo /rosso_md25_encoders

Razor IMU 9DOF

sudo apt-get install ros-kinetic-razor-imu-9dof python-visual wxtools

Problem

roslaunch razor_imu_9dof razor-pub-and-display.launch
... logging to /home/dab/.ros/log/5036a962-c258-11e7-b164-485d60d3a251/roslaunch-P6630-19225.log
Checking log directory for disk usage. This may take awhile.
Press Ctrl-C to interrupt
Done checking log file disk usage. Usage is <1GB.

error loading <rosparam> tag:
        file does not exist [/opt/ros/kinetic/share/razor_imu_9dof/config/my_razor.yaml]
XML is <rosparam command="load" file="$(arg razor_config_file)"/>
The traceback for the exception was written to the log file

Lösung

dab@P6630:~/Downloads$ sudo cp /opt/ros/kinetic/share/razor_imu_9dof/config/razor.yaml /opt/ros/kinetic/share/razor_imu_9dof/config/my_razor.yaml



ROS Kinetic auf Raspberry Pi 3 mit Stretch installieren

basierend auf der Anleitung http://wiki.ros.org/ROSberryPi/Installing%20ROS%20Kinetic%20on%20the%20Raspberry%20Pi

  393  sudo sh -c 'echo "deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main" > /etc/apt/sources.list.d/ros-latest.list'
  394  sudo apt-key adv --keyserver hkp://ha.pool.sks-keyservers.net:80 --recv-key 421C365BD9FF1F717815A3895523BAEEB01FA116
  395  sudo apt-get install dirmngr
  396  sudo apt-key adv --keyserver hkp://ha.pool.sks-keyservers.net:80 --recv-key 421C365BD9FF1F717815A3895523BAEEB01FA116
  397  sudo apt-get update
  398  sudo apt-get install -y python-rosdep python-rosinstall-generator python-wstool python-rosinstall build-essential cmake
  399  sudo rosdep init
  400  rosdep update
  401  mkdir -p ~/ros_catkin_ws
  402  cd ros_catkin_ws/
  403  ls
  404  rosinstall_generator ros_comm --rosdistro kinetic --deps --wet-only --tar > kinetic-ros_comm-wet.rosinstall
  405  rosinstall_generator desktop --rosdistro kinetic --deps --wet-only --tar > kinetic-desktop-wet.rosinstall
  406  wstool init src kinetic-desktop-wet.rosinstall
  407  rosdep install -y --from-paths src --ignore-src --rosdistro kinetic -r --os=debian:stretch
  408  sudo ./src/catkin/bin/catkin_make_isolated --install -DCMAKE_BUILD_TYPE=Release --install-space /opt/ros/kinetic -j2
  409  dmesg
  410  sudo mkswap /dev/sda1
  411  sudo vi /etc/fstab 
  412  sudo nano /etc/fstab 
  413  swapon /dev/sda1
  414  sudo swapon /dev/sda1
  415  sudo swapon 
  416  sudo ./src/catkin/bin/catkin_make_isolated --install -DCMAKE_BUILD_TYPE=Release --install-space /opt/ros/kinetic -j2
  419  $ echo "source /opt/ros/kinetic/setup.bash" >> ~/.bashrc
  422  sudo apt-get install tmux
  431  cd src/
  432  ls
  433  git clone https://github.com/ros/urdf_tutorial.git
  434  ls urdf_tutorial/
  435  cd ..
  436  ls
  437  roslaunch urdf_tutorial display.launch model:=urdf/01-myfirst.urdf
  438  mc
  439  less /opt/ros/kinetic/setup.bash 
  440  less /opt/ros/kinetic/setup.sh
  441  less ros_catkin_ws/devel_isolated/setup.bash 
  442  source ros_catkin_ws/devel_isolated/setup.bash 
  443  pwd
  444  cd ros_catkin_ws/
  445  catkin_make
  446  cd ..
  447  mkdir catkin_ws
  448  cd catkin_ws/
  449  catkin_make
  450  mkdir src
  451  catkin_make
  452  ls
  453  mc
  454  source devel/setup.bash 
  455  roslaunch urdf_tutorial display.launch model:=urdf/01-myfirst.urdf
  456  roslaunch urdf_tutorial display.launch model:='$(find urdf_tutorial)/urdf/01-myfirst.urdf'



URDF für Roboter

<robot name="dabot">

    <!-- * * * Link Definitions * * * -->

    <link name="base_link">
        <visual>
            <origin xyz="0 0 0.1" rpy="0 0 0"/>
            <geometry>
                <box size="0.20 0.30 0.10"/>
            </geometry>
            <material name="Cyan1">
                <color rgba="0 0.9 0.9 1.0"/>
            </material>
        </visual>   
    </link>


    <link name="lwheel">
       <visual>
         <geometry>
           <cylinder length="0.01" radius="0.05"/>
         </geometry>
         <origin rpy="1.57 1.57 0" xyz="0.12 0 0.05"/>
         <material name="black">
           <color rgba="0 0 0 1"/>
         </material>
       </visual>
    </link>

    <link name="rwheel">
       <visual>
         <geometry>
           <cylinder length="0.01" radius="0.05"/>
         </geometry>
         <origin rpy="1.57 1.57 0" xyz="-0.12 0 0.05"/>
         <material name="black">
           <color rgba="0 0 0 1"/>
         </material>
       </visual>
    </link>


<link name="fwheel">
       <visual>
         <geometry>
           <cylinder length="0.01" radius="0.02"/>
         </geometry>
         <origin rpy="1.57 1.57 0" xyz="0 0.12 0.02"/>
         <material name="black">
           <color rgba="0 0 0 1"/>
         </material>
       </visual>
    </link>

    <link name="bwheel">
       <visual>
         <geometry>
           <!-- * * * <cylinder length="0.01" radius="0.02"/> -->
           <sphere radius="0.02"/>
         </geometry>
         <origin rpy="1.57 1.57 0" xyz="0 -0.12 0.02"/>
         <material name="black">
           <color rgba="0 0 0 1"/>
         </material>
       </visual>
    </link>

  <joint name="base_to_lwheel" type="fixed">
       <parent link="base_link"/>
       <child link="lwheel"/>
       <origin xyz="0.0 0 0.0" rpy="0 0 0"/>
  </joint>

</robot>



SLAM

http://meetjanez.splet.arnes.si/2015/08/22/neato-xv-11-to-ros-slam/ http://wiki.ros.org/hector_mapping http://www.ros.org/reps/rep-0105.html http://wiki.ros.org/hector_slam/Tutorials/SettingUpForYourRobot



Joystick-Steuerung

Nach Installation von ros-kinetic-ros-base und der Installation von Turtlebot: n/a



Intel RealSense R200

Mit dieser Anleitung gelang unter Ubuntu 16.04 die Inbetriebname einer R200 https://github.com/IntelRealSense/librealsense/blob/master/doc/distribution_linux.md#installing-the-packages

Allerdings funktioniert der realsense-viewer nicht. Er steigt mit folgender Fehlermeldung aus:

22/07 20:41:20,400 WARNING [139941765056256] (types.cpp:57) set_pu(id=3) failed! Last Error: Input/output error
 22/07 20:41:20,402 WARNING [139941765056256] (sensor.cpp:717) Exception was thrown when inspecting properties of a sensor

Immerhin lief der ROS-Node

Mit

roslaunch realsense_camera r200_nodelet_default.launch 

ließ sich der Node starten. Zur Anzeige des Farbbildes und des Tiefenbildes

rosrun rqt_image_view rqt_image_view

starten.

enter image description here

Für den Odroid XU 4 mit Ubuntu 16.04 könnte diese Anleitung funktionieren:

https://alessiomorale.com/wordpress/2017/11/01/setting-realsense-r200-odroid-xu4-ros/



Xiaomi Lidar verkabeln

Der in Xiaomis Saugrobotern verwendete Lidar ist XV11-kompatibel. Deshalb kann man leicht die bereits vorhandenen Bibliotheken für Arduino, Pi und ROS verwenden. Zuvor muss man allerdings den Sensor richtig verkabeln, also mit Spannung versorgen und die seriellen Daten per USB2Serial-Wandler an den PC/SBC weiterreichen

Man kann für erste Tests in die Headerleiste Jumperkabel zu Kontaktierung stecken, im zweiten Schritt habe ich die Kabel an die Lötpunkte der Headerleiste gelötet. enter image description here

Die Belegung enter image description here

gemäß oberen Bild

Header Pin
1 ncc
2 Vcc
3 Tx
4 MOT-/GND
5 GND
6 MOT+/Vcc

enter image description here

enter image description here

enter image description here

enter image description here

Written with StackEdit.



Arduino & ROS

sudo apt-get install ros-kinetic-rosserial-arduino
sudo apt-get install ros-kinetic-rosserial
cd ~/Arduino/libraries/ # oder wo auch immer die Libs abgelegt sind
rosrun rosserial_arduino make_libraries.py .

Danach liegt in dem Ordner das Verzeichnis ros_lib

Anschließend muss in der Arduino IDE unter Datei/Beispiele der Punkt ros_lib auftauchen.

enter image description here



install from scratch

sudo sh -c 'echo "deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main" > /etc/apt/sources.list.d/ros-latest.list'

sudo apt-key adv --keyserver hkp://ha.pool.sks-keyservers.net:80 --recv-key 421C365BD9FF1F717815A3895523BAEEB01FA116

sudo apt update

sudo apt install ros-melodic-desktop-full
sudo rosdep init
rosdep update
reading in sources list data from /etc/ros/rosdep/sources.list.d
Hit https://raw.githubusercontent.com/ros/rosdistro/master/rosdep/osx-homebrew.yaml
Hit https://raw.githubusercontent.com/ros/rosdistro/master/rosdep/base.yaml
Hit https://raw.githubusercontent.com/ros/rosdistro/master/rosdep/python.yaml
Hit https://raw.githubusercontent.com/ros/rosdistro/master/rosdep/ruby.yaml
Hit https://raw.githubusercontent.com/ros/rosdistro/master/releases/fuerte.yaml
Query rosdistro index https://raw.githubusercontent.com/ros/rosdistro/master/index-v4.yaml
Add distro "groovy"
Add distro "hydro"
Add distro "indigo"
Add distro "jade"
Add distro "kinetic"
Add distro "lunar"
Add distro "melodic"
updated cache in /home/dab/.ros/rosdep/sources.cache
echo "source /opt/ros/melodic/setup.bash" >> ~/.bashrc
source ~/.bashrc

für spätere Instalation eigener oder fremder Pakete in eigenem Workspace catkin_ws

sudo apt install python-rosinstall python-rosinstall-generator python-wstool build-essential
mkdir -p ~/catkin_ws/src
cd catkin_ws/src
catkin_make
echo "source /home/dab/catkin_ws/devel/setup.bash" >> ~/.bashrc

Jetzt sollten je ein Pfad zu den per apt-get installierten Paketen und der manuell übersetzten Paketen zeigen:

dab@dab-Alpha:~$  echo $ROS_PACKAGE_PATH
/home/dab/catkin_ws/src:/opt/ros/melodic/share

Warum hier catkin_make und nicht catkin init?



XV-11 Clone

running http://wiki.ros.org/xv_11_laser_driver/Tutorials/Running%20the%20XV-11%20Node http://www.tobias-weis.de/neato-xv-laser-scanner-lidar/

http://zdome.net/wiki/index.php/ROS

das damalige Problem https://stackoverflow.com/questions/45896414/boost-asio-serial-port-end-of-file gelöst mit

stty -F /dev/ttyUSB0 raw

reverse engineering der Datenstruktur https://forum.processing.org/two/discussion/26201/neato-lidar-sensor-and-reading-the-serial-data-and-making-sense-of-it

xv11 mit hector slam

http://meetjanez.splet.arnes.si/2015/08/22/neato-xv-11-to-ros-slam/

http://www.theconstructsim.com/ros-qa-122-how-to-show-laser-data-on-rviz/



Lidar

Kennen Sie das? Eigentlich wollte man nur mal eben etwas in Betrieb nehmen, das geht etwas trotz genauer Anleitung nicht und schon artet das kleine Experiment in einen Ausflug in die Untiefen von Hardware und Sofware aus.

Neulich wollte ich einen Lasersensor testen, der als Ersatzteil für Staubsaugerroboter von Xiaomi auf Aliexpress für knapp 120 Euro zu haben ist. Der Sensor schickt Laserstrahlen in die Umgebung und misst per Laufzeit, wie weit Objekte entfernt sind. Da sich der Sensor kontinuierlich dreht, hat er quasi eine Rundumsicht. Anhang 360 Punkte (zu jedem Winkel) kann man sogar eine Karte eines Raumes erstellen und abspeichern. Die Saugroboter nutzen die Kartierungsfunktion um systematisch Räume zu reinigen.

Da liegt es nahe, diesen Lasersensor (LIDAR oder LDS) auch für eigene Experimente einzusetzen. Alternative Sensoren wie der Sweep kosten bei der gleichen Genauigkeit mehr als 300 Euro. Und die auf vielen Forschungsrobotern eingesetzten Sensoren von Sick und Hokuyo kosten jenseits von 1000 Euro.

Der Xiaomi isz kompatibel zum Neato XV11, dessen Lidar bereits recht gut dokumentiert ist. Wie man ihn anschließt, ist unter anderem hier zu sehen.

http://wiki.ros.org/xv_11_laser_driver/Tutorials/Connecting%20the%20XV-11%20Laser%20to%20USB

Die ROS-Anleitung zum Start des XV11-Nodes ist recht kompakt, Paket installieren und dann mit rosrun starten

sudo apt-get install ros-kinetic-xv-11-laser-driver
roscore
rosrun xv_11_laser_driver neato_laser_publisher

leider wirft der Node den Fehler “end of file” aus und stoppt. Der erste Verdacht fällt natürlich auf eine fehlerhafte Verbindung des Sensors zum USB2Serial-Adapter. Doch das Oszibild zeigt, dass sehr wohl Daten zum Adapter gehen.

enter image description here

Es bleibt aber offen, welche Daten zum PC wirklich rübergehen und ob sie den erwarteten Daten entsprechen. Hier kommt das Terminalprogramm hterm ins Spiel, mit dem sich unter Linux die serielle Überträgung hervoragend debuggen lässt. Das Tool habe ich auch schon zum Analysieren der Daten von einer Sick-Sensor PLS200 verwendet.

Download hier: http://www.der-hammer.info/terminal/

Auspacken und starten, wirft allerdings einen Fehler, der sich durch Installation von 2 Libs beseitigen lässt hterm

sudo apt-get install libgtk2.0-0:i386
sudo apt-get install libsm6:i386

Anschließend kann man sich die Daten mit

./hterm

anzeigen lassen (Connect /dev/ttyUSB0)

Mit folgender Analyse versteht man die übertragenen Daten: https://xv11hacking.wikispaces.com/LIDAR+Sensor

Während einer vollen Umdrehung überträgt der Sensor 360 Werte für eine Entfernung. Die Werte werden in 90 Datenpaketen verpackt und über die serielle Schnittstelle bei 115200 Baud gesendet. In jedem Datenpaket sind vier Arrays mit jeweils 2 Bytes für die gemessene Entfernungs sowie Bytes für die Signalstärke und mögliche Fehler. 90 Pakete mal 4 Entfernungen macht 360 Werte Die Pakete beginnen immer mit der Präambel 0xFA worauf ein Index-Byte folgt - beginnend mit 0xA0 und hochzählend bis 0xF9.

enter image description here

Die vom PC empfangenen Daten sind also im richtigen Format und wenn man die Pakete durchlaufen lääst, sieht man auch, dass die richtige Menge übertragen wird. Die Meldung “end of file” kann also nicht dvon zu wenig oder fehlerhaft übertragenen Daten herrühren.

http://www.tobias-weis.de/neato-xv-laser-scanner-lidar/

unter Display/Global Options den Fixed Frame von “map” auf “neato_laser” umstellen

dann “add” unter “Fixed Frame” und zwar LaserScan Unter LaserScan das Topic “/scan” eintragen

reading serial data https://forum.processing.org/two/discussion/26201/neato-lidar-sensor-and-reading-the-serial-data-and-making-sense-of-it

install hterm

hier sourcen https://github.com/rohbotics/xv_11_laser_driver/blob/kinetic-devel/src/xv11_laser.cpp

zeile 113 problem boost::asio::read(serial_, boost::asio::buffer(&raw_bytes[start_count],1));

cwu-Paket? http://library.isr.ist.utl.pt/docs/roswiki/xv_11_laser_driver(2f)Tutorials(2f)Running(20)the(20)XV(2d)11(20)Node.html

ROS_ERROR

Boost asio serial port “end of file” stty -F /dev/ttyUSB0 raw

https://hackaday.com/2016/01/22/how-to-use-lidar-with-the-raspberry-pi/



Navigation

Apriltags http://wiki.ros.org/apriltags2_ros https://pypi.org/project/apriltag/ https://github.com/swatbotics/apriltag

Written with StackEdit.



Motor control

http://kookye.com/2017/08/30/tank_robot_car_lesson7/

http://johntrimble.com/blog/2013/07/11/building-an-incremental-rotary-encoder/

https://www.sparkfun.com/products/9453

http://heliosoph.mit-links.info/make-your-own-quadrature-rotary-encoder/

https://github.com/linorobot/linorobot

Written with StackEdit.