Rosbag gyakorlás

Tartalom

Videó

A gyakorlat a jobb érthetőség és az otthoni feldolgozás miatt akár videóként is megtekinthető. A videó szöveges magyarázat nélküli, rövidített, cserébe mutatja a parancsok kiadásától elvárható működést: youtu.be/Hu7YseOh3qk

Előkészületek

A következő példák egy Turtlebot3 robot és egy Nissan Leaf önvezető autó .bag fájlait használják majd. A .bag az ROS log fájtípusa, méréseket mentésére, visszajátszására, szerkeztésére stb. szolgál.

turtle-leaf

Nyissunk egy terminált (ctr+alt+t), hozzunk létre egy rosbag-gyak mappát, majd lépjünk bele.

mkdir ~/rosbag-gyak
cd ~/rosbag-gyak

Töltsük le a 2 rosbag fájlt.

wget www.sze.hu/~herno/PublicDataAutonomous/turtlebot-2019-03-11-SLAM-no-camera.bag
wget www.sze.hu/~herno/PublicDataAutonomous/leaf-2019-03-13-a-no-lidar.bag

Vizsgáljuk meg, hogy tényleg ~46MB méretű-e Turtlebot és ~9MB méretű-e a Leaf .bag fájl.

ls --size 
ls --size --block-size=M
ls -l --block-size=M

Nézzük meg a következő videót, ez a Turtlebot .bag fájl rögzítésekor készült: youtu.be/QwagQFvhbNU

turtle-yt

Megjegyzés: www.sze.hu/~herno/PublicDataAutonomous linken további .bag fájlok találhatóak.

A terminalban indítsunk egy roscore-t. Később leááítható ctr + c segítségével.

roscore

Nyissunk egy újabb tabot a terminálban (ctr+shift+t). Ha nem rosbag-gyak-ban lennénk, cd-zzünk. A -l kapcsoló loopolja a bag-et, a play mondja meg, hogy lejátszuk és nem például rögzítjük a bag-et.

cd ~/rosbag-gyak
rosbag play -l turtlebot-2019-03-11-SLAM-no-camera.bag 

Később ugyanígy játszhatjuk le a leaf-2019-03-13-a-no-lidar.bag-et is.

Topicok terminalból

Nyissunk egy újabb tabot a terminálban (ctr+shift+t), majd vizsgáljuik meg a topicokat.

rostopic list 

Ezt kellene látnunk.

    /battery_state
    /clock
    /cmd_vel
    /cmd_vel_rc100
    /constraint_list
    /diagnostics
    /firmware_version
    /flat_imu
    /imu
    /joint_states
    /landmark_poses_list
    /magnetic_field
    /map
    /move_base/TebLocalPlannerROS/parameter_descriptions
    /move_base/TebLocalPlannerROS/parameter_updates
    /move_base/global_costmap/costmap
    /move_base/global_costmap/costmap_updates
    /move_base/global_costmap/footprint
    /move_base/global_costmap/inflation_layer/parameter_descriptions
    /move_base/global_costmap/inflation_layer/parameter_updates
    /move_base/global_costmap/obstacle_layer/parameter_descriptions
    /move_base/global_costmap/obstacle_layer/parameter_updates
    /move_base/global_costmap/parameter_descriptions
    /move_base/global_costmap/parameter_updates
    /move_base/global_costmap/static_layer/parameter_descriptions
    /move_base/global_costmap/static_layer/parameter_updates
    /move_base/local_costmap/costmap
    /move_base/local_costmap/costmap_updates
    /move_base/local_costmap/footprint
    /move_base/local_costmap/inflation_layer/parameter_descriptions
    /move_base/local_costmap/inflation_layer/parameter_updates
    /move_base/local_costmap/obstacle_layer/parameter_descriptions
    /move_base/local_costmap/obstacle_layer/parameter_updates
    /move_base/local_costmap/parameter_descriptions
    /move_base/local_costmap/parameter_updates
    /move_base/parameter_descriptions
    /move_base/parameter_updates
    /move_base/status
    /odom
    /rosout
    /rosout_agg
    /rpms
    /scan
    /scan_matched_points2
    /sensor_state
    /submap_list
    /tf
    /tf_static
    /trajectory_node_list

Vizsgáljunk meg minél több topicot rostopic type illetve rosmsg show-val. A rostopic type /odom parancs hatására megtudhatjuk az /odom topic típusát, ami nav_msgs/Odometry. Ha ki akarjuk deríteni a nav_msgs/Odometry felépítését a rosmsg show nav_msgs/Odometry-re lesz szükségünk. A két parancsot kényelmesebb egybe kiadni, az első parancs kimenete lesz a második eleje egy |- karakter segítségével, az egész egyben pedig így néz ki:

rostopic type /odom | rosmsg show

Erre megkapjuk, ugyanazt, mint a rosmsg show nav_msgs/Odometry-val, is kapunk, tehát az odometria üzenet felépítését.

    std_msgs/Header header
    uint32 seq
    time stamp
    string frame_id
    string child_frame_id
    geometry_msgs/PoseWithCovariance pose
    geometry_msgs/Pose pose
        geometry_msgs/Point position
        float64 x
        float64 y
        float64 z
        geometry_msgs/Quaternion orientation
        float64 x
        float64 y
        float64 z
        float64 w
    float64[36] covariance
    geometry_msgs/TwistWithCovariance twist
    geometry_msgs/Twist twist
        geometry_msgs/Vector3 linear
        float64 x
        float64 y
        float64 z
        geometry_msgs/Vector3 angular
        float64 x
        float64 y
        float64 z
    float64[36] covariance

Vizsgáljunk meg minél több topicot rostopic echo-val. Leállítás ctr + c

rostopic echo /odom
    header: 
    seq: 22203
    stamp: 
        secs: 1552323858
        nsecs: 875916038
    frame_id: "odom"
    child_frame_id: "base_footprint"
    pose: 
    pose: 
        position: 
        x: -0.379863917828
        y: 0.126037299633
        z: 0.0
        orientation: 
        x: 0.0
        y: 0.0
        z: -0.485380351543
        w: 0.874303102493
    covariance: [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]
    twist: 
    twist: 
        linear: 
        x: 0.151097133756
        y: 0.0
        z: 0.0
        angular: 
        x: 0.0
        y: 0.0
        z: 0.0535195507109
    covariance: [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]

rqt_plot

Indítsuk az rqt_plot-ot terminalbol, adjuk hozzá például az /imu/linear_acceleration topciot. Megjegyzés: az rosbag visszajátszásánál nem állítottuk be, hogy időt generáljon (pedig lehetne), de így a mérés a ploton újrakezdődhet.

rosrun rqt_plot rqt_plot

rqtp

További információ: wiki.ros.org/rqt_plot

rviz

Indítsuk az rviz-t.

rosrun rviz rviz

Adjunk hozzá különböző topicokat: Add » By topic » Kiválaszt » Ok. Például így nézzen ki:

rviz

További információ: wiki.ros.org/rviz

python

A következőkben a listenerTurtle.py segítségével feliratkozunk az /odom és az /imu topicokra és első körben kiíratjuk az odom x és y pozícióját, valamint az imu lineáris gyorsulásait. Anonymous módon feliratkozunk a két topcira, listener névvel (a név gyakolratilag mellékes). Két úgynevazett callback fügvényt használunk a feliratkzáshoz.

import rospy
import std_msgs.msg as rosmsg
import nav_msgs.msg as navmsg
import sensor_msgs.msg as senmsg

def odometryCallBack(msg):
    print("odom(x,y): %8.4f %8.4f " % (msg.pose.pose.position.x, msg.pose.pose.position.y))

def imuCallBack(msg):
    print("imu(xyz):  %8.4f %8.4f %8.4f" % (msg.linear_acceleration.x, msg.linear_acceleration.y, msg.linear_acceleration.z))

rospy.init_node("listener", anonymous=True)
rospy.Subscriber("/odom", navmsg.Odometry, odometryCallBack)
rospy.Subscriber("/imu", senmsg.Imu, imuCallBack)
rospy.spin()

Ha nem szeretnénk klónozni a teljes repository-t, akkor wget-tel is letölthetjük a listenerTurtle.py-t, a plotterLeaf.py-t és a plotterTurtle.py-t.

wget https://raw.githubusercontent.com/horverno/ros-gyakorlatok/master/1-rosbag-es-topicok/listenerTurtle.py
wget https://raw.githubusercontent.com/horverno/ros-gyakorlatok/master/1-rosbag-es-topicok/plotterTurtle.py
wget https://raw.githubusercontent.com/horverno/ros-gyakorlatok/master/1-rosbag-es-topicok/plotterLeaf.py

A plotterTurtle.py és a plotterLeaf.py hasonló az előzőhöz, de terminal helyett GUI-ba írja az adatokat. A pyqt és a pyqtgraph segítségével felhasználói felületeket készíthetünk, amiket nem csupán scripként, de futtatható állományként, vagy akár telepítőként is használhatunk. Első lépésként ellenőrizzük, hogy telepítve vannak-e a szükséges package-k, a következő importokkal:

import PyQt5
import pyqtgraph

Amennyiben ModuleNotFoundError-t kapunk telepítsük a két package-t:

sudo apt install python3-pip
pip3 install numpy rospkg pyqt5 pyqtgraph PyYaml

Vagy python 2:

sudo apt install python-pip
pip install pyqt5 pyqtgraph

A Nissan leaf helyzetét több fajta módon is számíthatjuk. Lehet a bicikli kinematikai modellel és lehet a GPS alapján. A gépjármű-szerű (négy kerékkel rendelkező, első tengelyen kormányozható) robot egyszerűsített kinematikai leírására használhatjuk a bicikli modellt, ami könnyen szmolható, azonban az idő függvényében egyre nagyobb pontatlansága lesz. Ez a /leaf/odom topicon érhető el a Leaf .bag fájl visszajátszásával. A GPS pozíció magától érthetődőbb, szerencsére a mérés során egy különlegesen pontos GPS-t használtunk, ez a /gps/odom topicon érhető el. Vizualizáljuk a két topicot a plotterLeaf.py segítségével.

python plotterLeaf.py

plot

Sokkal összetetteb dolgot is megvalósíthatunk a Turtlebot .bag fájl visszajátszásával. Itt nagyon sok topicot vizualizálhatunk.

plot

Vizsgáljuk meg a fájokat VS code segítségével (cd ~/rosbag-gyak, ha nem ott lennénk)

code .

Ez egy VS code környezetet nyit meg, az aktuális mappával, majd visszaadja a terminal prompt-ot.

Kezdőoldal

GitHub Pages kezdőoldal: horverno.github.io/ros-gyakorlatok