Trabalhamos com o cobot Dobot M1

Há um ano, em Habré, foi lançada a revisão do robô de mesa Dobot Magician. Neste artigo, proponho avaliar seu irmão mais velho Dobot M1 em ação. Também tentarei explicar por que escolhi esse modelo específico para o meu projeto, descreverei o processo de desenvolvimento da demo em Qt / c ++, bem como alguns momentos desagradáveis ​​que encontrei durante o processo de desenvolvimento.

1. Introdução


Este ano, trabalhei em um dos institutos de pesquisa mais comuns. No início, tudo era bastante casual, e o ano não prometeu nada de interessante, até que um dia em um comício começou uma discussão sobre como fazer a montagem de células solares em mosaico (células solares com telhas). Essa abordagem não é novidade, dizem eles , é uma das primeiras maneiras de montar painéis para satélites espaciais.

Não sei se isso é verdade porque não vi artigos ou patentes. Mas o interesse do público por essa decisão aumentou, em parte também porque há alguns anos a SunPower lançou seus novos painéis, que chamou de série P. Aconteceu no mundo da energia fotovoltaica que, como a sanpower está fazendo algo, todos devem fazer isso também. Lá estamos nós. Tudo é simples: preparamos os substratos, cortamos em tiras e montamos. Naquele momento, notei que, pessoalmente, definitivamente não colecionava nada manualmente, porque minhas mãos não diferiam em particular uniformidade. Caso contrário, o resultado pode ser algo como um vídeo no YouTube. E nós, afinal, somos uma instituição inteira, se realmente fazemos algo, não é uma fazenda tão coletiva. Ofereci-me para comprar robôs e configurá-los para o processo desejado, e eles me deram o aval.

Vale ressaltar que decidimos começar a montar painéis mais simples e mais simples. Um minipainel é qualquer painel solar menor que o padrão. Fazemos isso para elaborar processos tecnológicos. Primeiro, fui guiado por um painel com o tamanho de uma célula solar padrão com planos de dimensionamento para um painel de 2 x 2. O tamanho do lado de uma célula solar é de 16 cm, portanto, eram necessários robôs com um campo de acesso de 32 x 32 cm. . Então, armado com uma barra de pesquisa, comecei a estudar as frases. Decidi que 6 eixos não são necessários para o projeto, 4 são suficientes, então a escolha foi reduzida a robôs como uma cicatriz. Descobri que a compra de robôs industriais é acompanhada de despesas adicionais, como projetar um espaço de trabalho seguro e deixar o engenheiro de aplicação no local da instalação, que programa o robô para sua tarefa. Bons robôs industriais são caros em princípio, e os serviços dos engenheiros aumentarão ainda mais o preço; além disso, foi interessante implementar o projeto você mesmo. Portanto, a escolha reduziu-se a cobots, robôs colaborativos, com requisitos de segurança mais baixos e mais amigáveis ​​para a auto-prototipagem. Então, eu rapidamente encontrei a empresa Dobot. Eu imediatamente larguei o Dobot Magician por causa do tamanho e precisão, que é de 100 mícrons. Escrevi-lhes um pedido para dar especificações e disse onde comprar. Descobri que com APIs existem APIs e elas podem ser programadas em C ++. Combinava comigo, mas não podia comprá-lo diretamente. Felizmente, encontrei um fornecedor na Holanda que me vendeu 2 peças por 8700 euros com IVA, entregues na China e, ao mesmo tempo, assumi todo o desembaraço aduaneiro.

Apresenta gentileza




O Dobot M1 está posicionado como um robô colaborativo profissional de 4 eixos acessível. Pode suportar até 1,5 kg de carga (não testada), tem um alcance de até 400 mm (não em todos os lugares) e precisão de até 20 mícrons (verificado). O espaço de trabalho da bondade é visto na figura abaixo. Não é difícil notar que, devido às características do projeto, existe uma zona cega com um raio de pouco menos de 15 centímetros na frente. Além disso, este mapa espacial não leva em consideração a orientação da mão. O Dobot pode ser destro ou canhoto, ainda não descobri como isso pode ser ativado em qualquer lugar sem calibração adicional. Por padrão, o Dobot é destro, o que significa que a zona direita é limitada pela área de acesso da 2ª articulação, quando a primeira articulação é direcionada para a direita. Portanto, a área real da área de trabalho é cerca de 2/3 do que é mostrado no desenho oficial.



O Goodness possui portas de E / S: entradas e saídas digitais com níveis de 24 V (os níveis padrão são altos), bem como entradas analógicas. Que tipo de ADC existe, eu não sei. As portas estão disponíveis no painel traseiro no suporte e na própria mão para trabalhar com bicos. Esqueci de fotografar o conector no próprio braço, mas é um tipo de CAA. Há também uma interface de expansão para a qual você pode comprar uma taxa adicional. O Dobot se conecta a um PC via RS-232 ou através de uma rede.



Material da carcaça: policarbonato, aparentemente, além de um suporte de metal pintado de preto. Esse design não causa um senso de prêmio, mas também um senso de artesão. Comprei um totalmente carregado e um na base. Não testei o bico laser e a impressão 3D.

Para testar a bondade da bondade, usei o programa M1Studio para Windows, que é baixado do site da empresa. Mas isso é tudo. Além disso, armado com API, Qt e uma estação de trabalho com vespas elementares, sentei-me para escrever uma demonstração para trabalhar com vários altos e baixos.

Estamos escrevendo uma demo


Na verdade, a demonstração já está disponível no github . É possível fazer o download da documentação para API e protocolo de comunicação no site do fabricante.

Primeiro, usamos o método SearchDobot () da api, que não mostrava nada no Linux, e só funcionava no Windows se o dobot estivesse conectado via RS-232. É estranho, porque o M1Studiya define perfeitamente dobotov pela rede. Com endereços IP conhecidos, o método ConnectDobot () funciona perfeitamente. Está tudo bem, pensei, vou configurar o roteador e deixar o endereço IP ser anexado à papoula. No dia seguinte, fiquei surpreso com o fato de as gentilezas não reagirem. Aconteceu que, quando ligado, o dobot tem um endereço aleatório de papoula. Esse é um recurso do firmware, que foi corrigido na nova versão em maio, mas que eu, no entanto, tinha medo de instalar.

Armado com um programa para analisar pacotes de rede, descobri que o Dobot responde à solicitação UDP para a porta 6000 com o texto "WhoisDobotM1" resposta UDP com texto contendo o número do modelo do Dobot. Com base nisso, foi criado um método personalizado que envia solicitações por toda a sub-rede e, no caso de uma resposta, inicializa a gentileza.

void MainWindow::on_buttonSearch_clicked() { QHostAddress host; QList<QHostAddress> list = QNetworkInterface::allAddresses(); for (int i=0; i<list.count(); i++) { if ((!list.at(i).isLoopback()) && (list.at(i).protocol() == QAbstractSocket::IPv4Protocol)) host = list.at(i); } QString subnet = host.toString().section('.',0,2) + "."; QByteArray data = "WhoisDobotM1"; QUdpSocket udpSocketSend; udpSocketSend.writeDatagram(data);//need tocall it otherwise in Win get socket doesn't open udpSocketSend.bind(host, 54321, QAbstractSocket::ShareAddress); udpSocketGet.bind(host, udpSocketSend.localPort(), QAbstractSocket::ShareAddress); connect(&udpSocketGet, &QUdpSocket::readyRead, this, &MainWindow::readUdpData); for (int i=1; i<255; i++) udpSocketSend.writeDatagram(data, 32, QHostAddress(subnet + QString::number(i)), 6000); } 

 void MainWindow::readUdpData() { while (udpSocketGet.hasPendingDatagrams()) { QNetworkDatagram data = udpSocketGet.receiveDatagram(); QByteArray ip = data.senderAddress().toString().toUtf8(); QString name = QString(data.data()).section('_',0,0); // cuts "dobotM1" from "dobotM1_Dobot M1_0033\x00" if (name == "dobotM1") { MyDobot* a = new MyDobot(); dobot->push_back(a); dobot->last()->initDobot(ip); ui->listDobots->addItem(ip); on_listDobots_activated(ui->listDobots->currentIndex()); } } } 

A interface de demonstração é bastante simples e é apresentada na figura abaixo.



Para inicializar e controlar a gentileza, escrevi uma classe na qual realizava as funções necessárias: controle de eixo, movimento de ponto a ponto em uma linha reta e em uma curva, retorno à posição inicial, controle da bomba de ar e também monitoramento de posições e erros. Vamos nos revezar. Quando a classe é inicializada, o endereço IP da gentileza é armazenado na variável, a primeira conexão a ela ocorre, toda a fila de comandos é limpa, mesmo que a fila esteja vazia, e os parâmetros de aceleração e velocidade dos motores são definidos.

 class MyDobot : public QObject { Q_OBJECT public: explicit MyDobot(QObject *parent = nullptr); ~MyDobot(); void initDobot(QByteArray IPaddress); Pose getCurrentPosition(); void goHomeSafe(); void goHome(); void goSafe(); void goPosition(float x, float y, float z, float r); void goPositionStraight(float x, float y, float z, float r); void goJog(int index); void setAirPump(int status, int direction); //status 1 off 0 on; direction 0 suck 1 push void setOutput(uint8_t address, uint8_t level); void setMotor(int velocity, int acceleration); alarmState getAlarms(); void clearAlarms(); void clearQueue(); QString getName(); public slots: private: char deviceSN[64]; char deviceName[64]; QByteArray thisDobotIP; Pose currentPosition, futurePosition; }; 

Decidi usar um vetor com elementos da minha classe para controlar o dobot quando seu número é maior que 1. Cada elemento do vetor tem uma variável que armazena o endereço IP do dobot. Porque a biblioteca é uma e existem vários dobotov; em cada método da classe, você deve primeiro chamar o método de conexão com um dobot específico. Pode parecer torto, mas está tudo escondido, e trabalhar com essa classe é muito conveniente.

 void MyDobot::setAirPump(int status, int direction) { ConnectDobot(thisDobotIP, 115200, nullptr, nullptr); ... 

O movimento de um ponto a outro no API Goodness é implementado por vários métodos: em uma linha reta, em uma curva e de alguma outra maneira que não me lembro. Na figura abaixo, duas trajetórias de movimento entre 2 pontos são visíveis. Uma é uma linha reta, que com a calibração adequada do dispositivo não se bifurca ao se mover para frente e para trás. A segunda trajetória é a linha curva que você obtém, porque o firmware de bondade ajusta sequencialmente os motores para atingir a coordenada desejada. Note-se que nem sempre é possível o movimento em linha reta, algumas posições das articulações não permitem alcançar o ponto A ao ponto B em uma linha reta.



O monitoramento da posição do Dobot é implementado usando a classe Qtimer, cujo sinal Qtimer :: timeout está vinculado ao meu método MainWindow :: on_getPoseTimer. Devo admitir que esta é uma solução mais ou menos, porque a operação responsiva do aplicativo com ups só é possível se você definir um tempo limite de 1000 ms. Com tempos mais curtos, os empurrões começam a ser sentidos ao gerenciar os altos. Percebi que algumas vezes o dobot pode ser estúpido por algum tempo ao receber um comando, e se você envia comandos com bastante frequência, aumenta a probabilidade de entrar em estúpidos. Talvez isso se deva à constante chamada para o ConnectDobot, que pode parecer desnecessária nesta demonstração, mas a demonstração foi escrita em paralelo com o projeto principal e, no projeto principal, eu realmente preciso dessa implementação. No entanto, monitorar a conexão nem sempre é chamado, mas o problema com a suspensão permanece. Infelizmente, um tempo limite de 1 s não fornece uma medida tão suave da posição de bondade no espaço, que, por exemplo, é implementada no M1 Studio, mas, por outro lado, isso não é importante.

No mesmo método, ocorre uma solicitação de erros. Por gentileza da API, a transmissão do código de erro é implementada através da estrutura AlarmState.

 struct alarmState { uint8_t value[32]; }; 

Essa estrutura é uma matriz de elementos de 8 bits e o código de erro é codificado na representação binária de um dos vários elementos da matriz. Para calcular o código de erro, você precisa encontrar "1" no elemento e adicionar seu número de descarga (unidade) a 8 * n elementos (contendo ou não outros erros) antes dele na matriz de valores. Sim, pode haver mais de um erro de cada vez. Em seguida, o código de erro deve ser encontrado no documento, disponível para download no site do fabricante. O conteúdo do pdfk foi copiado para um arquivo de texto, que é parafusado no projeto como um recurso. Se o código de erro for diferente de 8 * 32 (ou seja, não há erro), esse código aparecerá no campo de erro e, ao clicar no botão Alarme, sua descrição será analisada no arquivo e exibida no campo de texto. A propósito, a decodificação e análise de erros são feitas fora da classe para controlar os altos. Agora, isso não me parece a idéia certa.

Uma bomba de ar está incluída no kit, o que no manual de instruções sugere a conexão às saídas digitais 17 e 18. Uma saída controla a ativação / desativação da bomba e a segunda controla a direção do movimento do ar. Assim, por exemplo, é ativada uma pinça pneumática, que também é fornecida.

Ervas daninhas


No processo de exploração do Dobot, encontrei alguns problemas.

  1. Os furos no suporte não são feitos para a altura dos furos na placa de ensaio óptica padrão. Por outro lado, uma vez quando, por engano, minhas gentilezas colidiram umas com as outras, uma delas simplesmente rolou ao redor do eixo do parafuso de fixação, o que, penso, evitou danos graves.
  2. Do primeiro parágrafo segue o segundo. Após a colisão do Dobot, seus eixos mudaram. Isso não foi assustador no começo, porque eu escrevi um método para calibrar o eixo do Dobot em relação à câmera. A coisa terrível aconteceu no parágrafo 3.
  3. O eixo vertical também mudou e agora o meu normal não é normal. Isso pode ser detectado pela câmera, se você desenhar duas perpendiculares com os pontos. Você pode garantir que, devido à vertical inclinada, o dobot agora desenhe com uma caneta, não seus eixos X e Y verdadeiros, mas suas projeções. E essas projeções podem ter um ângulo inferior a 90 graus. Na realidade, isso leva a um pequeno erro de alinhamento. Por outro lado, não é tão assustador porque o erro é linear.
  4. Firmware Dobot, em princípio, aprox. Houve um pequeno batente com um endereço de papoula, há alguns problemas com a espera de respostas a solicitações UDP, mas, caso contrário, funciona bem.
  5. O design fornece uma bateria, necessária para manter as últimas coordenadas após desligar a gentileza. Quando a bateria morre, a voltagem cai, o que apaga esses dados. Por esse motivo, o dobot é carregado em um estado de erro. Para deduzir desses estados, você deve primeiro chamar o método para limpar as mensagens de erro e, em seguida, chamar o método de pesquisa para a posição "inicial". Você pode substituir a bateria, o benefício está incluído. No entanto, a bateria está escondida no suporte e, para isso, é necessário desaparafusar 4 parafusos. O slot de um deles é abatido.
  6. No meu projeto, usei 3 folhas de vidro para aumentar o nível da mesa. Decisão mais ou menos, porque o copo está torto. O fato é que o Dobot começa a gerar erros quando seu eixo vertical tem um valor inferior a 15 mm e parece que nem todas as funções estão disponíveis. Portanto, é necessário que o espaço de trabalho esteja localizado logo acima do plano de conexão do Dobot.

Conclusão


A gentileza permitiu-me implementar um projeto para montar células solares em um mini soquete lado a lado, que pode ser visto em vídeo. A precisão do posicionamento foi verificada nas mesmas pastilhas de silício e estava no limite de 1 pixel em um eixo e 10 pixels em outro. A câmera neste projeto foi usada com uma resolução de 20 MP e o campo de visão da câmera ao longo do lado comprido foi de cerca de 17 cm. Não é difícil calcular que 1 pixel correspondeu a um tamanho linear de cerca de 30 mícrons. Acontece que as ópticas utilizadas, embora de alta qualidade, permitem observar claramente as bolachas de silício apenas no centro, enquanto as bordas das bolachas ficam muito embaçadas, o que leva a uma incerteza na determinação de seus rostos em lados curtos e, consequentemente, a uma incerteza na determinação do centro da bolacha. Depois de calibrar os eixos, ajustei o foco da câmera para os lados mais curtos das placas. Deve-se notar que, em princípio, era impossível focalizar ali como no centro do campo de visão, mas ainda assim. Devido a esse efeito, o erro de posicionamento ao longo do eixo ao longo do lado longo da célula solar estava no limite de 10 pixels, mas apenas 1 pixel no lado curto. O que corresponde a aproximadamente 300 e 30 mícrons. Isso me permitiu verificar a integridade das especificações quanto à precisão.

Source: https://habr.com/ru/post/pt467407/


All Articles