gazebo calibration package

Este é o relato da experiência de utilização do pacote calibration_gazebo que está disponível no seguinte repositório:

https://github.com/oKermorgant/calibration_gazebo

Na primeira execução reparei que este pacote depende do pacote slide_publisher. Esta dependência pode ser satisfeita com o seguinte comando

sudo apt install ros-noetic-slider-publisher

Também está disponível no seguinte repositório

https://github.com/oKermorgant/slider_publisher

O erro que denuncia a dependência é o seguinte

Resource not found: slider_publisher

O comando que faz o spawn do quadro de xadrez para a calibração da camera é o seguinte:

roslaunch calibration_gazebo landmark.launch

Este comando pressupõe que o ambiente simulado já esteja em execução, pelo que no caso do projecto do automec será necessário executar por exemplo o seguinte comando:

roslaunch simulation_bringup traxxas_free_drive.launch

No entanto na experiência efectuada o quadro de xadrez não apareceu.

Segundo a descrição do pacote o programa tentará identificar o link da camera (o primeiro a ter a palavra camera) e a fazer o spawn do quadro de xadrez á sua frente, caso não encontre o quadro aparece numa posição fixa.

O pacote contem os launch files que permite lançar dois ambientes simulados para testar o seu funcionamento.

  • roslaunch calibration_gazebo perspective.launch
  • roslaunch calibration_gazebo fisheye.launch

A execução do primeiro, seguido do comando para lançar o quadro, permitiu verificar que o quadro aparece em frente da camera.

Numa tentativa de identificar o que estava a acontecer, foi efectuada uma correcção do launch file de modo a poder observar as mensagens geradas pelo node.

No caso do do ambiente exemplo pré configurado no pacote 0 resultado na consola foi  o seguinte:

process[calibration_gazebo/landmark_bridge-2]: started with pid [404599]
False
False
Found camera link at camera::camera_link
[INFO] [1632494079.717182, 0.000000]: Loading model XML from file /home/inaciose/catkin_ws/src/calibration_gazebo/sdf/landmark.sdf
[INFO] [1632494079.735229, 0.000000]: Waiting for service /gazebo/spawn_sdf_model
[INFO] [1632494079.743581, 16.158000]: Calling service /gazebo/spawn_sdf_model
[INFO] [1632494080.021423, 16.313000]: Spawn status: SpawnModel: Successfully spawned entity

Ficando o processo de calibração disponível conforme a imagem acima

No caso do ambiente simulado do projecto do automec o quadro de xadrez nunca aparece no ecrã e surgem as seguintes mensagens de erro.

process[calibration_gazebo/landmark_bridge-2]: started with pid [415518]
False
(...)
False
Could not find camera link, spawning landmark at (0,0,0.5)
[INFO] [1632494966.819862, 0.000000]: Loading model XML from file /home/inaciose/catkin_ws/src/calibration_gazebo/sdf/landmark.sdf
[INFO] [1632494966.824028, 24.350000]: Waiting for service /gazebo/spawn_sdf_model

Como após algumas pesquisas e verificações não consegui colocar o paccote a funcionar no ambiente de simulação usado no projecto do automec, passei para outra abordagem.

A nova abordagem foi usar apenas ficheiro sdf que define o quadro de xadrez, integrando-no pacote que define o ambiente de simulação.

 

Automec-ad user commands v02

Os comandos básicos para o real e simulação são idênticos pois baseiam-se em ficheiros launch com os mesmos nomes, sendo assim, o que muda é o nome do pacote em variações com estes nomes de launch files (o numero e as letras finais identificam a cnn a usar) :

  • traxxas_free_drive.launch
  • traxxas_drive_write.launch
  • traxxas_training1.launch
  • traxxas_drive1.launch
  • traxxas_drive_signal1.launch

A estes nomes acrescem em alguns casos um ou dois parametros:

  • folder:=setX
  • model:=modelX.h5

Abaixo seguem exemplos para cada um dos casos (real e simulação).

Mais abaixo ainda existe um resumo dos nodes e dos respectivos parâmetros, e algumas notas.

Físico (real)

condução livre com o carro para testar
roslaunch physical_bringup traxxas_free_drive.launch

sessão para guardar dados de condução para treinar
roslaunch physical_bringup traxxas_drive_write.launch folder:=setX

treinar com os dados de uma sessão guardada
roslaunch physical_bringup traxxas_training1.launch folder:=setX model:=modelX.h5

condução autónoma com um modelo previamente treinado
roslaunch physical_bringup traxxas_drive1.launch model:=modelX.h5

condução autónoma com um modelo previamente treinado e reação aos sinais TODO
roslaunch physical_bringup traxxas_drive_signal1.launch model:=modelX.h5

 

Simulação

condução livre com o carro para testar
roslaunch simulation_bringup traxxas_free_drive.launch

sessão para guardar dados de condução para treinar
roslaunch simulation_bringup traxxas_drive_write.launch folder:=setX

treinar com os dados de uma sessão guardada
roslaunch simulation_bringup traxxas_training1.launch folder:=setX model:=modelX.h5

roslaunch simulation_bringup traxxas_training2a.launch folder:=setX model:=modelX.h5

roslaunch simulation_bringup traxxas_training2av.launch folder:=setX model:=modelX.h5

condução autónoma com um modelo previamente treinado
roslaunch simulation_bringup traxxas_drive1.launch model:=modelX.h5

roslaunch simulation_bringup traxxas_drive2a.launch model:=modelX.h5

roslaunch simulation_bringup traxxas_drive2av.launch model:=modelX.h5

condução autónoma com um modelo previamente treinado e reação aos sinais TODO
roslaunch simulation_bringup traxxas_drive_signal1.launch model:=modelX.h5

roslaunch simulation_bringup traxxas_drive_signal2a.launch model:=modelX.h5

roslaunch simulation_bringup traxxas_drive_signal2av.launch model:=modelX.h5

Notas sobre os ficheiros launch/modules que estão nos pacotes bringup
Tem launch files que incluem os launch files dos nodes nos respectivos pacotes. Estes launch files são incluídos pelos launch files finais.
O propósito é facilitar as alterações quando um node ou um pacote muda de nome. Neste caso basta alterar os nomes dos pacotes nestes launch files.
Além disso também contem os parâmetros básicos pré-definidos para o contexto, evitando que todos os launch files finais tenham essas definições.

 

cnn

Data, contem as pastas das diversas sessões de condução para recolha de dados para treino, uma pasta por cada conjunto de imagens, e respectivo ficheiro csv

Models, contem os modelos resultantes dos treinos efectuados com os dados recolhidos

Launch, contem os ficheiros de lançamento para cada um dos nodes (devem ser incluidos nos ficheiros de pacotes bringup

  • write.launch
    • driving1.launch
    • training1.launch

Scripts

Contem os scripts de uso global  e uma pasta por cada conjunto de scripts associados a um modelo de machine learning especifico

  • write.py
  • cnn1/
  • cnn2

write.py

‘~image_raw_topic‘, ‘/ackermann_vehicle/camera/rgb/image_raw’
‘~twist_cmd_topic‘, ‘/cmd_vel’
‘~folder‘, ‘set1’
‘~rate‘, 30
‘~width‘, 320
‘~height‘, 160

cnn1/training1.py

‘~base_folder‘, ‘set1’)- nos argumentos dos launchs está abreviado para folder
‘~modelname‘, ‘model1.h5’) – nos argumentos dos launchs está abreviado para model
‘~epochs‘, 20)
‘~steps_per_epoch‘, 100)
‘~batch_xtrain‘, 20)
‘~batch_ytrain‘, 1)
‘~batch_xval‘, 25)
‘~batch_yval‘, 0)
‘~validation_steps‘, 50)

cnn1/driving1.py

‘~image_raw_topic‘, ‘/ackermann_vehicle/camera/rgb/image_raw’
‘~twist_cmd_topic‘, ‘/cmd_vel’
‘~vel_cmd_topic‘, ” – se não for vazio publica  o booleano no tópico
‘~twist_linear_x‘, 1
‘~float_cmd_topic‘, ” – se não for vazio subscreve o tópico para obter a velocidade a aplicar (modo real), se não aplica a velocidade explicita em twist_linear_x (modo simulação)
‘~modelname‘, ‘model1.h5’ – nos argumentos dos launchs está abreviado para model

physical_bringup

Launch files para o carro real. Acho que me falta lançar o rosserial.
Ver acima os comandos.

robot_driving

  • physical_camera.launch – Lança o node camera2topic.py
  • physical_robot_control.launch – Lança o node androidConversor.py
  • physical_robot_driving.launch – Lança por inclusão o conversor e a camera

camera2topic.py

‘~camera_topic‘,’/real_camera’
‘~int_camera_id‘, 2

androidConversor.py

‘~twist_dir_topic‘, ‘/android_input_dir’
‘~bool_vel_topic‘, ‘/android_input_vel’
‘~int_dir_topic‘, ‘/pub_dir’
‘~int_vel_topic‘, ‘/pub_vel’
‘~int_vel_max‘, 108

signal_recognition

TODO: fazer apenas um launch, e colocar as diferenças para os pacotes bringup

  • physical_signal_recognition.launch
  • signal_panel_recognition.launch

signal_panel_recognition.py

‘~image_raw_topic‘, ‘/ackermann_vehicle/camera2/rgb/image_raw’
‘~float_cmd_topic‘, ‘/flt_cmd’
‘~twist_linear_x‘, 0.5

simulation_bringup

Launch files para a simulação.
Ver acima os comandos.

simulation_environment

Contem a definição dos mundos (pistas)

  • arena.launch (world:=nome)
  • signal_panel.launch

gazebo_signalling_panel_controller

  • “topic_monitor1”, topic_monitor1, “/monitor1/image1”
  • “topic_monitor2”, topic_monitor2, “/monitor2/image2”
  • “source_package”, source_package, “simspace”
  • “source_folder”, source_folder, “semaphores_pics”
  • “name_pic0”, name_pic0, “left”
  • “name_pic1”, name_pic1, “right”
  • “name_pic2”, name_pic2, “up”
  • “name_pic3”, name_pic3, “stop”
  • “name_pic4”, name_pic4, “parking”
  • “name_pic5”, name_pic5, “chess”
  • “default_pic”, default_pic, 3

traxxas_description

Contem os modelos do carro, configurações e controller para o gazebo.
Tem mais dois nodes para implementação da conversão das mensagens twist para ackermann ou para o modelo usado pelo carro real. (eventualmente passar estes nodes para o pacote robot_driving)

Traxxas Arduino Shield

O Traxxas Arduino Shield foi feito para substituir a placa branca aplicada no robot. É muito simples pois o único objetivo foi eliminar a placa branca e a maior parte dos fios existentes.

O shield encaixa em parte dos headers do Arduino Uno e permite encaixar os fios de ligação do esc dos motores e do servo da direção nuns conectores de 3 pinos.

A forma de ligar o esc e o servo ao shield está ilustrada na imagem. É de notar que se bem que o sinal do conector destinado ao esc está sempre ligado ao pino D6 do arduino, o sinal do conector destinado ao servo, tem de ser ligado, com o fio verde, ao pino D9.

O shield tem espaço para possíveis desenvolvimentos, entre os quais a colocação de um condensador na alimentação (GND e 5V)

A imagem indica claramente as ligações a efectuar.

traxxas_firmware

Firmware de controlo com ROS do servo da direcção e do ESC de um rover traxxas, para um  ESP8266 nodeMCU V3 com um PCA9685.

Usado no rover traxxas do Automec – Universidade de Aveiro

O firmware subscreve os tópicos:

  • pub_dir, (angulo de direcção entre -90º e 90º a aplicar ao servo)
  • pub_vel (velocidade expressa entre |0, 90| sendo o seu sinal indicador da direcção, o negativo é marcha atrás)

Pode ser expandido para controlar também o servo do diff. traseiro e do diff. dianteiro.

  • ESP8266 (micontrolador de 32bits com wifi integrado);
  • PCA9685 (gerador de PWM de 12bits e 16canais)

 

  • IDE: platformIO,
  • Board: ESP8266 nodeMCU 12E

Na primeira fase está implementado o controlo do ESC e do servo da direcção.

A ligação do firmware aos node ROS depende do pacote rosserial.

Caso não esteja instalado, pode-se instalar com o seguinte comando (substituir noetic, pela identificação da distribuição do ROS):

sudo apt install ros-noetic-rosserial

Depende de um node que publique mensagens twist nos tópicos apropriados. Como por exemplo o node: linang_to_ackermann.py.

O node deve ser lançado com a seguinte configuração

message_type:=physical

O node pode ser configurado para dois tipos de input,:

train:=1 (subscreve um único tópico twist com velocidade angular e linear)

train:=0 (pré-definido, subscreve dois tópicos twist, um com velocidade angular, e outro com a velocidade linear)

Identificação da porta serie a usar na comunicação

~$ dmesg
[12722.986709] usbserial: USB Serial support registered for ch341-uart
[12722.986727] ch341 1-1:1.0: ch341-uart converter detected
[12722.987254] usb 1-1: ch341-uart converter now attached to ttyUSB0

Exemplos de exploração do sistema

Cada um dos comandos deve ser lançado num terminal independente

Exemplo de exploração em modo real e autónomo com o node linang_to_ackermann.py (usando um launch file)

rosrun rosserial_python serial_node.py /dev/ttyUSB0
roslaunch ackermann_vehicle_gazebo linang_to_ackermann.launch message_type:=physical

Exemplo de exploração em modo real e treino com o node linang_to_ackermann.py (usando um launch file)

rosrun rosserial_python serial_node.py /dev/ttyUSB0
roslaunch ackermann_vehicle_gazebo linang_to_ackermann.launch message_type:=physical train:=1
rqt

 

Exemplo do output de uma ligação bem sucedida do node serial_node.py

~$ rosrun rosserial_python serial_node.py /dev/ttyUSB0
[INFO] [1620470781.458011]: ROS Serial Python Node
[INFO] [1620470781.460781]: Connecting to /dev/ttyUSB0 at 57600 baud
[INFO] [1620470783.566170]: Requesting topics...
[INFO] [1620470783.599243]: Note: subscribe buffer size is 512 bytes
[INFO] [1620470783.603585]: Setup subscriber on pub_dir [std_msgs/Int16]
[INFO] [1620470783.618133]: Setup subscriber on pub_vel [std_msgs/Int16]
^C[INFO] [1620470867.461564]: Sending tx stop request

 

Ligações entre o ESP32 e o PCA9685

ESP32 > PCA9685

Ligações entre o PCA9685 com o servo da direcção e o esc

canal 0 – servo da direção

cana 1 – esc

Automec-AD contribs and docs

Instruções de uso e commandos

Automec-AD use v01

 

Ackermann steering simulation

Adaptação de dois pacotes com a inclusão de um robot com camera e  um node de conversão entre mensagens twist e ackermann, para usar nas simulações do gazebo.

Packages:

ackermann_vehicle_description

  • robot01.gazebo.macro.xacro
  • robot01.urdf.xacro

ackermann_vehicle_gazebo

  • config/em_3905_ackermann_ctrlr_params.yaml
  • config/em_3905_joint_ctrlr_params.yaml
  • launch/ackermann_robot.launch
  • launch/ackermann_robot_with_arena.launch
  • launch/ackermann_robot_with_arena_conversion.launch
  • launch/twist_to_ackermann.launch
  • nodes/ackermann_controller.py
  • nodes/twist_to_ackermann.py

Baseado no seguinte repositório:

https://github.com/csorvagep/ackermann_vehicle

Machine Learning nodes improvements

package: robot_core

Novo node training_node.py, já preparado para receber parâmetros para substituir o TrainingSimulation.py

Alterações ao node write_data para receber parâmetros, e poder usar vários sets de amostras

Alterações ao node ml_driving-dave.py para receber parâmetros, e poder usar vários sets de amostras

Unified and simplified simulation_space

package: simspace

roslaunch simspace arena1.launch

Vehicle second camera for signal recognition

robot02 is and upgrade from 01 with a new camera (camera2)

Panel signal recognition

new rosnode on robot_core for signal recognition and behavior detection

rosrun robot_core signal_recognition.py

 

Automec-ad user commands v01

Instructions and commands for running simulation

updated

Get sample data for ml training

roslaunch ackermann_vehicle_gazebo ackermann_robot_with_arena_conversion_mltrain.launch folder:=/cleantrack1

É obrigatório o argumento folder:=/nome

O folder tem de ser criado dentro da pasta “data”

Lança tudo.

  • O mundo gazebo
  • O carro
  • O conversor twist para ackermann
  • O node de captura de dados
  • O node de rqt para conduzir o carro para as voltas de treino

Training ml model with sample data

roslaunch robot_core training.launch folder:=/cleantrack1 model:=cleantrack1.h5

São obrigatórios os argumentos:

  • folder:=/nome (não esquecer a barra no inicio)
  • model:=nome.h5 (Não esquecer a extensão .h5)

Driving with ml model

Just drive, no signals.

roslaunch ackermann_vehicle_gazebo ackermann_robot_with_arena_conversion_mlsolo.launch model:=cleantrack1.h5

Drive with two signals

roslaunch ackermann_vehicle_gazebo ackermann_robot_with_arena_conversion_mlsignal.launch model:=cleantrack1.h5

Não esquecer a extensão .h5

old

Get sample data for ml training

Run the commands (on each terminal)

roslaunch ackermann_vehicle_gazebo ackermann_robot_with_arena_conversion.launch

rqt

rqt configuration

Plugins > Robot tools > Robot Steering (select namespace/ topic cmd_vel)

Plugins > Visualization > Image Viewer (select namespace/ topic image_raw)

Don’t forget to set the velocity to the fixed value (each set need the same linear velocity,  write it down to use in later manual driving)

run ml sampling collect node

roslaunch robot_core write.launch

May run with arguments

roslaunch robot_core write.launch arg:=value

args

image_raw_topic  (default=/ackermann_vehicle/camera/rgb/image_raw)
twist_cmd_topic (default=/cmd_vel)
base_folder (default=/set1)

The base_folder, if not exists, need to be created inside the data folder on robot core package

Drive the car manually two laps

Ctrl+C to end the the nodes.

Training ml model with sample data

roslaunch robot_core training.launch

May run with arguments

roslaunch robot_core training.launch arg:=value

args

epochs (default=20)
steps_per_epoch (default=100)
base_folder (default=/set1)
modelname (default=model_default.h5)
You may load an old model, or create a new one.
The model is stored in model_files folder

Driving with ml model

Run the commands (on each terminal)

roslaunch ackermann_vehicle_gazebo ackermann_robot_with_arena_conversion.launch

roslaunch robot_core driving.launch

May run with arguments

roslaunch robot_core driving.launch arg:=value

args

image_raw_topic  (default=/ackermann_vehicle/camera/rgb/image_raw)
twist_cmd_topic (default=/cmd_vel)
twist_linear_x (default=0.5)  USE THE SAME VELOCITY AT MANUAL DRIVING
modelname (default=model_default.h5)
Ctrl+C to end the the nodes.

OLD INFO

RUN ML TASKS

A) Robot spawn inside automec contest world and twist to ackerman converter node

roslaunch ackermann_vehicle_gazebo ackermann_robot_with_arena_conversion.launch

 

Run ml agent to store data to learn

RUN: A) before

cd /catkin_ws/src/AutoMec-AD/robot_core/

python3 write_data.py

 

teleop with rqt

RUN: rqt

Plugins > Robot tools > Robot Steering (select namespace/ topic cmd_vel)

Plugins > Visualization > Image Viewer (select namespace/ topic image_raw)

 

run ml tranings_simulation

cd /catkin_ws/src/AutoMec-AD-dev/robot_core/src/cnn/models_python/

python3 TrainingSimulation.py

 

run ml driving

RUN: A) before

cd /catkin_ws/src/AutoMec-AD-dev/robot_core/src/cnn/driving/

python3 ml_driving-dave.py

 

warning

Node::Advertise(): Error advertising topic [/ackermann_vehicle/joint_cmd]. Did you forget to start the discovery service?