Я пытаюсь создать мобильного автономного робота от аппаратного интерфейса до навигации и планирования пути. Я использую irobot create2 в настоящее время и у меня проблемы с настройкой последовательной связи для инициализации. У меня был какой-то другой код, который его инициализировал, но данные, которые он выдавал, были чепухой. Я начал с нуля, и теперь робот не включается, когда я запускаю программу.
Я действительно полон решимости создать интерфейс с помощью основных системных вызовов C с использованием termios. Я верю, что если я смогу понять эти концепции, то существует бесконечная возможность манипулирования электроникой. Я написал несколько сценариев, использующих termios, устанавливающих скорость передачи данных и заданные флаги на основе требуемых настроек последовательного порта для связи с create. Я нашел примеры, но я думаю, что мне не хватает некоторых фундаментальных понятий, которые могут быть объяснены некоторыми советами по моему коду. Я прочитал всю документацию по termios и попытался проанализировать драйвер, который уже существует для создания, но мне не удалось выяснить мою проблему при инициализации бота и отправке необходимых последовательных последовательностей.
У меня есть заголовочный файл, файл определения функции и основной файл, который можно найти здесь:
*yungBot.cpp:*
#include "yungBot.h"
#include <iostream>
int yungBot::init(const char *yungin){
fd = open(yungin, O_RDWR | O_NOCTTY | O_NDELAY);
if(fd == -1){
perror("Error, failed to connect");
}
else{
fcntl(fd,F_SETFL,0);
tcflush (fd, TCIFLUSH);
}
struct termios parameters;
int get = tcgetattr(fd, ¶meters);
if(get == -1){
perror("Error getting attributes");
}
else{
printf("%s\n", "Get attributes: success");
}
//sets input and output baud rate
cfsetispeed(¶meters,B115200);
cfsetospeed(¶meters,B115200);
// or forces values to 1; and forces all values to 0 (off);
parameters.c_iflag &= ~(IXON | IXOFF); //flow control off;
parameters.c_cflag = CS8; //8 bit character size
parameters.c_cflag &= PARENB;//no parity
//parameters.c_oflag =
//parameters.c_lflag =
parameters.c_cc[VMIN] = 1; // 1 input byte is enough to return from read()
parameters.c_cc[VTIME] = 0;// Timer off
//set attribute immediately
int set = tcsetattr(fd, TCSANOW, ¶meters);
if(set == -1){
perror("Error setting attributes \n");
}
if (fd == -1){
perror(yungin);
return 1;
}
return fd;
}
//start funtion can set mode to either safe, full, or passive
int yungBot::start(const char *mode){
if(mode=="safe"){
unsigned char command[]={128,131};
if(mode=="full"){
unsigned char command[]={128,132};
if(mode=="passive"){
unsigned char command[]={128};
if(write(fd,command, sizeof(command))==-1){
perror("error starting robot");
return -1;
}
}
}
}
return 0;
}
yungBot::yungBot(){
printf("Initializing the Yung... \n");
}
yungBot::~yungBot(){
printf("\nClosing the Yung... \n");
}
*yungBot.h:*
#ifndef yungBot_h
#define yungBot_h
#include <fcntl.h>
#include <stdio.h>
#include <unistd.h>
#include <termios.h>
#include <iostream>
#include <stdlib.h>
#include <string>
class yungBot{
public:
int init(const char *device);
int readBot();
int start(const char *mode);
yungBot();
~yungBot();
int fd;
};
#endif
*main.cpp*
#include "yungBot.h"
int main(int argc, char *argv[]){
yungBot steve0;
steve0.fd = steve0.init("/dev/ttyUSB0");
steve0.start("full");
//steve0.off();
//steve0.start();
//steve0.safeMode();
return 0;
}
Я ожидаю, что робот включится и подаст звуковой сигнал после запуска основной функции, как объяснено в irobot create2Документация. Все компилируется нормально, я не получаю сообщений об ошибках, но робот не реагирует. Спасибо за любую помощь с этим!