Projeto de simulação de um time IEEE VSS em um campo oficial em ROS utilizando Gazebo
- 📷 Screenshots
- 🎈 Introdução
- 🌎 Mundos
- 📣 Tópicos ROS
- 📏 Modelos utilizados
- 🔧 Parâmetros
- 📷 Câmera virtual
- 📁 Estrutura de pastas
- ➕ Dependências
- 🎨 Cores no Gazebo
- 📝 Contribuindo
- ✨ Contribuidores
É necessário clonar o projeto dentro de um workspace catkin. Para criar um workspace, veja esse link
Para rodar a simulação com um robô controlável, digite:
roslaunch travesim simulation_robot.launch
Para rodar a simulação com o time completo, digite:
roslaunch travesim simulation_team.launch
Para rodar a simulação de uma partida, digite:
roslaunch travesim simulation_match.launch
O TraveSim pode simular jogos com 3 ou 5 robôs por time. O número de robôs por time será inferido do mundo de simulação escolhido. Os mundos atualmente suportados são os seguintes:
vss_field.world
- Mundo base para partidas de 3x3vss_field_camera.world
- Mundo para partidas de 3x3 com câmera e iluminaçãovss_field_5.world
- Mundo base para partidas de 5x5
Assim, por exemplo, para executar a simulação com uma única equipe de 5 robôs, execute:
roslaunch travesim simulation_team.launch world_name:=vss_field_5.world
Para obter mais informações sobre os parâmetros do roslaunch, consulte a seção 🚀 Roslaunch.
A simulação pode ser usada com duas interfaces de entrada, controle por direção diferencial (padrão) ou controle direto dos motores. É importante notar que não é possível usar as duas interfaces para controlar robôs diferentes ao mesmo tempo.
Por padrão, a simulação recebe comandos do tipo geometry_msgs/Twist, representando a velocidade do robô em duas componentes: linear e angular.
# This expresses velocity in free space broken into its linear and angular parts.
Vector3 linear
Vector3 angular
Os tópicos ROS seguem a convenção de nomenclatura:
- /yellow_team/robot_[0..2|0..4]/diff_drive_controller/cmd_vel
- /blue_team/robot_[0..2|0..4]/diff_drive_controller/cmd_vel
O controle do robô é feito pelo diff_driver_controller. Os parâmetros de controle estão especificados no arquivo ./config/motor_diff_drive.yml. O controlador representa o comportamento do sistema de controle embarcado no robô e envia comandos de torque para os motores de modo a seguir o set point recebido.
Os parâmetros do controlador estão especificados no arquivo ./config/motor_diff_drive.yml.
A simulação também aceita controle diretamente por meio de comandos de velocidade angular para ambos os motores do robô (por meio da interface velocity_controller do pacote ros_control). Essa interface imita uma interface de controle mais acoplada às características do robô em relação ao controle de direção diferencial.
Os comandos são lidos de tópicos do tipo std_msgs/Float64, representando a velocidade de cada motor em rad/s
- /yellow_team/robot_[0..2|0..4]/left_controller/command
- /yellow_team/robot_[0..2|0..4]/right_controller/command
- /blue_team/robot_[0..2|0..4]/left_controller/command
- /blue_team/robot_[0..2|0..4]/right_controller/command
Para habilitar essa interface de controle, é necessário enviar o parâmetro twist_interface
como false nos parâmetros do roslaunch
Por padrão, o Gazebo publica no tópico /gazebo/model_states do tipo gazebo_msgs/ModelStates, com uma lista de informações acerca de cada um dos modelos presentes na simulação.
# broadcast all model states in world frame
string[] name # model names
geometry_msgs/Pose[] pose # desired pose in world frame
geometry_msgs/Twist[] twist # desired twist in world frame
Por comodidade, este pacote possui um script (vision_proxy.py) que se inscreve nesse tópico e republica a informação diferentes tópicos do tipo gazebo_msgs/ModelState para cada entidade (3 robôs do time amarelo, 3 robôs do time azul e 1 bola, 7 tópicos no total)
# Set Gazebo Model pose and twist
string model_name # model to set state (pose and twist)
geometry_msgs/Pose pose # desired pose in reference frame
geometry_msgs/Twist twist # desired twist in reference frame
string reference_frame # set pose/twist relative to the frame of this entity (Body/Model)
# leave empty or "world" or "map" defaults to world-frame
Os tópicos republicados são
- /vision/yellow_team/robot_[0..2|0..4] - Tópicos para os robôs do time amarelo
- /vision/blue_team/robot_[0..2|0..4] - Tópicos para os robôs do time azul
- /vision/ball - Tópico para a bola
Todas as unidades estão no SI, distâncias estão em metros, ângulos estão em radianos, velocidade linear está em m/s e velocidade angular está em rad/s
A simulação é construída a partir de um modelo de robô de VSS genérico, inspirado no modelo do VSS SDK model
Como suporte, foram criados modelos para o campo do VSS e para a bola de golf utilizada na partida, ambos construídos a partir das regras da Robocore para IEEE VSS.
Para criar um modelo urdf do seu projeto, você pode utilizar as ferramentas
- Phobos - Gera arquivos urdf files a partir do Blender
- SW2URDF - Gera arquivos urdf a partir do SolidWorks
- fusion2urdf - Gera arquivos urdf a partir do Fusion 360
- ROS wiki - Como criar um modelo urdf do zero
Para usar seu modelo customizado, altere o valor do parâmetro model
ao iniciar a simulação
world_name
- Nome o arquivo de mundo utilizado, padrão "vss_field.world"model
- Caminho do modelo do robô simulado, padrão "./urdf/vss_robot.xacro"controller_config_file
- Caminho do arquivo de configuração dos controladores do robô simulado, padrão "./config/motor_diff_drive.yml" setwist_interface
é "true", "./config/motor_direct_drive.yml" caso contrárioros_control_config_file
- Caminho do arquivo de configuração dogazebo_ros_control
, padrão "./config/ros_control_config.yml"debug
- Habilita mensagens de debug no terminal, padrão "false"gui
- Habilita janela GUI do Gazebo, padrão "true"paused
- Inicia a simulação com pause, padrão "true"use_sim_time
- Utiliza o tempo da simulação como referências das msgs, padrão "true"recording
- Habilita o log de estados do Gazebo, padrão "false"keyboard
- Habilita o node do controle pelo teclado/joystick, padrão "false"twist_interface
- Habilita a interface controle por meio de mensagens geometry_msgs/Twist se verdadeiro, utiliza a interface de controle com 2 mensagens std_msgs/Float64 caso contrário. Padrão "true". Veja a documentação para mais detalhes.
Para passar um parâmetro na execução da simulação, basta escrever o nome do parâmetro separado do novo valor com :=
Por exemplo, para mudar o parâmetro keyboard
para true
:
roslaunch travesim simulation_team.launch keyboard:=true
A simulação possui uma câmera virtual que captura imagens do topo do campo, de forma semelhante ao que acontece em uma partida de VSS real. Para habilita-la, é necessário utilizar o arquivo de mundo vss_field_camera.world
roslaunch travesim simulation_team.launch world_name:=vss_field_camera.world
A câmera publica as imagens obtidas no tópico /camera/image_raw
É possível acompanhar as imagens com o auxílio do pacote image_view
rosrun image_view image_view image:=/camera/image_raw
- bagfiles/ - Pasta para guardar bagfiles
- docs/ - Arquivos de documentação
- launch/ - Arquivos do roslaunch escritos na sintaxe XML do ROS
- meshes/ - Arquivos .stl do modelo dos nossos robôs, gerados com a extensão SW2URDF do SolidWorks
- models/ - Modelos personalizados para Gazebo utilizados na simulação, como o campo e a bola do VSS
- scripts/ - Rotinas python usadas no projeto
- keyboard_node.py - Rotina para capturar a entrada do teclado ou de um joystick para controlar a simulação.
- vision_proxy.py - Rotina para separar a informação de estado do Gazebo em tópicos diferentes para cada modelo (robôs e bola).
- urdf/ - Arquivos de descrição dos robôs no formato .urdf e .xacro. Os arquivos .urdf gerados com a extensão SW2URDF do SolidWorks
- worlds/ - Arquivos .world no formato SDL
A simulação é desenvolvida para ROS e Gazebo, é recomendável instalar ambos com o comando:
sudo apt install ros-noetic-desktop-full
O projeto depende do pacote velocity_controllers e do effort_controllers dentro da biblioteca ros_controllers e da biblioteca python pygame. É possível instalar com apt-get
sudo apt install ros-noetic-velocity-controllers ros-noetic-effort-controllers python3-pygame
Ou usando rosdep
rosdep install travesim
Você pode querer rodar o projeto dentro de um ambiente virtual de python (python virtualenv), afinal, essa é uma boa prática listada no livro de bolso de desenvolvimento python
Você pode criar um novo ambiente virtual com o comando
python3 -m venv venv
Em seguida, você deve rodar source
para ativar o ambiente virtual
source ./venv/bin/activate
Para instalar as dependências, rode o comando
pip install -r requirements.txt
Algumas bibliotecas externas podem estar faltando para compilar o pacote pygame
. Você pode instalar tudo com o comando
sudo apt-get install
subversion \
ffmpeg \
libsdl1.2-dev \
libsdl-image1.2-dev \
libsdl-mixer1.2-dev \
libsdl-ttf2.0-dev \
libavcodec-dev \
libavformat-dev \
libportmidi-dev \
libsmpeg-dev \
libswscale-dev \
Para uma lista das cores disponíveis no Gazebo, confira o arquivo de configuração do repo oficial. Temos também 2 scripts OGRE team blue e team yellow para a definição de cores customizadas (ref Gazebo e ref OGRE).
Toda a ajuda no desenvolvimento da robótica é bem-vinda, nós lhe encorajamos a contribuir para o projeto! Para saber como fazer, veja as diretrizes de contribuição aqui.
Agradecimentos a essas pessoas incríveis (emoji key):
Esse projeto segue a especificação do all-contributors. Contribuições de qualquer tipo são bem vindas!