# Integração Matlab-ROS Tutorial adaptado do excelente: [RotorS Simulator](https://github.com/ethz-asl/rotors_simulator/wiki/Interfacing-RotorS-through-Matlab) OS: Ubuntu 20.04 ROS: Noetic (ROS 1) Python: 3.9 Matlab: 2023b Autor: Lucca Gandra (luccagandra@poli.ufrj.br) ## Instalação do Python correto Para inserirmos ROS dentro do Matlab, precisamos ter instalado uma versão do Python compatível com o Matlab. Verifique no link abaixo as versões de Python compatíveis com o MATLAB, por lançamento: [Compatibilidade Matlab-Python](https://www.mathworks.com/support/requirements/python-compatibility.html). E, caso queira, instale um [Matlab pirata](https://downloadlynet.ir/2020/26/9256/03/matlab-2/16/?#/9256-matlab-r-222448060405.html). (Baixei o 2023b Linux sem problemas) No caso em específico analisado, temos que a última versão do Python que o Ubuntu 20.04 suporta é a 3.9. A versão do Matlab que aceita o 3.9 é a 2023b. Portanto, para instalá-lo, usamos: ``` sudo apt install python3.9 python3.9-venv python3.9-dev ``` Você pode verificar os caminhos do seu python instalado com o comando: ``` whereis python3.9 ``` ## Setup ROS-Toolbox Insira o caminho do python3.9 instalado em seu sistema. No meu caso é "/usr/bin/python3.9". ![Screenshot from 2024-02-23 16-03-00](https://hackmd.io/_uploads/B1lF3PL3p.png) ![Screenshot from 2024-02-23 16-03-14](https://hackmd.io/_uploads/rJ3KhvLhp.png) ## Execução do script É recomendado enviar esses comandos no terminal antes do script: ``` clear classes ``` ``` rehash toolboxcache ``` Se tudo der certo, no momento que executar um arquivo Matlab com a estrutura: ```cpp= %% ROS: New connection with host rosshutdown IP_ROS_Master = 'http://localhost:11311/'; rosinit(IP_ROS_Master) node = ros.Node('/ros_matlab'); ``` A conexão com a master deverá ter sido iniciada e uma mensagem como essa aparecerá no terminal: ![Screenshot from 2024-06-05 16-32-30](https://hackmd.io/_uploads/BkHi64CNR.png) ## Criação de mensagens customizadas No terminal do Matlab, utilize o comando rosgenmsg para construir as mensagens customizadas. Em meu caso, utilizei as mensagens próprias do wiki do RotorS, que estão disponíveis neste [link](https://github.com/gsilano/CrazyS/wiki/files/customMessages.rar). O argumento deve ser o caminho da pasta que contém as mensagens customizadas. ``` rosgenmsg('PATH-TO-CUSTOM_MSGS') ``` Agora é só copiar os comandos gerados pelo serviço. ``` addpath('CAMINHO-GERADO-PELO-ROSGENMSG') savepath clear classes rehash toolboxcache ``` ## Exemplo de Subscriber e Publisher ```cpp= %% ROS: Publishers and Subscribers %% Setup ros_sub_odometry = rossubscriber('/M600/odometry'); % contains the drone state %ros_sub_motor_speed = rossubscriber('/kopterworx/motor_speed'); [ros_pub_motor_speed, ros_actuator_msg] = rospublisher('/M600/gazebo/command/motor_speed','mav_msgs/Actuators'); %% ------------------------------------------------------------ %% Loop ros_odom = receive(ros_sub_odometry); %GazeboMessage{i,1} = ros_odom; % Position x_GAZEBO = ros_odom.Pose.Pose.Position.X; y_GAZEBO = ros_odom.Pose.Pose.Position.Y; z_GAZEBO = ros_odom.Pose.Pose.Position.Z; p = [x_GAZEBO y_GAZEBO z_GAZEBO]'; %Linear velocity u_GAZEBO = ros_odom.Twist.Twist.Linear.X; v_GAZEBO = ros_odom.Twist.Twist.Linear.Y; w_GAZEBO = ros_odom.Twist.Twist.Linear.Z; v = [u_GAZEBO v_GAZEBO w_GAZEBO]'; % Quaternion q0_GAZEBO = ros_odom.Pose.Pose.Orientation.W; q1_GAZEBO = ros_odom.Pose.Pose.Orientation.X; q2_GAZEBO = ros_odom.Pose.Pose.Orientation.Y; q3_GAZEBO = ros_odom.Pose.Pose.Orientation.Z; q = [q0_GAZEBO q1_GAZEBO q2_GAZEBO q3_GAZEBO]'; %Angular velocities in ABC frame (ABC Frame?) p_GAZEBO = ros_odom.Twist.Twist.Angular.X; q_GAZEBO = ros_odom.Twist.Twist.Angular.Y; r_GAZEBO = ros_odom.Twist.Twist.Angular.Z; Omega = [p_GAZEBO q_GAZEBO r_GAZEBO]'; ``` ## Exemplo: Drone com controle SSC, implementado no Matlab e simulado no Gazebo. A planta no Gazebo usou as mesmas constantes da simulada em Matlab, mas com a interface do [RotorS Simulator](https://github.com/ethz-asl/rotors_simulator/wiki/Interfacing-RotorS-through-Matlab). O setpoint de posição foi [0,0,5]. ## À fazer: Verificar passo de simulação e tempo do ROS. Como sincronizar?