OK. - Thanks, that were important hints. I’m going to the world championships in bowling for 2 weeks now to Paris (my grandson). After that we will devote to the problem. First of all thank you.
Wie ich sehe, sind alle Dokumente und Beiträge noch vorhanden. Prima. Nachdem ich mich nun Monate auf Weltmeisterschaften, Europameisterschaften und Deutschen Meisterschaften herumgetrieben habe, hab ich nun wieder mehr Zeit für mein Problem. Auf Ihren Rat hin, habe ich mir einen RPLidar A1 zugelegt. Der müßte für erste Versuche wohl reichen. Angeschossen an einen UNO mit LCD bringt er mir eine Menge Daten auf die Anzeige. Zuviel und zu schnell…siehe Code
// This sketch code is based on the RPLIDAR driver library provided by RoboPeak
#include <RPLidar.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
// You need to create an driver instance
RPLidar lidar;
LiquidCrystal_I2C lcd(0x27, 20, 4);
#define RPLIDAR_MOTOR 3 // The PWM pin for control the speed of RPLIDAR's motor.
// This pin should connected with the RPLIDAR's MOTOCTRL signal
void setup() {
// bind the RPLIDAR driver to the arduino hardware serial
lidar.begin(Serial);
lcd.init();
lcd.backlight();
lcd.begin(20, 4);
// set pin modes
pinMode(RPLIDAR_MOTOR, OUTPUT);
}
void loop() {
if (IS_OK(lidar.waitPoint())) {
float distance = lidar.getCurrentPoint().distance; //distance value in mm unit
float angle = lidar.getCurrentPoint().angle; //anglue value in degree
bool startBit = lidar.getCurrentPoint().startBit; //whether this point is belong to a new scan
byte quality = lidar.getCurrentPoint().quality; //quality of the current measurement
//perform data processing here...
lcd.setCursor(3, 0);
lcd.print(distance);
lcd.setCursor(3, 1);
lcd.print(angle);
} else {
analogWrite(RPLIDAR_MOTOR, 0); //stop the rplidar motor
// try to detect RPLIDAR...
rplidar_response_device_info_t info;
if (IS_OK(lidar.getDeviceInfo(info, 100))) {
// detected...
lidar.startScan();
// start motor rotating at max allowed speed
analogWrite(RPLIDAR_MOTOR, 255);
delay(1000);
}
}
}
Here’s what I get from the automated translation:
As you may have noticed, the robopeak repo for Arduino has not been updated since its initial commit (~5 years). The main reason is that while it is an easy way to check if the device is working it is far too slow to be capable of properly processing the amount of data coming out of a RPLidar. Most Arduino boards use a ATmega328 which has only 2 KB SRAM and typically runs on an clock of 16-20 MHz.
Considering this and the type of processing you’ll need to do for your project I highly recommend you abandon the Arduino platform now and focus on either using a PC (laptop/netbook) or a SBC (ex: RPi, Banana Pi, etc.). This also allows you to leverage up-to-date existing libraries/SDK (official and user made) more easily.
That being said if you wish to stick to Arduino-compatible boards you may be able to get this to run on a more powerful device such as the Teensy 3.6 [RB-Pjr-09]
Sincerely,
P.-S.: I’ve added a code block (C++ style) to your post for clarity. You can do so by adding ``` before and after a code block. You can also add a language at the start of the block, in this case cpp to indicate C++, which is what Arduino uses in its sketches.
Danke für die Antwort. Wir waren uns ja schon mal einig, dass es mit einem Arduino nicht so optimal funktioniert. Das ist aber auch nur ein Anfang um die Problematik einfach mal auszuprobieren. Ich habe den LIDAR schon am PC getestet - funktioniert ja auch einwandfrei. Das Problem besteht einfach darin, dass ich noch nichts gefunden habe um den Erfassungsbereich (winkelbereich) und die max. Länge des Messbereiches zu programmieren - so wie in der Zeichnung vom 09.03.19 mal dargestellt - alle Versuche sind bisher gescheitert und in den Foren ist auch nichts zu finden.
Na o.k., muß ich mal sehen wie ich hiermit weiter komme. Trotzdem erst mal vielen Dank.
So etwas würde mir schon für den Anfang reichen…
Well, every frame of data sent from the RPLidar have two major pieces of information: the angle and the distance measured. You would need to read those frames and only use data from the angle range that you need. Since the maximum distance is probably less than 12 m in some of that range you would need to compare the read values to the known range to determine if an object is between the barrier and the sensor or not (maximum range means there is no object). I figure you could store those maximum ranges into CONST array in EEPROM or FLASH, too (and therefore save the RAM it would take).
As for reading ranges, have you tried this example from Slamtec (previously Robopeak)? It should not be too difficult to change the code to go from color output to serial (or something else, such as LCD).
You may want to contact the person who made that video directly and ask if they would share their source code. From what I understand they make many tutorial videos so maybe they can offer some assistance.
I hope this helps!
Sincerely,
Hallo, Ihre Antwort hat genau den Kern getroffen. Das was Sie geschrieben haben möchten wir erreichen. Ich habe auch schon den Verfasser des Videos angeschrieben aber leider noch keine Rückantwort erhalten. Ich habe festgestellt, das am Anfang eines Messvorganges die Werte die angezeigt werden stimmen, dann aber vollkommen abweichen und nicht mehr real sind. Hab mir auch schon gedacht, dass der Speicher nicht mehr ausreicht und irgendwie überläuft???.
Mein Problem ist, dass ich mit dieser Aufgabenstellung total überfordert bin ( ich habe bis dato nur mit digitalen Signalen gearbeitet und mit Lichtschranken für die Geschwindigkeitsmessung des Balles) . Das hat gut funktioniert. Ich bin jetzt 70 Jahre, ich glaube die Problematik EPROM, FLASH Speicher und Array hab ich noch nicht drauf. Ich kann nur hoffen, dass der Verfasser des Videos sich meldet und ich mich dann an Hand des Beispieles in die Problematik reinarbeite.
Meinen Sie das Beispiel " distance_to_LED_ring" von Slamtec ?
Also ich habe mir den Code “distance_to_LED_ring” angeschaut.
Soweit ich den verstanden habe, macht der genau das, was wir brauchen. War ein super Hinweis. Allerdings habe ich ihn noch nicht ganz verstanden, muss mich mal intensiv damit beschäftigen - das Video jedenfalls hat gezeigt das es genauso funktionieren kann. Sollte ich Fragen haben zum Code - können Sie mir da helfen `?
Hey,
I understand what you mean. It is not a trivial project by any means.
I really think your best bet here is to move away from Arduino and all of its low-level complexity such as managing FLASH, EEPROM, SRAM and running out of those things and instead focus on solving your problem (speed of the ball).
To do this, use a laptop/notebook (or an SBC, as mentioned previously). I think you’ll have a much easier time working on this at a higher level (maybe in .NET or Python, etc.) then trying to wrangle an under-powered MCU in C++ to perform your task (using no longer supported libraries).
Be careful though. Showing the closest object’s angle (for collision detection for example) is not the same as determining an object’s speed (more calculations needed). I have a strong suspicion the Arduino they use in the video is already close to maximum capacity just processing the raw data, let alone perform more complex math on it and tracking an object’s speed (involved trig math, of course!).
Therefore, as mentioned previously in this post and before, I strongly recommend you move to a more powerful platform. Since you do not even have a working prototype yet I’d recommend focusing on this. It should both reduce frustration with the project not working and also give you access to much more powerful tools (and libraries such as the ROS one and the C++ SDK).
Unfortunately I will not be able too assist further since this is an integration issue that can get quite involved. That being said, I’m sure you can find more assistance on this forum and you mostly have all the right parts available to you. It is mostly a learning process at this point! Just don’t give up!
I wish you much success with your project!
Sincerely,
O.K. - Trotzdem vielen Dank - der Tip mit demCode war sehr gut.
LG
XXAL