Mostrando postagens com marcador Tutorial. Mostrar todas as postagens
Mostrando postagens com marcador Tutorial. Mostrar todas as postagens

terça-feira, 5 de março de 2013

Robotics Toolbox - Um Simulador de Robótica para MATLAB (mini tutorial)

--- Atualizado em 19/08/2014

Você está procurando um simulador para estudar robótica ou para testar controladores para robôs? Seus problemas acabaram! O Robotics Toolbox para MATLAB, desenvolvido por Peter Corke, é composto por um conjunto de ferramentas para simulação de robôs manipuladores e de robôs móveis. E o melhor: é gratuito!

Eu já comentei sobre outros simuladores baseados em MATLAB (como o simulador feito pelo Alexandre Brandão e outro que eu desenvolvi junto com o colega Wanderley Cardoso). Mas, o Robotics Toolbox é especial pois é bastante completo e possui versões para Octave, SciLab e Python, embora estas ainda não possuam todos os recursos da versão para MATLAB. Os arquivos do Robotics Toolbox estão disponíveis para download no site do próprio autor.

Instalar o toolbox é bem simples. Basta descompactar os arquivos numa pasta a sua escolha. Em seguida, execute o startup_rvc.m para adicionar as pastas do toolbox ao path do MATLAB. Pronto! Você já pode acessar suas funções!

O toolbox conta com vários modelos de robôs comerciais pré-programados, como os manipuladores PUMA 560, Motoman HP6 e FANUC AM120. Também possui os modelos do Stanford Arm e de um manipulador planar de duas juntas. A imagem abaixo ilustra a execução da simulação de um manipulador PUMA 560.

Simulação do robô PUMA 560.

Se você quiser, pode criar o modelo de seu próprio robô! O toolbox possui funções que ajudam na criação do modelo com base nos parâmetros de Denavit-Hartemberg. Por exemplo, o código a seguir cria um manipulador RRRR e obtém diversas informações sobre o robô criado. O robô criado é baseado no robô didático SPIDER, desenvolvido por Renan Louzada e Marcos Vieira.

% Primeiro, a função Link é usada para criar cada elo. 
% Os parâmetros da função Link são exatamente os parâmetros
% de Denavit-Hartemberg do elo em questão, nesta ordem: 
% theta = ângulo da junta (rad)
% d = deslocamento do elo (m)
% a = comprimento do elo (m)
% alpha = torção do elo (rad)
% sigma = tipo de junta (0: rotativa ou 1: prismática)

L(1) = Link([0 1 0 pi/2 0]);
L(2) = Link([0 0 1 0  0]);
L(3) = Link([0 0 0 pi/2 0]);
L(4) = Link([0  1 0 0 0]);

% Em seguida, a função SerialLink cria o robô 
% utilizando os elos criados anteriormente. 

robo = SerialLink(L, 'name', 'Robô Spider')
pause;

% A função fkine permite obter a matriz de transformação
% homogênea que relaciona o referencial da base com o do
% efetuador (cinemática direta) para uma dada configuração.

disp('Variáveis de juntas:');
q0 = [0 0 0 0];
qf = [pi pi/4 3*pi/4 pi];
qf2 = [pi pi/4 3*pi/4 0];

disp('Cinematica Direta:');
T = robo.fkine(qf)
pause;

% A matriz jacobiana relaciona as velocidades das juntas com
% a velocidade espacial do efetuador. O toolbox permite obter
% o jacobiano geométrico (que considera as componentes de 
% velocidade cartesiana do efetuador):

disp('Jacobiano:');
J = robo.jacob0(qf)
pause;

% Finalmente, é possível calcular o índice de manipulabilidade
% deste efetuador na configuração dada:

m = sqrt(det(J*J'))

% A representação gráfica do robô para as posições articulares
% armazenadas no vetor q pode ser obtida com a função plot. No
% exemplo a seguir, uma animação é gerada a partir de uma 
% sequência de configurações articulres:

tempo = 0:.1:10;
q = jtraj(q0, qf, tempo);
robo.plot(q)
q = jtraj(qf, qf2, tempo);
robo.plot(q)


Várias outras funções estão disponíveis no toolbox, como funções para obtenção da cinemática inversa, cálculo de matrizes de rotação, entre outras. 

O toolbox também traz esquemas de controladores utilizando alguns dos modelos pré-programados. Por exemplo, o diagrama a seguir ilustra o sistema feito em Simulink de um esquema de controle de movimentação para o manipulador PUMA 560 com base em Jacobiano inverso. 

Diagrama de blocos de um controlador de movimento para o robô manipulador PUMA 560.

No Robotics Toolbox também existe suporte para simulação de robôs móveis. Devo dizer que o aspecto visual da simulação de robôs móveis não sé tão bom quanto o do simulador desenvolvido pelo colega Alexandre Brandão (de fato, o simulador do Alexandre ganha de muito). 

Até a versão 9.8, havia limitações como a não consideração de aspectos dinâmicos nos modelos de robôs móveis e a inexistência de um modelo para o tradicional robô de tração diferencial (uniciclo). No entanto, na versão 9.9 o autor acrescentou os blocos que desenvolvi para simulação do robô de tração diferencial! :-)

Se você quiser, além dos blocos DiffSteer Kinematics e DiffSteer Dynamics, para simulação do robô de tração diferencial, eu preparei outros blocos, como: controlador de seguimento de trajetória, controlador de compensação dinâmica, adaptação automática de parâmetros dinâmicos para o controlador de compensação dinâmica, geração de trajetórias de referência e cálculo de índices de desempenho (IAE, ISE, ITAE, ITSE e Energia). Para utilizar esses blocos, basta fazer download do arquivo ZIP que está disponível no site da MathWorks e descompactar seu conteúdo numa pasta a sua escolha. Não é necessário ter o Robotics Toolbox instalado para usar esses blocos, mas se você estiver usando o Robotics Toolbox, é uma boa ideia descompactar na pasta "...\rvctools\simulink" do toolbox. Após copiar os arquivos, abra a biblioteca "DiffSteer_model.slx" e veja que os novos blocos.

Também acrescentei no arquivo ZIP alguns exemplos de utilização dos novos blocos. Dois podem ser rodados com os scripts "sim_unicycle_dynamics.m" e "sim_unicycle_kinematics.m" e servem apenas para ilustrar a diferença de comportamento entre os modelos quando se considera ou não a dinâmica da estrutura. Aproveitei a mesma estrutura de um dos exemplos originais do toolbox, mas que fazia a simulação do robô car-like. Outros dois sistemas são "kinematic_controller_system.slx" e "dynamic_controller_system.slx", que já trazem sistemas completos com uso dos blocos do robô, controladores, gerador de trajetórias e cálculo de índices de desempenho. A figura abaixo ilustra um deles.


Sistema completo para simulação de controlador adaptativo de compensação da dinâmica do robô de tração diferencial.

O bloco DiffSteer Kinematics pode ser facilmente utilizado para simular o modelo uniciclo. Basta colocar em zero o valor do parâmetro que determina a distância do ponto de interesse ao centro do eixo virtual das rodas de tração.

Mais informações sobre a utilização de cada bloco podem ser obtidas acessando o help dos próprios blocos (clique com o botão direito no bloco e selecione help). Testei com sucesso os novos blocos com o Robotics Toolbox versão 9.8 rodando em MATLAB R2012b e R2013a em Windows 7, e R2013a em Windows 8.1.

O Robotics Toolbox é muito interessante para simulação de robôs móveis, principalmente pela facilidade de utilização, pela possibilidade de alteração dos modelos e pelas funções de planejamento de trajetórias, localização e mapeamento. Por exemplo, o toolbox possui funções para aplicação de diagrama de Voronoi, filtro de Kamlan Estendido (EKF) e filtro de partículas! 

Além de simular robôs terrestres, o Robotics Toolbox também possui ferramentas para simulação de quadrotores! É muito bom para você poder testar suas ideias e evitar destruir seu brinquedo. :-)

Simulação de um quadrotor em voo.

Você pode fazer download do Robotics Toolbox aqui. Os blocos para simulação do robô de tração diferencial (uniciclo) estão disponíveis aqui. O manual com explicação de todas as funções do toolbox está disponível aqui.

Além do manual, o livro Robotics, Vision and Control, de autoria do prórprio Peter Corke, aborda a teoria e traz a explicação das funções dos toolboxes de robótica e de visão computacional (também de autoria dele) com mais de mil exemplos! Na parte final ele traz uma série de exemplos de controladores para robôs baseados em visão computacional. Comprei o livro e achei excelente!

Espero que possam aproveitar esta ótima ferramenta.
Até a próxima!

Referências:
http://www.mathworks.com/matlabcentral/fileexchange/44850-velocity-based-dynamic-model-and-adaptive-controller-for-differential-steered-mobile-robot
https://dl.dropbox.com/u/24875984/Unicycle.zip
https://dl.dropbox.com/u/24875984/unicycle_model_for_Robotics_Toolbox.zip
http://petercorke.com
http://petercorke.com/Toolbox_software.html
http://www.petercorke.com/RVC/

quarta-feira, 12 de outubro de 2011

Arduino com MATLAB! Mini tutorial

--- Atualizado em 26/04/2014

É isso mesmo! Agora você pode ligar seu Arduino ou LaunchPad (com MSP430) na USB e escrever programas diretamente a partir do MATLAB ou do Simulink!! É muito bacana! Imagine o potencial: os programas são escritos e executados pelo MATLAB!

Fiz o teste com meu Arduino Mega. Testei no MATLAB R2009a com Windows Vista e deu certo! Também testei com sucesso com Arduino UNO no MATLAB R2013a rodando em Windows 8.

As informações a seguir se referem ao Arduino. Mas, se você usa LaunchPad com MSP430, você também pode usar esse pacote para fazer o MATLAB se comunicar com sua placa! Para isso, use o Energia IDE para carregar os arquivos "adio.pde" ou "adioe.pde". Podem ser usadas placas com MSP430G2553 e com MSP430G2452 (o G2231 não possui memória suficiente). Os demais passos são exatamente os mesmos.

Como exemplo, fiz um data logger simples. O programa amostra várias vezes a entrada analógica A2, ajusta o PWM da saída 11, guarda os valores num vetor e depois mostra o gráfico dos valores armazenados. Veja como ficou o resultado:

MATLAB obtendo dados de uma das entradas analógicas do Arduino.

Você pode baixar meu código aqui!

Preparei um passo-a-passo para fazer a conexão Arduino-MATLAB:

1. Faça download do toolbox do Arduino para o MATLAB:
http://www.mathworks.com/matlabcentral/fileexchange/32374

2. Instale o toolbox:
 - descompacte o arquivo e coloque a pasta ArduinoIO no caminho de sua proferência (por exemplo, na pasta work do MATLAB);
 - abra o MATLAB, vá até a pasta ArduinoIO e rode o arquivo "install_arduino.m" para que o caminho seja configurado corretamente;

3. Usando a IDE do Arduino (ou o Energia, caso use LaunchPad), transfira o programa "adio.pde" para a placa. Este programa está na pasta "...\ArduinoIO\pde";

4. Verifique a porta COM a que seu Arduino está conectado e feche a IDE;

5. De volta ao MATLAB, digite o seguinte comando (substitua 'COM8' pela porta onde seu Aduino está):
a = arduino('COM8')

Deve aparecer na tela a mensagem:
Attempting connection .............

Se tudo estiver correto, depois de alguns segundos surgirão as mensagens:
Basic Analog and Digital I/O (adio.pde) sketch detected !
Arduino successfully connected !

a = 

arduino object connected to COM8 port
Basic Analog & Digital I/O sketch (adio.pde) running on the board
...
e outras informações.

Pronto! A partir de agora sua placa está pronta para receber comandos diretamente do MATLAB!! Como primeiro teste, escreva:

a.pinMode(13,'output');
a.digitalWrite(13,1); 

O LED do pino 13 deve acender!

Você deve ter notado que a sintaxe no MATLAB é muito parecida com a da própria linguagem do Arduino, o que ajuda muito! Outros exemplos de comandos são:

a.digitalRead(4) % lê valor digital do pino 4

a.analogRead(2) % lê valor analógico do pino A2

a.analogWrite(11, 155) % ajusta o duty cycle do PWM do pino 11 para 155

a.serial % obtém a identificação da porta serial do Arduino

a.flush; % apaga os dados do buffer serial do Arduino

a.roundTrip(42) % envia um dado ao Arduino, que o envia de volta

Com esse pacote também é possível controlar servomotores e fazer a leitura de encoders diretamente do MATLAB. Para isso, ao invés de fazer o upload do arquivo "adio.pde" para o Arduino, você vai precisar usar o "adioe.pde" (encoder) ou o "adioes.pde" (encoder + servo). Para controlar motores CC, pode usar o "motor_v1.pde" ou o "motor_v2.pde". Veja mais detalhes em:
http://www.mathworks.com/matlabcentral/fileexchange/32374-matlab-support-package-for-arduino--aka-arduinoio-package-

Informações completas sobre o ArduinoIO Package para MATLAB estão em:
http://www.mathworks.com/academia/arduino-software/arduino-matlab.html

Bom divertimento e até a próxima!