Concept para joystick wireless rudimentar para robots com ROS e esp8266 e Arduino.
O objectivo é publicar mensagens do tipo geometry_msgs/Twist no topico cmd_vel.
Neste projecto são usados os seguintes componentes:
- Wemos D1 Mini (ESP8266)
- Arduino Mini Pro (3.3V)
- Joystick de 2 Eixos
- USB to serial (FTDI)
Wemos D1 Mini
Tem como função publicar a mensagem cmd_vel com os dados que recolhe do Joystick por i2c do Arduino.
A comunicação por i2c entre o Arduino e o ESP com biblioteca Wire tem uma particularidade que demorou algum tempo a descobrir.
No ESP8266 quando o valor do primeiro byte excede 127 todos os outros bytes tem valores errados.
Como os dados do wifi e o ip do ros master estão hardcoded, para facilitar a sua alteração e eventuais reporgramações, o upload do programa pode ser realizado por wireless com o Arduino OTA.
Arduino
O arduino é usado para ler os dois eixos do Joystick pois o ESP só tem um porta analógica.
Sempre que lhe é pedido devolve um valor entre 0 e 1024 para cada eixo , com um valor de reposo (central) proximo dos 512.
Ligações
Toda a alimentação (microcontroladores e joystick) é efectuada a 3.3V.
Nota: este joystick necessita de alimentação por sinal, alguns joysticks apenas têm uma alimentação.
Arduino > Joystick
- D12 > S-K (sinal do botão)
- A0 > S-X (sinal do eixo dos x)
- A1 > S-Y (sinal do eixo dos y)
Arduino > ESP8266
- A4 > D2 (SDA)
- A5 > D1 (SCL)
Arduino > FTDI
- TX > RX (branco)
- RX > TX (verde)
- GND > GND
Software para ROS Joystick Wireless
O software usado para implementar o pré-prótotipo está disponivel em:
https://github.com/inaciose/roswifijoy
Tipos de mensagens ROS
geometry_msgs/Twist
https://docs.ros.org/api/geometry_msgs/html/msg/Twist.html
linear: x: 0.0 y: 0.0 z: 0.0 angular: x: 0.0 y: 0.0 z: 0.0
sensor_msgs/Joy
http://docs.ros.org/melodic/api/sensor_msgs/html/msg/Joy.html
Problemas
Após algum tempo a ligação com o node remoto (rosserial) falha com as seguintes mensagens:
[INFO] [1570283587.480279]: Packet Failed : Failed to read msg data [INFO] [1570283587.482739]: expected msg length is 48 [WARN] [1570283587.484643]: Last read step: data [WARN] [1570283587.486616]: Run loop error: Serial Port read failure: RosSerialServer.read() socket connection broken [INFO] [1570283587.488385]: Shutting down [INFO] [1570283587.490169]: All done Traceback (most recent call last): File "/opt/ros/melodic/lib/rosserial_python/serial_node.py", line 73, in <module> server.listen() File "/opt/ros/melodic/lib/python2.7/dist-packages/rosserial_python/SerialClient.py", line 253, in listen self.startSerialClient() File "/opt/ros/melodic/lib/python2.7/dist-packages/rosserial_python/SerialClient.py", line 259, in startSerialClient client.run() File "/opt/ros/melodic/lib/python2.7/dist-packages/rosserial_python/SerialClient.py", line 556, in run self.port.flushOutput() AttributeError: RosSerialServer instance has no attribute 'flushOutput'
end