Einbindung meines Programms in ROS

Guten Abend liebe Community,
ich habe vor einer Weile ein Arduinoprogramm zum Ansteuern eines Sekuria Cobra geschrieben und kann dieses auch soweit ausführen und über den Serial Monitor bedienen. Jetz möchte ich den Roboter in ROS ansteuern. Hab auch das rosserial_arduino Packet installiert und mal das ros_lib Beispiel “Hallo World” ausgeführt. Hat auch funktioniert. Hatte in einem rostopic names chatter die ganze zeit hallo world ausgegeben. Allerdings bin ich durch das Tutorial nicht so richtig schlau geworden wie nun alles funktioniert. Was ich nun genau möchte, ist dass ich das Programm, dass im Anhang ist, nicht mehr über den Serial Monitor bediene sondern über ROS. Also im Grunde nur die Ein- und Ausgabe verlagern. Könnt ihr mir helfen?
Lieben Dank im Voraus
sonyfuchs

_131111_V3.ino (23.3 KB)

Hi, ROS ist schon sehr speziell, vielleicht erhälst du qualitativ bessere Antworten wenn du in einem ROS Forum nachfragst, da die meisten hier sich nur mit Mikrocontrollern auskennen, deine Frage sich aber Hauptsächlich auf ROS Funktionen bezieht.

Meine Verständnisschwierigkeiten mit ROS hängen mit meinen unzureichenden Englischkenntnissen :blush: zusammen, und der Tatsache das es im Grunde keine deutschen Dokumentationen zu ROS gibt. Kennt denn jemand n deutschsprachiges ROS- Forum? Ich werd mal morgen trotzdem Versuchen ein mein Problem ein bischen konkreter zu schildern, in dem ich meine bischerigen Lösungsversuche aufzeige. Vielleicht kann ja jemand dadurch eine Lösung erahnen. edit: Eine Verständnisschwierigkeit liegt schon im hallo world beispiel http://wiki.ros.org/rosserial_arduino/Tutorials/Hello%20World Ich verstehe die zeilen 11 und 26 nicht...

Hi, in der Zeile 11 wird nur ein Objekt vom Type String angelegt, eigentlich das gleiche wie in Zeile 9 und 12. Zeile 26 ruft eine Funktion auf, die etwas mit dem Objekt macht.

Vielleicht solltest du dir die Grundlagen nochmal anschauen, diese lassen sich auch in deutsch finden: Such am besten nach ROS in Verbindung mit Hochschule bzw Unis, irgendwie müssen die Studenten das ja auch lernen ;-)

http://users.informatik.haw-hamburg.de/projects/robotvision/Einsatz%20des%20ROS-Frameworks%20zur%20Umgebungskartierung%20und%20Navigation%20des%20SCITOS%20G5-Service-Roboters%20-%20Felix%20Kolbe%20PJ2%20Projektbericht.pdf http://www.betriebssysteme.org/Aktivitaeten/Treffen/2012-Koblenz/Programm/docs/slides_kathe.pdf http://www.is.uni-due.de/fileadmin/lehre/11w_projekt/Folien.pdf http://enricojoerns.de/docs/ros_ausarbeitung_final_twosided.pdf

Vielen Dank, ich geh die Links heut mal durch. Gibts irgendwo ne Befehlsliste von rosserial? Ich würd gern n kleines Testprogramm schreiben. Darin möchte ich über ROS eine Zahl eingeben und die an das Arduino senden. Das Arduino soll dann im chatter einfach Antworten: ich habe die Zahl "Zahl" empfangen. Damit wär mir schon sehr geholfen. edit: geh ich recht in der Annahme, dass ich nicht gleichzeitig den Serial Monitor und die Ausgabe in ROS nutzen kann?

So, hab n bischen weiter gearbeitet und jetzt sind meine Probleme übersichtlicher geworden. der momentane code:

#include <ros.h>
#include <std_msgs/Int8.h>

ros::NodeHandle nh;
int a;
int b;
std_msgs::Int8 str_c;

void messageCa( const std_msgs::Int8& uebergabewerta)
{
  a= uebergabewerta.data;
  digitalWrite(13, HIGH-digitalRead(13));   // blink the led
}
void messageCb( const std_msgs::Int8& uebergabewertb)
{
  b= uebergabewertb.data;
  digitalWrite(13, HIGH-digitalRead(13));   // blink the led
}

ros::Subscriber<std_msgs::Int8> suba("a", &messageCa );
ros::Subscriber<std_msgs::Int8> subb("b", &messageCb );
ros::Publisher chatter("c", &str_c);

void setup()
{
  pinMode(13, OUTPUT);
  nh.initNode();
  nh.subscribe(suba);
  nh.subscribe(subb);
  nh.advertise(chatter);
}

void loop()
{
  if(a!=0 && b!= 0)
  {
    str_c.data=(a+b);
    chatter.publish(&str_c);
  }
  nh.spinOnce();
  delay(1000);
}

//start mit 
//rostopic pub -1 a std_msgs/Int8 2
//rostopic pub -1 b std_msgs/Int8 3

also ich übergebe in ros einen Integer in dem 2 steht im topic a und einen Integer in dem 3 steht in topic b. lass das addieren und übergebe an topic c. in ROS lese ich die ganze zeit die 3 topics mit. Im Anhang hab ich n Screenshot von der Ausgabe. Ich möchte natürlich nicht dass c die ganze Zeit sendet, sondern nur, wenn a oder b sich ändern. Wie stell ich das an?
Und die zweite Frage: weiß jemand wie ich Arrays mit ROS versende, bzw mit Arduino empfangen? Ich werd aus dieser std_msgs nicht schlau.