Can transmission errors

Hallo,
ich habe heute versucht das normale edu_drive_ros2 package zu starten mit dem shield und 4 Motoren, habe aber lauter Can transmission errors geschmissen bekommen.

root@N10:~/ros2_ws# ros2 launch edu_drive_ros2 edu_drive.launch.py
[INFO] [launch]: All log files can be found below /root/.ros/log/2024-03-23-17-05-07-728961-N10-1128
[INFO] [launch]: Default logging verbosity is set to INFO
[INFO] [edu_drive_ros2_node-1]: process started with pid [1131]
[edu_drive_ros2_node-1] WARNING: Cannot open CAN device interface: CAN2
[edu_drive_ros2_node-1] # Listener start
[edu_drive_ros2_node-1] [INFO] [1711209907.874712362] [eduard.edu_drive_ros2_node]: CAN Interface: CAN2

[edu_drive_ros2_node-1] ---------------------------
[edu_drive_ros2_node-1] 
[edu_drive_ros2_node-1] frequencyScale = 32
[edu_drive_ros2_node-1] inputWeight    = 0.2
[edu_drive_ros2_node-1] maxPulseWidth  = 100
[edu_drive_ros2_node-1] timeout        = 300
[edu_drive_ros2_node-1] kp             = 0.4
[edu_drive_ros2_node-1] ki             = 4
[edu_drive_ros2_node-1] kd             = 0
[edu_drive_ros2_node-1] antiWindup     = 1
[edu_drive_ros2_node-1] responseMode   = 0
[edu_drive_ros2_node-1] 
[edu_drive_ros2_node-1] --- Controller #0 parameters ---
[edu_drive_ros2_node-1]     gearRatio      = 70
[edu_drive_ros2_node-1]     encoderRatio   = 64
[edu_drive_ros2_node-1]     rpmMax         = 140
[edu_drive_ros2_node-1]     invertEnc      = 1
[edu_drive_ros2_node-1]    --- Drive0
[edu_drive_ros2_node-1]        channel: 0
[edu_drive_ros2_node-1]        kinematics: 20 0 -6.1 
[edu_drive_ros2_node-1]    --- Drive1
[edu_drive_ros2_node-1]        channel: 1
[edu_drive_ros2_node-1]        kinematics: 0 0 0 
[edu_drive_ros2_node-1] ---------------------------
[edu_drive_ros2_node-1] 
[edu_drive_ros2_node-1] Can transmission error for command 2, returned -1 submitted bytes instead of 16
[edu_drive_ros2_node-1] #MotorController Failed to disable device 0
[edu_drive_ros2_node-1] Can transmission error for command 18, returned -1 submitted bytes instead of 16
[edu_drive_ros2_node-1] #MotorController Setting frequency scaling parameter failed for device 0
[edu_drive_ros2_node-1] Can transmission error for command 36, returned -1 submitted bytes instead of 16
[edu_drive_ros2_node-1] #MotorController Setting differential factor of PID controller failed for device 0
[edu_drive_ros2_node-1] Can transmission error for command 4, returned -1 submitted bytes instead of 16
[edu_drive_ros2_node-1] #MotorController Setting maximum pulse width failed for device 0
[edu_drive_ros2_node-1] Can transmission error for command 3, returned -1 submitted bytes instead of 16
[edu_drive_ros2_node-1] #MotorController Setting timeout failed for device 0
[edu_drive_ros2_node-1] Can transmission error for command 48, returned -1 submitted bytes instead of 16
[edu_drive_ros2_node-1] Can transmission error for command 49, returned -1 submitted bytes instead of 16
[edu_drive_ros2_node-1] #MotorController Setting gear ratio failed for device 0
[edu_drive_ros2_node-1] Can transmission error for command 50, returned -1 submitted bytes instead of 16
[edu_drive_ros2_node-1] Can transmission error for command 51, returned -1 submitted bytes instead of 16
[edu_drive_ros2_node-1] #MotorController Setting encoder parameters failed for device 0
[edu_drive_ros2_node-1] Can transmission error for command 32, returned -1 submitted bytes instead of 16
[edu_drive_ros2_node-1] #MotorController Setting proportional factor of PID controller failed for device 0
[edu_drive_ros2_node-1] Can transmission error for command 33, returned -1 submitted bytes instead of 16
[edu_drive_ros2_node-1] #MotorController Setting integration factor of PID controller failed for device 0
[edu_drive_ros2_node-1] Can transmission error for command 34, returned -1 submitted bytes instead of 16
[edu_drive_ros2_node-1] #MotorController Setting differential factor of PID controller failed for device 0
[edu_drive_ros2_node-1] Can transmission error for command 35, returned -1 submitted bytes instead of 16
[edu_drive_ros2_node-1] #MotorController Setting differential factor of PID controller failed for device 0
[edu_drive_ros2_node-1] Can transmission error for command 5, returned -1 submitted bytes instead of 16
[edu_drive_ros2_node-1] #MotorController Setting response mode failed for device 0
[edu_drive_ros2_node-1] Can transmission error for command 7, returned -1 submitted bytes instead of 16
[edu_drive_ros2_node-1] #MotorController Setting encoder polarity failed for device 0
[edu_drive_ros2_node-1] #MotorController ERROR initializing motor controller with ID 0
[edu_drive_ros2_node-1] --------------------------------------------------------------------------
[edu_drive_ros2_node-1] 
[edu_drive_ros2_node-1] frequencyScale = 32
[edu_drive_ros2_node-1] inputWeight    = 0.2
[edu_drive_ros2_node-1] maxPulseWidth  = 100
[edu_drive_ros2_node-1] timeout        = 300
[edu_drive_ros2_node-1] kp             = 0.4
[edu_drive_ros2_node-1] ki             = 4
[edu_drive_ros2_node-1] kd             = 0
[edu_drive_ros2_node-1] antiWindup     = 1
[edu_drive_ros2_node-1] responseMode   = 0
[edu_drive_ros2_node-1] 
[edu_drive_ros2_node-1] --- Controller #1 parameters ---
[edu_drive_ros2_node-1]     gearRatio      = 70
[edu_drive_ros2_node-1]     encoderRatio   = 64
[edu_drive_ros2_node-1]     rpmMax         = 140
[edu_drive_ros2_node-1]     invertEnc      = 0
[edu_drive_ros2_node-1]    --- Drive0
[edu_drive_ros2_node-1]        channel: 0
[edu_drive_ros2_node-1]        kinematics: -20 0 -6.1 
[edu_drive_ros2_node-1]    --- Drive1
[edu_drive_ros2_node-1]        channel: 1
[edu_drive_ros2_node-1]        kinematics: 0 0 0 
[edu_drive_ros2_node-1] ---------------------------
[edu_drive_ros2_node-1] 
[edu_drive_ros2_node-1] Can transmission error for command 2, returned -1 submitted bytes instead of 16
[edu_drive_ros2_node-1] #MotorController Failed to disable device 1
[edu_drive_ros2_node-1] Can transmission error for command 18, returned -1 submitted bytes instead of 16
[edu_drive_ros2_node-1] #MotorController Setting frequency scaling parameter failed for device 1
[edu_drive_ros2_node-1] Can transmission error for command 36, returned -1 submitted bytes instead of 16
[edu_drive_ros2_node-1] #MotorController Setting differential factor of PID controller failed for device 1
[edu_drive_ros2_node-1] Can transmission error for command 4, returned -1 submitted bytes instead of 16
[edu_drive_ros2_node-1] #MotorController Setting maximum pulse width failed for device 1
[edu_drive_ros2_node-1] Can transmission error for command 3, returned -1 submitted bytes instead of 16
[edu_drive_ros2_node-1] #MotorController Setting timeout failed for device 1
[edu_drive_ros2_node-1] Can transmission error for command 48, returned -1 submitted bytes instead of 16
[edu_drive_ros2_node-1] Can transmission error for command 49, returned -1 submitted bytes instead of 16
[edu_drive_ros2_node-1] #MotorController Setting gear ratio failed for device 1
[edu_drive_ros2_node-1] Can transmission error for command 50, returned -1 submitted bytes instead of 16
[edu_drive_ros2_node-1] Can transmission error for command 51, returned -1 submitted bytes instead of 16
[edu_drive_ros2_node-1] #MotorController Setting encoder parameters failed for device 1
[edu_drive_ros2_node-1] Can transmission error for command 32, returned -1 submitted bytes instead of 16
[edu_drive_ros2_node-1] #MotorController Setting proportional factor of PID controller failed for device 1
[edu_drive_ros2_node-1] Can transmission error for command 33, returned -1 submitted bytes instead of 16
[edu_drive_ros2_node-1] #MotorController Setting integration factor of PID controller failed for device 1
[edu_drive_ros2_node-1] Can transmission error for command 34, returned -1 submitted bytes instead of 16
[edu_drive_ros2_node-1] #MotorController Setting differential factor of PID controller failed for device 1
[edu_drive_ros2_node-1] Can transmission error for command 35, returned -1 submitted bytes instead of 16
[edu_drive_ros2_node-1] #MotorController Setting differential factor of PID controller failed for device 1
[edu_drive_ros2_node-1] Can transmission error for command 5, returned -1 submitted bytes instead of 16
[edu_drive_ros2_node-1] #MotorController Setting response mode failed for device 1
[edu_drive_ros2_node-1] Can transmission error for command 7, returned -1 submitted bytes instead of 16
[edu_drive_ros2_node-1] #MotorController Setting encoder polarity failed for device 1
[edu_drive_ros2_node-1] #MotorController ERROR initializing motor controller with ID 1
[edu_drive_ros2_node-1] [INFO] [1711209918.058462541] [eduard.edu_drive_ros2_node]: Instanciated robot with vMax: 0.733038 m/s and omegaMax: 2.4034 rad/s


Ich weiß nicht ob ich was falsch gemacht habe und was die nächsten Steps wären. Ich vermute enablen mit dem Wert true mit dem Service eduard/enable um dann ein cmd_vel signal auf eduard/vel/teleop zu publishen oder?

Hallo Jonas,
die Fehlermeldungen besagen, dass die Kommunikation mit den Motorcontrollern mit der ID0 und der ID1 nicht klappt. Wie sieht denn Eure Hardware genau aus? Prüft bitte mal, ob alle IDs richtig eingestellt sind. Auf jedem Motorshield sind zwei Dip-Schalter. Bei ID0 sind beide auf Stellung “off” und bei ID1 ist nur ein Schalter auf “on”. Prüft bitte auch, ob die elektrische Verbindung passt. Manchmal übersieht man beim Aufstecken, dass ein Beinchen nicht in die Buchse rutscht. Und ich sehe auch, dass das CAN device CAN2 nicht geöffnet werden kann. Ihr müsstet nach dem Hochfahren alle CAN-Schnittstellen mit dem Befehl “ip a” sehen können. Es sollten CAN0, CAN1 und CAN2 vorhanden sein und auch mit dem Status “up” markiert sein. Ich habe so einen Fehler schon mal bei einem defekten Board gesehen. Prüft diese Punkte bitte erst einmal. Ansonsten sehe ich gerne mal direkt darauf.
Viele Grüße
Stefan May

Hallo Professor May,
Wir haben jetzt mal nur zwei Motorshields auf unseren Pi 5 aufgesteckt und wie beschrieben bei dem einen Beide auf “off” und beim anderen nur einen auf “on”. Die Steckverbindungen sind auch alle drin. Ich vermute jetzt mal, dass can 2 nicht gefunden wird, weil es ja nur 2 Shields aufgesteckt sind, aber die Anderen funktionieren dennoch nicht und die selbe Fehlermeldung erscheint. Ich sehe aber auch kein Can0 oder Can1 wenn ich ich ip a aufrufe:

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 2c:cf:67:07:c9:a5 brd ff:ff:ff:ff:ff:ff
    inet 192.168.1.134/24 metric 100 brd 192.168.1.255 scope global dynamic eth0
       valid_lft 24269sec preferred_lft 24269sec
    inet6 fe80::2ecf:67ff:fe07:c9a5/64 scope link 
       valid_lft forever preferred_lft forever
3: wlan0: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
    link/ether 2c:cf:67:07:c9:a6 brd ff:ff:ff:ff:ff:ff
root@N10:/etc/systemd/system#

Einrichtungstechnisch bin ich einfach der Anleitung auf Github gefolgt. Habe ich was vergessen oder so? Die Service Dateien existieren zumindest. In der config von edu_drive_ros2 ist es doch ehh nur für zwei Shields konfiguriert.

Hallo Jonas,
der Fehler muss tiefer liegen. Wenn es keine CAN-Schnittstellen gibt, stimmt evtl. etwas mit dem Laden des Kernelmoduls nicht. Kannst Du mal den Inhalt der Datei /boot/firmware/config.txt senden.
Dort sollte Folgendes stehen:

dtoverlay=spi1-2cs
dtoverlay=mcp251xfd,spi0-0,oscillator=40000000,interrupt=25
dtoverlay=mcp251xfd,spi0-1,oscillator=40000000,interrupt=13
dtoverlay=mcp251xfd,spi1-0,oscillator=40000000,interrupt=24

Viele Grüße
Stefan May

Hallo Jonas,
hast Du diesen Hinweis auch gelesen?

Note: For Ubuntu 23.10. the file /boot/firmware/network-config had to be renamed manually (/boot/firmware/network-config.bak) on a Raspberry Pi 5. As long as this file exists, /boot/firmware/config.txt is not read.

Viele Grüße
Stefan May

Hallo Professor May,
Ich glaube das wird es sein durch meine Darkmode browser extension konnte ich es fast gar nicht sehen😁 Momentan kann ich leider es nicht ausprobieren, da Ferien sind, aber das hört sich nach der Fehlerquelle an.

MfG Jonas Nicklas

Hallo Professor May,
die Fehldercodes sind weg, nun besteht aber das Problem, dass die Motoren sich nicht anfangen zu drehen. Ich habe nur zwei Shields draufgesteckt und davor auch es mit allen 3 ausprobiert, aber ohne Erfolg. Wenn ich den Service aufrufe zum Enablen, bekomme ich auch Feedback im Terminal, wo die Node gestartet wurde, aber wenn ich eine velocity msg publishe drehen sich keine Motoren ich habe auch mit rqt_graph schon überprüft, ob die Verbindung vorhanden ist. Das topic habe ich auch mitgelesen und wird richtig gepublisht, aber kein Erfolg kein Motor bewegt sich. Am Roboter ist kein Aufladekabel angeschlossen und der Notaus ist auch drausen gewesen. Im Terminal gab es auch kein Feedback von der Velocity msg ist das normal?

MfG Jonas Nicklas

Hallo Jonas,
wir haben Euer Problem ja heute während einer Videokonferenz schon gelöst. Um es für Andere zu dokumentieren, fasse ich die Lösung nochmal zusammen:

  1. Es muss zyklisch eine Twist-Nachricht gesendet werden.
  2. Erst dann muss der Enable-Service aufgerufen werden, damit die Motorshields nicht gleich wieder in einen Timeout laufen.
  3. Es müssen die Parameter der yaml-Datei, welche durch das launch file referenziert wird, angepasst werden. Dort müssen die Motor-, Getriebe- und Encoderparameter eingestellt werden. Wie das geht, ist auf der github-Seite des Pakets edu_drive_ros2 dokumentiert.

Ich wünsche Euch weiterhin viel Erfolg!

Viele Grüße
Stefan May