ieee-ras-ufcg/PyArm

Implementação do ROS com Arduino

Opened this issue · 4 comments

Data de Entrega: 11/05/2023

Objetivo: Controle das juntas do manipulador por meio de um código Python e ROS, utilizando o pacote rosserial.

Atividades:

  • Estudar sobre ROS;
  • Instalar e configurar um ambiente com ROS 1;
  • Instalar e configurar o pacote rosserial;
  • Testar um código exemplo de uso da rosserial;
  • Criar código de comunicação ROS para Arduino;
  • Código de limitação de ângulos para as juntas em python;
  • Criar um programa que controla um servo motor com a biblioteca rosserial e um programa python;
  • Realizar o controle de posição dos 5 servos do manipulador robótico utilizando rosserial.

*Estudo produzido nas datas de 11/05/2023 - 14/05/2023

  • O estudo do ROS básico utilizou o ros2-foxy, para se ter noção sobre nós, tópicos, serviços, parâmetros e ações. Através desse estudo foi gerado um documento de resumo sobre o conteúdo que aborda os comandos mais utilizados e importantes.

  • Após alguns problemas com a biblioteca "rosserial" em que estava tendo dificuldades em instalá-la, em uma reunião o problema foi resolvido e descobrimos que o problema era na versão do ROS. Sendo assim foi feita a troca do ros2-foxy para o ros-noetic no qual é onda a biblioteca funciona. Estudo básico do ROS2-foxy

  • Foi feita a instalação do ROS1-noetic no sistema para que se tornasse possível a utilização da biblioteca proposta, devido que a mesma não funciona nas versões ROS2 e ROS3.

Dia 16 de Agosto fiz testes de controle de arduino utilizando a biblioteca rosserial, foi notaldo que a biblioteca que simula um ambiente ROS no arduino, coisa que não é de seu natural, faz necessário a utilização de um shield pois ela sozinha não consegue fornecer alimentação para emular e sustentar um único servo, mesmo sendo um micro servo sg90. É bom também notar que durante a utilização do arduino é de extrema importância ligar primeiro a fonte de alimentação no servo e posteriomente fazer a ligação da porta USB no mesmo, e quando finalizar os trabalhos retirar primeiro a porta usb e posteriormente a fonte de alimentação da tomada.

Dia 19/10 foi dado início a produção do código de recebimento dos comandos das juntas, tendo o ROS Noetic aplicado em conjunto com o arduino, utilizando a bliblioteca roserial.

Testar esse código com dois servos. (Se funcionar, aprimorar para 5 servos)

`// Recive menseger for two servo mechanics ---> test

#if (ARDUINO >= 100)
#include <Arduino.h>
#else
#include <WProgram.h>
#endif

#include <Servo.h>
#include <ros.h>
#include <std_msgs/UInt16.h>

ros::NodeHandle nh; // create a node

Servo servo1; // objetics
Servo servo2;

void servo1_cb( const std_msgs::UInt16& cmd_msg){

if(cmd_msg.data >= 0){ // && cmd_msg1.data < 180 ---> essa limitação de 180 graus pode ser feito no código de python

servo1.write(cmd_msg.data); //atribui valores ao servo
// digitalWrite(13, !digitalRead(13));  pode se fazer teste de debug com esse led

}
}

void servo2_cb( const std_msgs::UInt16& cmd_msg){

if(cmd_msg.data >= 0){ //verifica se a variável não esta vazia

servo2.write(cmd_msg.data); 
// digitalWrite(13, !digitalRead(13));

}
}

//atribuição

ros::Subscriber<std_msgs::UInt16> sub1("servo1", servo1_cb);
ros::Subscriber<std_msgs::UInt16> sub2("servo2", servo2_cb);

void setup(){
pinMode(13, OUTPUT);

nh.initNode();
nh.subscribe(sub1); //envio dos dados para o servo 1
nh.subscribe(sub2); //envio dos dados para o servo 2

servo1.attach(9); //servo1 pino 9
servo2.attach(8); //servo2 pino 9
}

void loop(){
nh.spinOnce(); //
delay(15);
}
`