ROS node-ok készítése pythonban és C++-ban
Tartalom:
- ROS wokrspace-k, pacakage-k, node-ok
- Publisher / Subscriber node C++-ban
- Publisher / Subscriber node pythonban
- rqt_graph
Előkészületek
Az előző alkalommal letöltött rosbag fájl most is kelleni fog.
mkdir ~/rosbag-gyak
cd ~/rosbag-gyak
wget www.sze.hu/~herno/PublicDataAutonomous/leaf-2019-03-13-a-no-lidar.bag
Catkin workspace készítése
Nyissuk meg, a home folderban lévő .bashrc
fájlt (pl VS code segítségével) és ellenőrizzük, hogy tartalmaz-e egy source /opt/ros/melodic/setup.bash
sort valahol a fájl végén.
code ~/.bashrc
Opcionális: Elképzelhető, hogy a catkin build
nincs telepítve a gépünkön, csak a régi catkin_make
. Ekkor telepítsük a következő paranccsal.
sudo apt-get install python-catkin-tools
Fontos megjegyzés: Lehetőleg NE használjuk a régi _make
, hanem az új catkin build
parancsot (catkin tools). A kettő nagyjából ugyanazt tudja, de nem lehet mixelni őket egy workspace-n belül. Ha mégis ilyesmi történt volna, build előtt tisztítsuk meg catkin clean
segítségével. erről bővebben: például a catkin-tools.readthedocs.io és a catkin-tools.readthedocs.io/en/latest/migration.html oldalakon olvashattok. A catkin build
további előnyei:
- Változások esetén robosztusabb konfiguráció (pl. csomag hozzáadása/eltávolítása, cmake változó módosítása stb. esetén)
- Könnyebben olvasható kimenet
- Párhuzamos fordítás, amennyiben a package-k nem függnek egymástól
- Izolált build a
catkin build package_neve
segítségével catkin clean
a veszélyesrm -rf
törlés helyett- Hasznos parancsok, mint:
catkin list
,catkin locate
,catkin profile
Hozzunk létre egy gyakolró catkin workspace-t:
mkdir -p ~/gyakorlo_ws/src
cd ~/gyakorlo_ws/
catkin init
Ha ls
paranccsal listázzuk a könyvtár tartalmát, a tipikus workspace felépítést láthatjuk. (Először csak az src
-t, de build után a többi is meg fog jelenni.)
build devel logs src
Egy workspace több pacake-t tartalmaz. Most készítsük el a gyakorlo_pkg
nevű pacake-t, ami majd több node-ot tartalmaz, majd nyissuk meg VS code segítségével az src
mappát.
cd ~/gyakorlo_ws/src
catkin create pkg gyakorlo_pkg --catkin-deps nav_msgs std_msgs rospy roscpp
code .
Eddig így néz ki a workspace.
Megjegyzés, hogy a fenti képhez hasonlót kapjunk ctr
+ k
, majd ctr
+ t
segítségével válthatunk egy világosabb témára illetve az Extension gommb segítségével (ctr
+ shift
+ x
) telepíthetünk hasznos kiegészítőket, mint például:
- C/C++ (ms-vscode.cpptools)
- Python (ms-python.python)
- Cmake (twxs.cmake)
- Material Icon Theme (pkief.material-icon-theme)
C++ fájlok beszerzése
A gyakorlo_ws/src/gyakorlo_pkg/src
mappába töltsünk le két cpp fájlt.
cd ~/gyakorlo_ws/src/gyakorlo_pkg/src
wget https://raw.githubusercontent.com/horverno/ros-gyakorlatok/master/2-ros-node-tobb-nyelven/kiir.cpp
wget https://raw.githubusercontent.com/horverno/ros-gyakorlatok/master/2-ros-node-tobb-nyelven/szamol.cpp
Feltételezve a C/C++ kiegészítőt, annak érdekében, hogy a VS code automatikus kiegészítés funkciója jól működjön, a hiányzónak jelölt incudenál, (ros/ros.h
), kattintsunk a sárga villanykörte ikonra, majd Edit "includepath" settings
és egészítsük ki egy veszzővel, plusz a "/opt/ros/melodic/include"
(ill. régebben "/opt/ros/melodic/include"
) sorral. Megjegyzés: az új felületen lehet, hogy grafikusan kell megadni az Include path
mezőben. Ezután már megtalálja az ROS-specifikus dolgokat. (Ekkor gyakolatilag a .vscode
könyvtárban található c_cpp_properties.json
-t szerkesztjük át.)
{
"configurations": [
{
"name": "Linux",
"includePath": [
"${workspaceFolder}/**",
"/opt/ros/melodic/include"
],
"defines": [],
"compilerPath": "/usr/bin/gcc",
"cStandard": "c11",
"cppStandard": "c++11",
"intelliSenseMode": "clang-x64"
}
],
"version": 4
}
Két node-ot szeretnénk a két cpp fájlból létrehozni. A csak_kiiras_node
csak kiírná a beolvasott gps és leaf biciklo modell által számolt odometriát. A tavolsag_szamitas_node
publisholná a két odometria különbségét (távolságát). Módosítsuk a CMakeLists.txt
-t így.
cmake_minimum_required(VERSION 2.8.3)
project(gyakorlo_pkg)
add_compile_options(-std=c++11)
find_package(catkin REQUIRED COMPONENTS
nav_msgs
roscpp
rospy
std_msgs
)
catkin_package(
# INCLUDE_DIRS include
# LIBRARIES gyakorlo_pkg
# CATKIN_DEPENDS nav_msgs roscpp rospy std_msgs
# DEPENDS system_lib
)
include_directories(
# include
${catkin_INCLUDE_DIRS}
)
add_executable(tavolsag_szamitas_node src/szamol.cpp)
target_link_libraries(tavolsag_szamitas_node ${catkin_LIBRARIES})
add_executable(csak_kiiras_node src/kiir.cpp)
target_link_libraries(csak_kiiras_node ${catkin_LIBRARIES})
Nyissuk meg a .bashrc
fájlt (code ~/.bashrc
) és adjuk hozzá a source ~/gyakorlo_ws/devel/setup.bash
sort. Innentől kezdve bárhonnan elérhetjük a workspace-t, és bárhonnan elindíthatjuk a a package különböző node-jait rosrun
segítségével. Buildeljük a catkin build
segítségével, most új terminalban vagy source ~/.bashrc
után elérhetők lesznek a node-ok.
cd /
roscd gyakorlo_pkg
catkin build
Most már bárhonnan indítható a 2 node.
rosrun gyakorlo_pkg csak_kiiras_node
rosrun gyakorlo_pkg tavolsag_szamitas_node
Vizsgáljuk meg a c++ fájlok működését és a node-ok végrahajtását!
ROS node pythonban
Pythonban nem kell külön a CMakeListset add_executable(..)
sorral kiegészítenünk. Minden .py fájl, aminek van futtatási joga (chmod
) és a scripts mappában található, automatikusan node lesz.
A scripts mappába tegyük bele, az előző alkalommal megismert plotter fájlt, és adjunk futtatható jogot.
wget https://raw.githubusercontent.com/horverno/ros-gyakorlatok/master/1-rosbag-es-topicok/plotterLeaf.py
sudo chmod +x plotterLeaf.py
A C++-hoz hasonlóan, most már bárhonnan indítható a node.
rosrun gyakorlo_pkg plotterLeaf.py
Önálló feladat
Jelezzük ki a /distance
topicot két tizedesjegyig, számként a plotterLeaf.py
node-ban.
Segítség az önálló feladathoz.
Ha nem tudjuk a típust, akkor nézzük meg rostopic type
illetve, ha összetett lett volna a típus akkor rosmsg show
, de ez most nem kell.
import std_msgs.msg as rosmsg # már importálva
rospy.Subscriber("/disctance", rosmsg.típus, self.sajátCallback) # feliratkozás
def sajátCallback(self, msg):
# itt adhatunk át egy osztályváltozót
class PlotHandler >> saját QLabel
>> frissítése setText-el
További részletek
Kezdőoldal
GitHub Pages kezdőoldal: horverno.github.io/ros-gyakorlatok