roboforum.ru

Технический форум по робототехнике.

 

Как скрестить МК и ROS?

Раздел создан специально для людей которым интересна робототехника, но в силу разных причин они не знают с чего начать.
Задавайте ваши вопросы, какими бы простыми они не казались, постоянные посетители форума постараются ответить на них по мере своих сил.
Робот своими руками. Самодельный робот.

Как скрестить МК и ROS?

Сообщение Yucca » 13 май 2014, 08:40

Пишу программу для автономного передвижения погрузчика, решила использовать для этого МК AVR ATmega128, дальномер Kinect и ноутбук с ROS, связь между ними осуществляется по Wi-Fi (к роутере цепляется по USARt микроконтроллер и дальномер и передает данные на ноут и обратно). Начало этой темы здесь - forum16/topic14150.html

Для навигации хочу использовать пакеты gmapping, amcl, move_base. Теперь у меня вопрос - как скрестить ROS и программу в микроконтроллере? Я уже второй месяц тщетно бьюсь с этой программой, а защита уже 5 июня.. Очеень прошу кто разбирается, помогите пожалуйста.
Вот то что у меня пока получилось из программы для МК: (аргументы пока просто условные поставлены, т.к. я не понимаю в каком формате будет информация от ROS приходить на МК...

Код: Выделить всёРазвернуть
#include <avr/io.h> //Библиотека ввода/вывода
#include <avr/interrupt.h> //Библиотека прерываний
#include <util/delay.h>

#define BAUDRATE 9600 // Скорость обмена данными
#define F_CPU 16000000UL // Рабочая частота контроллера

//Прототипы подпрограмм
void  USART_Init( );
void  USART_Byte_Transmit( unsigned char data );
void  USART_Transmit( char* string );
void Forklift_Get( int item );
void Forklift_Release();
void Forklift_Stop();

//Подпрограмма-обработчик прерывания по приходу байта на модуль  USART
ISR( USART0_RX_vect )
{
int data;
data = UDR0; //Присваиваем переменной b содержимое регистра UDR, в котором хранится принятый байт

if (data=='nomer')||(status==1) //если пришел номер груза для захвата, то говорим что погрузчик занят (т.к. status=1)
{
USART_Transmit("Forklift is busy. Press 2 to cancel current task!\r\n"); //Сообщение о занятости погрузчика, чтобы остановить задание

нажмите 2
data=0;
}
else if (data=='stop')
{
Forklift_Stop();
status=0; //Разрешаем начинать другие задания
USART_Transmit("Stopped\r\n"); //Сообщение об остановке
data=0;
}

}

void  USART_Init( void ) //Инициализация модуля  USART
{
/* Задаем скорость работы  USART  */   
UBRR0H = (F_CPU/BAUDRATE/16-1)>>8;
UBRR0L = (F_CPU/BAUDRATE/16-1);

UCSR0B=(1<<RXEN)|( 1<<TXEN); // Разрешаем прием и передачу по  USART
UCSR0B |= (1<<RXCIE);  // Разрешаем прерывания по завершению приема

UCSR0C = (1<<USBS)|(3<<UCSZ0); //Устанавливаем формат данных 8 бит данных, 2 стоп бита
}

void  USART_Byte_Transmit( unsigned char data ) //Функция отправки бита данных
{
while ( !(UCSR0A & (1<<UDRE)) ); //Ожидание опустошения буфера приема
UDR0 = data; //Начало передачи данных                
}

void USART_Transmit( char* string ) //Функция отправки строки
{
while(*string != '\0')
{
USART_Byte_Transmit(*string);
string++;
}
}


void Forklift_Get( int item ) {

;//Функция захвата груза

}
void Forklift_Release() {

;//Функция опускания груза

}
void Forklift_Stop() {

;//Остановить погрузчик

}


int main(void) //Главная  программа
{
USART_Init ();
Timer_Init();

status=0;
USART_Transmit("Ok!\r\n");//Передаем при включении
sei(); //разрешаем глобально прерывания

while(1) //вечный цикл
{
// Выполняем обработку принятого байта

while (data!=0)
{
if (data=='1')||(status==0)  // Тут произвольно написана цифра 1, т.к. пока не знаю в каком формате передается информация о движении..
{
PORTX= (подаем питание на ножку ехать прямо) в каком виде при использовании пакета move_base передается информация на МК

чтоб управлять двигателем?
}
else if (data=='2')||(status==0)
{
PORTZ =  (подаем питание на ножку повернуть влево)
}
//то же самое для "вправо"
}

while (data=nomer) //Когда приходит номер груза начинаем захват
{
Forklift_Get(data); //Взятие груза
USART_Transmit("Got it!\r\n"); //Сообщение об успешной идентификации груза
data=0;
}

while (data!=0)
{
if (data=='1')||(status==0) //Опять то же самое как и выше - едем только теперь в обратную сторону
{
PORTX= (подаем питание на ножку ехать прямо) в каком виде при использовании пакета move_base передается информация на МК

чтоб управлять двигателем?
}
else if (data=='2')||(status==0)
{
PORTZ =  (подаем питание на ножку повернуть влево)
}
}
while (data=release) //Когда приходит сообщение, что надо опустить груз
{
Forklift_Release(); //Отпускаем груз
USART_Transmit("Done!\r\n"); //Сообщение об успешной доставке груза
data=0; //Сбрасываем переменную, чтобы погрузчик не поехал по второму разу
}
}
}


Как это объединить с пакетами навигации в ROS!?
Yucca
 
Сообщения: 19
Зарегистрирован: 10 апр 2014, 14:22

Re: Как скрестить МК и ROS?

Сообщение avr123.nm.ru » 13 май 2014, 09:14

наверно словами или диаграммой лучше пояснить что надо получить.
Читайте !
Аватара пользователя
avr123.nm.ru
отсылающий читать курс
 
Сообщения: 14200
Зарегистрирован: 06 ноя 2005, 04:18
Откуда: Москва
Предупреждения: -8

Re: Как скрестить МК и ROS?

Сообщение linvinus » 13 май 2014, 09:51

Подключайтесь в эту тему forum102/topic13980.html

Для того чтобы управлять моторами стандартно используется сообщение Twist
для обратной связи используется сообщения tf и odometry
для связи между МК и ноутбуком я использую rosserial
forum102/topic13980-15.html#p298532

Вот пример как запустить rosserial на avr http://wiki.ros.org/rosserial_client/Tu ... and%20UART
R3 forum87/topic15337.html
R2 roboforum.ru/forum102/topic13980.html
R4 roboforum.ru/post336339.html#p336339
Делать надо хорошо - плохо получится само!
Аватара пользователя
linvinus
 
Сообщения: 1581
Зарегистрирован: 29 апр 2011, 12:37
Откуда: Москва
прог. языки: С

Re: Как скрестить МК и ROS?

Сообщение Yucca » 21 май 2014, 07:19

linvinus писал(а):Подключайтесь в эту тему forum102/topic13980.html

Для того чтобы управлять моторами стандартно используется сообщение Twist
для обратной связи используется сообщения tf и odometry
для связи между МК и ноутбуком я использую rosserial
forum102/topic13980-15.html#p298532

Вот пример как запустить rosserial на avr http://wiki.ros.org/rosserial_client/Tu ... and%20UART


Спасибо, более-менее разобралась, узел подписчика-издателя написала, только остались непонятными пара моментов - МК получает сообщение Twist, которое состоит из 6 значений (перемещение и поворот по трем осям?), как его преобразовать в управление мотором? Т.е. должны же выдаваться импульсы на определенные ножки МК - как это реализовать?
И второй - МК публикует сообщение одометрии - опять же, в каком формате поступает это сообщение с энкодера и как его преобразовать в формат одометрии?
Yucca
 
Сообщения: 19
Зарегистрирован: 10 апр 2014, 14:22


Вернуться в Новичкам или основы основ роботостроения.

Кто сейчас на конференции

Сейчас этот форум просматривают: alex_auto и гости: 1

Mail.ru counter