Afdrukken

Beste lezers,

Het is even stil geweest, maar we gaan weer beginnen, ik heb eerste gewacht tot we een redelijk aantal meldingen van de poll binnen hadden, zodat ik een besluit kon nemen welke kant we precies wilde opgaan. Ik kaan helaas niet aan iedereen zijn wensen voldoen, dus ik ga een pad kiezen waarmee de meeste mensen tevreden mee zullen zijn. Dit wil niet zeggen dat ik helemaal niets doe met de andere wensen, dat kan misschien wel later komen in vervolg artikelen. Maar voor nu, de meeste stemmen gelden. Ik laat de poll online zodat ik meer info kan krijgen wat men nu precies wil. Dus laten we beginnen.

 

Als ik naar de poll kijk, zijn de meeste stemmen uit gegaan naar C++ en arduino, dit gaan we dus gebruiken. Ook ga ik er vanuit, is dat we een rijdende (differentiaal drive) robot willen maken. Wat we tot nu toe gedaan hebben, is Ubuntu installeren en ROS. op een pc. Hier gaan we eerst mee beginnen, om te technieken te leren voor het ROS programmeren. Wat we daarna gaan doen, is een arduino bordje gebruiken, en die verbinden we dan met de pc. Zoals jullie wel zullen begrijpen, is het niet altijd mogelijk, om een pc Compleet op de robot te plaatsen. Daarom zal uit eindelijk ons systeem uit 2 onderdelen bestaan.

1. de pc, hier zullen we onze ROS master op laten draaien.

2. de robot, deze zal bestaan uit een arduino bord, die verbonden is met een raspberrypi, waarop ook Ubuntu en ROS is geïnstalleerd.

Deze 2 systemen, zullen met elkaar via Wifi met elkaar gaan communiceren.

Maar laten we eerst maar beginnen met kijken hoe we ROS nodes kunnen programmeren.


 Wat we als eerste moeten doen is een ROS package voor ons zelf moeten maken, dit gaan we doen in onze werkruimte, die we laatst hebben gemaakt.

$ cd ~/hcc_ws/src

In deze directory kunnen we onze packages maken.

$ catkin_create_pkg hcc_tutorials std_msgs roscpp

Nu, wat betekent het nu wat we hebben gedaan.

Als eerste catkin_create_pkg, is de commando die we uitvoeren, zoals je ziet, maken we hiermee een pakket. hcc_tutorials, dit is de naam van onze package. std_msgs, dit zorgt ervoor, dat we in ons pakket, de berichten kunnen gebruiken, die in een ander pakket die op het system al staat namelijk "std_msgs" kunnen gebruiken. en het zegt tevens dat het pakket op de computer moet zijn geinstalleerd, voor dat ons pakket gebruikt kan worden. Dat laatste geldt ook voor roscpp

Na het uitvoeren van het bovenstaande, is er in de directory, een directory met de naam "hcc_tutotorials" gemaakt. Als we in deze directory kijken, is er voor ons het volgende gecreerd.

hcc_tutorials
    CMakeLists.txt
    package.xml
    include
    src

Een korte uitleg: ROS packages build systeem maakt gebruik van de catkin programma's op linux. De CMakeLists.txt file, is daar een onderdeel van, vandaar dat deze gecreerd is voor ons pakket. de packet.xml file, is een verplichte file, die je pakket beschrijft, zolals afhankelijkheden, autheur enz.

Wat het inhoud, en wat je er mee moet doen, zal later stap voor stap met je doornemen.

Wat we nu gaan doen, is de "Hello World!" versie voor ROS schrijven. Daarvoor is in ROS 2 nodes benodigd, 1 node om een bericht de wereld in te zenden, en 1 node om er naar te luisteren, en het bericht op het beeld te zetten. Alle broncode voor c++, plaatsen we in de directory src.

Creeer de onderstaande file:

src/send_message_node.cpp

#include <ros/ros.h>
#include <std_msgs/String.h>
#include <sstream>
int main(int argc, char** argv) 
{ 
    ros::init(argc, argv, "talker"); 
    ros::NodeHandle nh; 
    ros::Publisher pub = nh.advertise("talker", 1000); 
    int count = 0;
    ros::Rate loop_rate(10);
    while (ros::ok()) 
    { 
        std_msgs::String msg;
        std::stringstream ss; 
        ss << "Hello World! " << count;
        msg.data = ss.str();
        pub.publish(msg);
        ros::spinOnce();
        loop_rate.sleep();
        count++;
    }
    return 0;
}

Laten we even kijken naar de code.

#include <ros/ros.h>

Deze include file, is een handige file, omdat deze all de benodigde include files importeerd die benodigd zijn om het ROS systeem te laten werken.

#include <std_msgs/String.h>

 Deze zorgt er voor dat we het bericht "String" kunnen gebruiken in onze code, welke zich in het std_msgs package bevind. Deze header file is gegenereert automatish van de String.msg file, die zich in dit pakket bevindt. Maar meer over messages later.

    ros::init(argc, argv, "talker");

Hier mee wordt ROS geinitialiseerd, talker is de naam van onze node. Node namen, moeten unique zijn in een werkend systeem. Wanneer je een node start, kan er vanaf de commandline door middel van name remapping een andere naam aan de node worden gegeven.

    ros::NodeHandle nh;

Hiermee verkrijgen we een handle naar de process van onze node.