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

multibot_description

ROS multi robot in Rviz and Gazebo demo

https://github.com/inaciose/multibot_description

 

roslaunch multibot_description world_1bot.launch

roslaunch multibot_description spawn_bot.launch ns:=sibot2 botcolor:=Blue x:=2

roslaunch multibot_description spawn_bot.launch ns:=sibot3 botcolor:=Red x:=3

roslaunch multibot_description world_2bot.launch

sibot log

2021-04-05

Antes de volta a trabalhar no ficheiro urdf com o modelo do robot de lagartas, fui, mais uma vez, ver se conseguia colocar o plugin phobos para o blender de modo a passar a usar a funcionalidade de import/export de urdfs no blender e desse modo usar o blender para desennhar os modelos urdf dos robots.

Mais uma vez não tive sucesso nessa instalação.

Entretanto consegui acabar o urdf do robot com lagartas á mão e ficou com o seguinte aspecto no rviz e no gazebo:

Visualização do urdf do robot de lagartas (tracked robot) no Rviz
Visualização do urdf do robot de lagartas (tracked robot) no Rviz
Visualização do urdf do robot de lagartas (tracked robot) no Gazebo
Visualização do urdf do robot de lagartas (tracked robot) no Gazebo

Existe uma pequena diferença relação ao modelo definido no sdf original, o angulo dos flippers face ao solo é menor (os flippers são as extremidades que existem anexas a cada lagarta)

Passado o problema da conversão do sdf para urdf, passei ao problema do controlo do movimento do robot, que gostava que fosse efectuado com base no seguinte plugin do gazebo (e a respectiva evocação no urdf):

libSimpleTrackedVehiclePlugin.so

<plugin filename=”libSimpleTrackedVehiclePlugin.so” name=”simple_tracked_vehicle”>
<body>base_link</body>
<left_track>left_track</left_track>
<right_track>right_track</right_track>
<left_flipper>front_left_flipper</left_flipper>
<left_flipper>rear_left_flipper</left_flipper>
<right_flipper>front_right_flipper</right_flipper>
<right_flipper>rear_right_flipper</right_flipper>
<track_mu>2</track_mu>
<track_mu2>0.5</track_mu2>
</plugin>

Mas o problema, á primeira vista é que este plugin não tem interface para topicos do ROS e aparenta ter como input o teclado via o seguinte plugin do gazebo (e a respectiva evocação no urdf):

libKeysToCmdVelPlugin.so

<gui>
<plugin name=”keyboard” filename=”libKeyboardGUIPlugin.so”/>
</gui>

<plugin filename=”libKeysToCmdVelPlugin.so” name=”keyboard_control”>
<publish_as_twist>true</publish_as_twist>
<cmd_vel_topic>~/simple_tracked/cmd_vel_twist</cmd_vel_topic>
</plugin>

Apesar da referência ao seguinte tópico do ros:

~/simple_tracked/cmd_vel_twist

não vejo qualquer referencia a esse topico com o rostopic list

/bot1/joint_states
/clock
/gazebo/link_states
/gazebo/model_states
/gazebo/parameter_descriptions
/gazebo/parameter_updates
/gazebo/set_link_state
/gazebo/set_model_state
/rosout
/rosout_agg
/tf
/tf_static

O codigo fonte dos gazebo  plugins envolvidos estão disponíveis em:

https://github.com/osrf/gazebo/blob/gazebo11/plugins/KeyboardGUIPlugin.cc

https://github.com/osrf/gazebo/blob/gazebo11/plugins/KeysToCmdVelPlugin.cc

https://github.com/osrf/gazebo/blob/gazebo11/plugins/TrackedVehiclePlugin.cc

https://github.com/osrf/gazebo/blob/gazebo11/plugins/SimpleTrackedVehiclePlugin.cc

Compare gazebo plugins source

https://github.com/osrf/gazebo/blob/gazebo11/plugins/DiffDrivePlugin.cc

https://github.com/osrf/gazebo/blob/gazebo11/plugins/SkidSteerDrivePlugin.cc

 

Compare rROS gazebo plugins source

https://github.com/ros-simulation/gazebo_ros_pkgs/blob/noetic-devel/gazebo_plugins/src/gazebo_ros_diff_drive.cpp

https://github.com/ros-simulation/gazebo_ros_pkgs/blob/noetic-devel/gazebo_plugins/src/gazebo_ros_skid_steer_drive.cpp

 

Linux gazebo plugins lib files

/usr/lib/x86_64-linux-gnu/gazebo-11/plugins/libSimpleTrackedVehiclePlugin.so
/usr/lib/x86_64-linux-gnu/gazebo-11/plugins/libTrackedVehiclePlugin.so
/usr/lib/x86_64-linux-gnu/gazebo-11/plugins/libWheelTrackedVehiclePlugin.so

 

Desenvolver ros plugins para o gazebo

sudo apt install libgazebo11

sudo apt install libgazebo11-dev

http://gazebosim.org/tutorials?tut=ros_installing&cat=connect_ros

https://github.com/ros-simulation/gazebo_ros_pkgs

cd ~/catkin_ws/src
git clone https://github.com/ros-simulation/gazebo_ros_pkgs.git -b noetic-devel

www.theconstructsim.com/create-a-ros-sensor-plugin-for-gazebo/

 

Desenvolver plugins para o gazebo

http://gazebosim.org/tutorials?cat=write_plugin

http://gazebosim.org/tutorials?tut=plugins_model&cat=write_plugin

 

Other plugins sources

https://github.com/onlytailei/gym_ped_sim

https://github.com/wojiaojiao/pegasus_gazebo_plugins

 

Other robots

https://wiki.cogni.io/Simulation

2021-04-24

Já desde ontem que ando de volta da simulação do robot com lagartas, que vai ficar no seguinte repositório.

https://github.com/inaciose/sibottrkd_description

Alguns launch files

roslaunch sibottrkd_description spawn_bot.launch

roslaunch sibottrkd_description world_1bot.launch

roslaunch sibottrkd_description world.launch world:=tracked_vehicle_simple

Tenho estado a construir o modelo com base no modelo disponível no seguinte mundo (world file) do gazebo:

https://github.com/osrf/gazebo/blob/gazebo11/worlds/tracked_vehicle_simple.world

O modelo de robot de lagartas definido no mundo acima usa o seguinte plugin especifico para robots de lagartas (tracked robot):

libSimpleTrackedVehiclePlugin.so

Primeiro passei por um processo de conversão manual do sdf para urdf, no entanto o resultado não foi satisfatório. Todos os componentes do modelo ficaram colocados no eixo dos y, e as extremidades das lagartas também não ficaram bem posicionadas.

O modelo tal como está no mundo do gazebo em sdf tem o seguinte aspecto:

O aspecto original no rviz e no gazebo do modelo após o primeiro processo manual de conversão do sdf para urdf era o seguinte:

 

2021-04-22

sibotdiff_description & sibotdiff_bringup

Actualizei o sibotdiff_description da seguinte forma:

Removi os models antigos (robot01 e robot02) e respectivas pastas de includes, e copiei o model robot01 do multibot_description  (e respectiva pasta de includes) para a para a pasta urdf do sibotdiff_description.

Na pasta launch do sibotdiff_bringup actualizei os ficheiros spawn_* e world_* para ficarem em linha com o existente no multibot_description.

Os modelos e ficheiros relacionados do sibotdiff_description vão ficar a ser desenvolvidos no multibot_description até ficarem estáveis e serem copiados para o sibotdiff_description.

multibot_description

Passando para o desenvolvimento no multibot_description o proximo passo é passar a usar macros e fazer com que a robot seja mais estavel (eventualmente pesado)

Sobre as propriedades fisicas seguem dois links importantes

http://wiki.ros.org/urdf/Tutorials/Adding%20Physical%20and%20Collision%20Properties%20to%20a%20URDF%20Model

<inertial>
<mass value=”10″/>
<inertia ixx=”0.4″ ixy=”0.0″ ixz=”0.0″ iyy=”0.4″ iyz=”0.0″ izz=”0.2″/>
</inertial>

<mass> (massa) em Kg

<inertia> Matriz de inercia. 3×3, só são necessárias as bolds.

Para mais informações sobre como calcular estes valores, ver:

https://en.wikipedia.org/wiki/List_of_moments_of_inertia#List_of_3D_inertia_tensors

Este tipo de cálculos (inertia) pode ser executado por macros.

 

 

rviz.launch melhorado para usar multiplas configurações

modelos robot00, e robot01, alterados para terem as rodas e o chassis com cores diferentes (a cor do chassis é escolhido num dos argumentos)

2021-04-21

multibot_description

Depois de ter conseguido por o multi robot a funcionar no sibot, decidi fazer um pacote especifico para servir como demo.

launch commands

roslaunch multibot_description world_1bot.launch

roslaunch multibot_description spawn_bot.launch ns:=sibot2 botcolor:=Blue x:=2

roslaunch multibot_description spawn_bot.launch ns:=sibot3 botcolor:=Red x:=3

roslaunch multibot_description world_2bot.launch

relativamente ao sibotdiff_description & bringup, removei o botname, e substitui pelo namespace onde ele era usado.

Consegui por o imu a funcionar.

Sibot, multi robot experiences

De volta da tentativa de colocar multiplos robots a funcionar correctamente no gazebo e no rviz.

Há três dias que ando de volta disto e ainda não consegui por as coisas a funcionar no rviz.

Creio que o problema esta no tf_prefix que deixou de funcionar, no ros noetic, mas não tenho a certeza.

No gazebo creio que não há problemas vejo a simulação a funcionar.

Tentativa 1

Hoje tentei a solução que está no primeiro link, o segundo link é para o pacote rosbot_description necessário para este teste

https://community.husarion.com/t/rviz-with-multiple-rosbots/792/4

https://github.com/husarion/rosbot_description

Também não funcionou.

Tentativa 2

Com base nos ficheiros xacro robot02 que tem o namespace tem todos os links e joints fiz as seguintes alterações:

Alterei ficheiro gazebo.diff_drive_controller.xacro, com base nas tags com a variável namespace disponíveis no ficheiro gazebo.xacro rosbot

Comentei as entradas do IMU.

E funcionou !

Tenho que fazer um pacote especifico para o multi robot.

 


 

roslaunch sibotdiff_bringup world_with_botns.launch model:=robot02

roslaunch sibotdiff_bringup spawn_botns.launch ns:=sibot1 botname:=bot1 botcolor:=Red x:=1

roslaunch sibotdiff_bringup spawn_botns.launch ns:=sibot2 botname:=bot2 botcolor:=Blue x:=2

 

 

aplicar xacro e converter xacro files para um urdf único

rosrun xacro xacro -o model.urdf robot02.urdf.xacro botname:=bot1 namespace:=bot1 botcolor:=Green


 

roslaunch sibotackm_bringup world_bot_twist.launch

Joystick para conduzir os robots no gazebo

Passar a usar o joystick em vez do rqt para conduzir o robot

As coisas não correram muito bem. O manipulo para andar nas diversas direcções não funciona bem para conduzir o carro.

 

Instalar

sudo apt-get install ros-melodic-joy

sudo apt install ros-noetic-teleop-twist-joy

Mais informação:

Joystick no ROS

http://wiki.ros.org/teleop_twist_joy

 

sibot_tools

TODO:

Need to update to stay on pair with automec version

  • linang_to_ackermann.py
  • linang_to_ackermann.launch

 

sibot_tools

Tools for exploring the sibot robots

https://github.com/inaciose/sibot_tools

Nodes

linang_to_ackermann.py

twist_to_ackermann.py

 

Teleop

O teleop primário é efectuado com o rqt, executado simplesmente por:

rqt

Caso não estejam já presentes no interface, deve-se proceder à configuração dos seguintes plugins:

  • Plugins > Robot tools > Robot Steering (select namespace/ topic cmd_vel)
  • Plugins > Visualization > Image Viewer (select namespace/ topic image_raw)

Para além do rqt existem outras ferramentas de teleop para conduzir o robot.

Essas ferramentas são opcionais e tem de ser instaladas através do apt, e o pacote sibot_tools tem os launch files que permitem intermediar o seu lançamento.

Pacotes opcionais

Permitem opções alternativas ao uso do rqt para enviar mensagens para tópicos twist.msg

  • joy
  • teleop_tools
  • teleop_twist_joy

Joy

Pacote base para leitura do joystick e publicação de mensagens joy.msg, notopico joy

Install

sudo apt install ros-noetic-joy

Os pacotes seguintes pacotes dependem do joy para funcionar:

teleop_tools
teleop_twist_joy

O pacote teleop_tools é mais versátil e por isso o mais aconselhado

Teleop tools instructions

Pacote de teleop que publica twist messages

Depende do pacote joy

Install

sudo apt install ros-noetic-teleop-tools

Este pacote fornece as funcionalidades de teleop com base nos seguintes inputs:

  • Keyboard
  • Mouse
  • Joystick

A forma como se comporta o teleop pode ser configurado nos launch files e em config files em yaml.

Mouse teleop

Este pacote fornece as funcionalidades de teleop para conduzir os robots com base no rato

A forma como a mensagem é construída pode ser configurada no ficheiro yaml.

Mouse configuration files

config/teleop_tools/mouse.yaml

Joystick teleop

Este pacote fornece as funcionalidades de teleop para conduzir os robots com base no joystick

Os componentes linear e angular da mensagem twist, assim como os botões de activação, super speed,as diversas acções opcionais/complementares, e os factores aplicados, podem ser configurados no ficheiro yaml.

Joystick configuration files

config/teleop_tools/joystick.yaml

Keyboard teleop

Este componente não está funcional

Teleop twist_joy instructions

Este pacote fornece as funcionalidades de teleop para conduzir os robots com base no joystick

Depende do pacote joy

Install

sudo apt install ros-noetic-teleop-twist-joy

Ficheiro de configuração yaml

config/teleop_twist_joy/joystick.yaml

Para os novos comandos serem enviados para o topic tem de se estar a premir um botão.

Os componentes linear e angular da mensagem twist, assim como os botões de activação e super speed, e os factores aplicados, podem ser configurados no ficheiro yaml.

 

sibot_gazebo

sibot_gazebo

Pacote ROS com os mundos, modelos e nodes de controlo de objectos.

Launch

roslaunch sibot_gazebo world.launch
roslaunch sibotdiff_bringup gazebo_world.launch world:=signal_panel
roslaunch sibot_gazebo signal.launc

Nodes

sidual_signal_panel_controller

  • name=”ns” default=”/”
  • name=”spackage” default=”sibot_gazebo”
  • name=”sfolder” default=”images/panel_signals”
  • name=”mon1″ default=”monitor1/image1″
  • name=”mon2″ default=”monitor2/image2″
todo
change to allow 1 or 2 panels mode
change to read the first 10 images of folder and remove image load params

Projecto sibot

Neste projecto pretendo explorar o controlo de vários tipos de viaturas com o ROS (Robotic Operating System).

Numa primeira fase será abordado o controlo de modelos de robots em ambientes simulados com o Gazebo e posteriormente passarei para robots e situações reais.

  • Os tipos de viaturas abordados neste projecto são os seguintes:
  • Viaturas de 4 rodas com direcção akermann (sibotackm)
  • Viaturas de 2 rodas com direcção diferencial (sibotdiff)
  • Viaturas de 4 rodas com direcção derrapante (sibotskid)
  • Viaturas com 2 lagartas (sibottrak)
  • Viaturas mecanum com 4 rodas omnidirecionais (sibotmeca)

O software está dividido por vários pacotes dedicados a a cada tipo de viatura e pacotes comuns usados por todos os tipos de viaturas.

 

sibot_opencv

sibot_opencv

Pacote ROS com os nodes de visão artificial só com opencv

https://github.com/inaciose/sibot_opencv

Launch

roslaunch sibot_opencv signal_recognition.launch

Nodes

signal_regonition.py

    • name=”image_raw_topic” default=”/camera2/rgb/image_raw”
    • name=”twist_cmd_topic” default=”/vel_cmd”
    • name=”twist_linear_x” default=”0.5″

 

sibotackm_mlcnn

sibotackm_mlcnn

Pacote com nodes de machine learning com convolutional neural networks

https://github.com/inaciose/sibotackm_mlcnn

Launch

roslaunch sibotackm_bringup world_bot_mldrive_signal.launch folder:=cleantrack3

Nodes

write_data

training_node

ml_driving-dave

Required python packages

sudo apt install python3-pip
pip3 install opencv-python
pip3 install pandas
pip3 install sklearn
pip3 install tensorflow
pip3 install imgaug

end