RoboterCC - Robotic Code Compiler
Forum Robot Kits NIBO burger Problem mit Beispiel TT12_Farbsensor

Welcome

Nachrichten

Sie sind nicht eingeloggt.

Werbung

Letzte Themen

  • Keine Beiträge vorhanden

Site-Statistic

  • 7430 private projects
  • 378 public projects
  • 16178470 lines compiled
  • 58188 builds
NIBO @ facebook YouTube Twitter
Willkommen, Gast
Benutzername: Passwort: Angemeldet bleiben:
  • Seite:
  • 1
  • 2

THEMA: Problem mit Beispiel TT12_Farbsensor

Problem mit Beispiel TT12_Farbsensor 8 Jahre 5 Monate her #3373

Hallo,
ich wollte gerade das Beispiel für die Farbsensoren testen. Leider bekomme ich bei der Kompilierung folgenden Fehler:
Arduino: 1.6.5 (Windows 8.1), Platine: "nicai-systems NIBO burger robot"

NIBOburger\niboburger\color.c.o: In function `color_convert_RGB2hsv':
C:\Program Files (x86)\Arduino\libraries\NIBOburger\src\niboburger/color.c:67: undefined reference to `max3'
C:\Program Files (x86)\Arduino\libraries\NIBOburger\src\niboburger/color.c:68: undefined reference to `min3'
collect2.exe: error: ld returned 1 exit status
Fehler beim Kompilieren.

Der Fehler muss wohl in der color.c liegen. Kann es sein, dass die Ziffer 3 bei max(...) und min(...) falsch ist? Leider konnte ich das nicht testen, da ich eine Änderung an der color.c nicht speichern kann/darf.

Gruß
Torsten
Der Administrator hat öffentliche Schreibrechte deaktiviert.

Problem mit Beispiel TT12_Farbsensor 8 Jahre 5 Monate her #3374

  • Georg
  • Georgs Avatar
  • OFFLINE
  • Gold Boarder
  • Beiträge: 290
Hallo Torsten,

füge in der Datei ..\Arduino\libraries\NIBOburger\src\niboburger\color.c
nach

#define MIN(a, b) ((a) > (b) ? (a) : (b))

folgende Zeilen ein:

#define max3(a,b,c) max(max(a,b),c)
#define max4(a,b,c,d) max(max(a,b),max(c,d))
#define min3(a,b,c) min(min(a,b),c)
#define min4(a,b,c,d) min(min(a,b),min(c,d))

Gruß, Georg
Der Administrator hat öffentliche Schreibrechte deaktiviert.

Problem mit Beispiel TT12_Farbsensor 8 Jahre 5 Monate her #3375

Hallo Georg,

leider habe ich in meiner Color.c den Eintrag
#define MIN(a, b) ((a) > (b) ? (a) : (b))
nicht stehen. Ich habe auch diesen dann mal eingepflegt. Leider ohne Erfolg. Meine Color.c sieht jetzt so aus:
 
#include <stdlib.h>

#include "niboburger/iodefs.h"
#include "niboburger/color.h"
#include "niboburger/utils.h"

#define SQARE16(x) (((int16_t)x)*x)
#define SQARE32(x) (((int32_t)x)*x)

#define MIN(a, b) ((a) > (b) ? (a) : (b))
#define max3(a,b,c) max(max(a,b),c)
#define max4(a,b,c,d) max(max(a,b),max(c,d))
#define min3(a,b,c) min(min(a,b),c)
#define min4(a,b,c,d) min(min(a,b),min(c,d))

uint16_t color_diff_rgb(uint32_t colorA, uint32_t colorB) {
  uint16_t r = absdiff( ((uint8_t)((colorB >> 16) & 0xff)) , ((uint8_t)((colorA >> 16) & 0xff)) );
  uint16_t g = absdiff( ((uint8_t)((colorB >>  8) & 0xff)) , ((uint8_t)((colorA >>  8) & 0xff)) );
  uint16_t b = absdiff( ((uint8_t)((colorB >>  0) & 0xff)) , ((uint8_t)((colorA >>  0) & 0xff)) );
  uint32_t res = 0;
  res += r*r;
  res += g*g;
  res += b*b;
  if (res>INT16_MAX) {
    res = INT16_MAX;
  }
  return res;
}
 
 
uint16_t color_diff_hsv(uint32_t colorA, uint32_t colorB) {
  return color_diff_hsv_bal(colorA, colorB, 0);
}
 
uint16_t color_diff_hsv_bal(uint32_t colorA, uint32_t colorB, uint8_t vTol) {
  uint8_t hA = (int8_t)((colorA >> 16) & 0xff); // [0..255]
  uint8_t sA = (int8_t)((colorA >>  8) & 0xff); // [0..255]
  uint8_t vA = (int8_t)((colorA >>  0) & 0xff); // [0..255]
  uint8_t hB = (int8_t)((colorB >> 16) & 0xff); // [0..255]
  uint8_t sB = (int8_t)((colorB >>  8) & 0xff); // [0..255]
  uint8_t vB = (int8_t)((colorB >>  0) & 0xff); // [0..255]
 
  uint8_t v0 = ((uint16_t)vA+vB)/2; // [0..255]
  uint8_t s0 = ((uint16_t)sA+sB)/2; // [0..255]
 
  uint8_t dh = abs((int8_t)(hA-hB)); // [0..128]
  uint8_t ds = absdiff(sA, sB); // [0..255]
  uint8_t dv = absdiff(vA, vB); // [0..255]
 
  if (dv>vTol) {
    dv -= vTol;
  } else {
    dv = 0;
  }
 
  uint32_t diff = SQARE16(dh);
  diff *= s0;
  diff /= 256;
  diff += SQARE16(ds);
  diff *= v0;
  diff /= 256;
  diff += SQARE16(dv);
  if (diff>INT16_MAX) {
    diff = INT16_MAX;
  }
  return diff;
}
 
uint32_t color_convert_RGB2hsv(uint8_t r, uint8_t g, uint8_t b) {
  // r, g, b [0..255]
 
  uint8_t  v = max3(r,g,b);     // [0..255] // = MAX(R,G,B)
  uint16_t d = v - min3(r,g,b); // [0..255] // = MAX(R,G,B) - MIN(R,G,B)
 
  uint8_t  s = v?((255U*d)/v):0; // [0..255] // = 255 * (MAX(R,G,B) - MIN(R,G,B)) / MAX(R,G,B)
 
  int16_t  h = 0;
 
  if (d) {
    if (v==r) {
      h = (85 * ((int16_t)g-(int16_t)b)) / (d+d) + 0;
      if (h<0) {
        h += 256;
      }
    } else if (v==g) {
      h = (85 * ((int16_t)b-(int16_t)r)) / (d+d) + 85;
    } else if (v==b) {
      h = (85 * ((int16_t)r-(int16_t)g)) / (d+d) + 171;
    }
  }
 
  // h [0..255]
 
  return ((uint32_t)(uint8_t)h) << 16 |
         ((uint32_t)s) << 8  |
         ((uint32_t)v);
}
 
uint32_t color_convert_RGB2rgb(uint8_t r, uint8_t g, uint8_t b) {
  return ((uint32_t)r) << 16 |
         ((uint32_t)g) << 8  |
         ((uint32_t)b);
}
 

Gruß
Torsten
Der Administrator hat öffentliche Schreibrechte deaktiviert.

Problem mit Beispiel TT12_Farbsensor 8 Jahre 5 Monate her #3376

  • Georg
  • Georgs Avatar
  • OFFLINE
  • Gold Boarder
  • Beiträge: 290
Hallo Torsten,

leider habe ich etwas übersehen, deshalb ein neuer Versuch.
Ersetze in der Datei color.c (gleicher Pfad wie oben) den Code
uint32_t color_convert_RGB2hsv(uint8_t r, uint8_t g, uint8_t b) {
  // r, g, b [0..255]
 
  uint8_t  v = max3(r,g,b);     // [0..255] // = MAX(R,G,B)
  uint16_t d = v - min3(r,g,b); // [0..255] // = MAX(R,G,B) - MIN(R,G,B)

durch
uint32_t color_convert_RGB2hsv(uint8_t r, uint8_t g, uint8_t b) {
  // r, g, b [0..255]
 
  uint8_t  v = MAX(MAX(r,g),b);     // [0..255] // = MAX(R,G,B)
  uint16_t d = v - MIN(MIN(r,g),b); // [0..255] // = MAX(R,G,B) - MIN(R,G,B)


Grüße, Georg
Der Administrator hat öffentliche Schreibrechte deaktiviert.

Problem mit Beispiel TT12_Farbsensor 8 Jahre 5 Monate her #3377

Hallo Georg,

jetzt fehlt noch die Deklaration von MAX. Hier die Fehlermeldung:
Arduino: 1.6.5 (Windows 8.1), Platine: "nicai-systems NIBO burger robot"
 
NIBOburger\niboburger\color.c.o: In function `color_convert_RGB2hsv':
C:\Program Files (x86)\Arduino\libraries\NIBOburger\src\niboburger/color.c:73: undefined reference to `MAX'
C:\Program Files (x86)\Arduino\libraries\NIBOburger\src\niboburger/color.c:73: undefined reference to `MAX'
collect2.exe: error: ld returned 1 exit status
Fehler beim Kompilieren.

Gruß
Torsten
Der Administrator hat öffentliche Schreibrechte deaktiviert.

Problem mit Beispiel TT12_Farbsensor 8 Jahre 5 Monate her #3381

  • Georg
  • Georgs Avatar
  • OFFLINE
  • Gold Boarder
  • Beiträge: 290
Hallo Torsten,

ersetze die color.c durch den nachfolgenden Code.

Grüße, Georg
#include <stdlib.h>

 
#include "niboburger/iodefs.h"
#include "niboburger/color.h"
#include "niboburger/utils.h"

#define SQARE16(x) (((int16_t)x)*x)
#define SQARE32(x) (((int32_t)x)*x)
#define max(a, b) ((a) > (b) ? (a) : (b))
#define min(a, b) ((a) < (b) ? (a) : (b))
#define max3(a,b,c) max(max(a,b),c)     
#define max4(a,b,c,d) max(max(a,b),max(c,d))
#define min3(a,b,c) min(min(a,b),c) 
#define min4(a,b,c,d) min(min(a,b),min(c,d))

 
uint16_t color_diff_rgb(uint32_t colorA, uint32_t colorB) {
  uint16_t r = absdiff( ((uint8_t)((colorB >> 16) & 0xff)) , ((uint8_t)((colorA >> 16) & 0xff)) );
  uint16_t g = absdiff( ((uint8_t)((colorB >>  8) & 0xff)) , ((uint8_t)((colorA >>  8) & 0xff)) );
  uint16_t b = absdiff( ((uint8_t)((colorB >>  0) & 0xff)) , ((uint8_t)((colorA >>  0) & 0xff)) );
  uint32_t res = 0;
  res += r*r;
  res += g*g;
  res += b*b;
  if (res>INT16_MAX) {
    res = INT16_MAX;
  }
  return res;
}
 
 
uint16_t color_diff_hsv(uint32_t colorA, uint32_t colorB) {
  return color_diff_hsv_bal(colorA, colorB, 0);
}
 
uint16_t color_diff_hsv_bal(uint32_t colorA, uint32_t colorB, uint8_t vTol) {
  uint8_t hA = (int8_t)((colorA >> 16) & 0xff); // [0..255]
  uint8_t sA = (int8_t)((colorA >>  8) & 0xff); // [0..255]
  uint8_t vA = (int8_t)((colorA >>  0) & 0xff); // [0..255]
  uint8_t hB = (int8_t)((colorB >> 16) & 0xff); // [0..255]
  uint8_t sB = (int8_t)((colorB >>  8) & 0xff); // [0..255]
  uint8_t vB = (int8_t)((colorB >>  0) & 0xff); // [0..255]
 
  uint8_t v0 = ((uint16_t)vA+vB)/2; // [0..255]
  uint8_t s0 = ((uint16_t)sA+sB)/2; // [0..255]
 
  uint8_t dh = abs((int8_t)(hA-hB)); // [0..128]
  uint8_t ds = absdiff(sA, sB); // [0..255]
  uint8_t dv = absdiff(vA, vB); // [0..255]
 
  if (dv>vTol) {
    dv -= vTol;
  } else {
    dv = 0;
  }
 
  uint32_t diff = SQARE16(dh);
  diff *= s0;
  diff /= 256;
  diff += SQARE16(ds);
  diff *= v0;
  diff /= 256;
  diff += SQARE16(dv);
  if (diff>INT16_MAX) {
    diff = INT16_MAX;
  }
  return diff;
}
 
uint32_t color_convert_RGB2hsv(uint8_t r, uint8_t g, uint8_t b) {
  // r, g, b [0..255]
 
  uint8_t  v = max(max(r,g),b);     // [0..255] // = MAX(R,G,B)
  uint16_t d = v - min(min(r,g),b); // [0..255] // = MAX(R,G,B) - MIN(R,G,B)
 
  uint8_t  s = v?((255U*d)/v):0; // [0..255] // = 255 * (MAX(R,G,B) - MIN(R,G,B)) / MAX(R,G,B)
 
  int16_t  h = 0;
 
  if (d) {
    if (v==r) {
      h = (85 * ((int16_t)g-(int16_t)b)) / (d+d) + 0;
      if (h<0) {
        h += 256;
      }
    } else if (v==g) {
      h = (85 * ((int16_t)b-(int16_t)r)) / (d+d) + 85;
    } else if (v==b) {
      h = (85 * ((int16_t)r-(int16_t)g)) / (d+d) + 171;
    }
  }
 
  // h [0..255]
 
  return ((uint32_t)(uint8_t)h) << 16 |
         ((uint32_t)s) << 8  |
         ((uint32_t)v);
}
 
uint32_t color_convert_RGB2rgb(uint8_t r, uint8_t g, uint8_t b) {
  return ((uint32_t)r) << 16 |
         ((uint32_t)g) << 8  |
         ((uint32_t)b);
}
Der Administrator hat öffentliche Schreibrechte deaktiviert.
  • Seite:
  • 1
  • 2
Ladezeit der Seite: 0.210 Sekunden

Werbung