|
@@ -1,6 +1,14 @@
|
|
|
#include "ros/ros.h"
|
|
|
|
|
|
|
|
|
+#include <stdio.h>
|
|
|
+#include <stdlib.h>
|
|
|
+#include <unistd.h>
|
|
|
+#include <fcntl.h>
|
|
|
+//#include <asm/termios.h>
|
|
|
+#include <termios.h>
|
|
|
+
|
|
|
+
|
|
|
#include <QMutex>
|
|
|
#include <QSerialPort>
|
|
|
|
|
@@ -19,8 +27,8 @@ static std::string _twist_topic = "/current_velocity";
|
|
|
static std::string gstrserialportname = "/dev/ttyUSB0";
|
|
|
|
|
|
static int gnBaudRate = 230400;
|
|
|
-static double glon0 = 117;
|
|
|
-static double glat0 = 39;
|
|
|
+static double glon0 = 117.0273054;
|
|
|
+static double glat0 = 39.1238777;
|
|
|
static double ghead0 = 0;
|
|
|
|
|
|
ros::Publisher pose_pub;
|
|
@@ -90,10 +98,12 @@ Quaternion ToQuaternion(double yaw, double pitch, double roll) // yaw (Z), pitch
|
|
|
static void SerialGPSDecode()
|
|
|
{
|
|
|
int xpos = mstrHCP2.indexOf('\n');
|
|
|
- if(xpos>0)
|
|
|
+// std::cout<<" xpos : "<<xpos<<std::endl;
|
|
|
+ if(xpos>=0)
|
|
|
{
|
|
|
|
|
|
QString xsen = mstrHCP2.left(xpos+1);
|
|
|
+ // std::cout<<" decode "<<std::endl;
|
|
|
SerialGPSDecodeSen(xsen);
|
|
|
mstrHCP2.remove(0,xpos+1);
|
|
|
SerialGPSDecode();
|
|
@@ -134,6 +144,7 @@ static bool checknmeasen(const char * strsen,const unsigned int nlen)
|
|
|
}
|
|
|
|
|
|
|
|
|
+// std::cout<<" check fail. "<<std::endl;
|
|
|
// qDebug(" sen is %s",strsen);
|
|
|
return false;
|
|
|
}
|
|
@@ -292,18 +303,117 @@ void SerialGPSDecodeSen(QString strsen)
|
|
|
msg.twist.twist.linear.x = sqrt(pow(vn,2)+pow(ve,2));
|
|
|
|
|
|
geometry_msgs::PoseStamped xPose;
|
|
|
+ xPose.header.frame_id = "map";
|
|
|
xPose.pose = msg.pose.pose;
|
|
|
geometry_msgs::TwistStamped xtwist;
|
|
|
+ xtwist.header.frame_id = "map";
|
|
|
xtwist.twist = msg.twist.twist;
|
|
|
|
|
|
pose_pub.publish(xPose);
|
|
|
twist_pub.publish(xtwist);
|
|
|
|
|
|
+// std::cout<<"current pose"<<std::endl;
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+static void set_baudrate (struct termios *opt, unsigned int baudrate)
|
|
|
+{
|
|
|
+ cfsetispeed(opt, baudrate);
|
|
|
+ cfsetospeed(opt, baudrate);
|
|
|
+}
|
|
|
+
|
|
|
+static void set_data_bit (struct termios *opt, unsigned int databit)
|
|
|
+{
|
|
|
+ opt->c_cflag &= ~CSIZE;
|
|
|
+ switch (databit) {
|
|
|
+ case 8:
|
|
|
+ opt->c_cflag |= CS8;
|
|
|
+ break;
|
|
|
+ case 7:
|
|
|
+ opt->c_cflag |= CS7;
|
|
|
+ break;
|
|
|
+ case 6:
|
|
|
+ opt->c_cflag |= CS6;
|
|
|
+ break;
|
|
|
+ case 5:
|
|
|
+ opt->c_cflag |= CS5;
|
|
|
+ break;
|
|
|
+ default:
|
|
|
+ opt->c_cflag |= CS8;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+static void set_parity (struct termios *opt, char parity)
|
|
|
+{
|
|
|
+ switch (parity) {
|
|
|
+ case 'N': /* no parity check */
|
|
|
+ opt->c_cflag &= ~PARENB;
|
|
|
+ break;
|
|
|
+ case 'E': /* even */
|
|
|
+ opt->c_cflag |= PARENB;
|
|
|
+ opt->c_cflag &= ~PARODD;
|
|
|
+ break;
|
|
|
+ case 'O': /* odd */
|
|
|
+ opt->c_cflag |= PARENB;
|
|
|
+ opt->c_cflag |= ~PARODD;
|
|
|
+ break;
|
|
|
+ default: /* no parity check */
|
|
|
+ opt->c_cflag &= ~PARENB;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+static void set_stopbit (struct termios *opt, const char *stopbit)
|
|
|
+{
|
|
|
+ if (0 == strcmp (stopbit, "1")) {
|
|
|
+ opt->c_cflag &= ~CSTOPB; /* 1 stop bit */
|
|
|
+ } else if (0 == strcmp (stopbit, "1")) {
|
|
|
+ opt->c_cflag &= ~CSTOPB; /* 1.5 stop bit */
|
|
|
+ } else if (0 == strcmp (stopbit, "2")) {
|
|
|
+ opt->c_cflag |= CSTOPB; /* 2 stop bits */
|
|
|
+ } else {
|
|
|
+ opt->c_cflag &= ~CSTOPB; /* 1 stop bit */
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+//https://blog.csdn.net/morixinguan/article/details/80898172
|
|
|
+//串口设置
|
|
|
+int set_port_attr (
|
|
|
+ int fd,
|
|
|
+ int baudrate, // B1200 B2400 B4800 B9600 .. B115200
|
|
|
+ int databit, // 5, 6, 7, 8
|
|
|
+ const char *stopbit, // "1", "1.5", "2"
|
|
|
+ char parity, // N(o), O(dd), E(ven)
|
|
|
+ int vtime,
|
|
|
+ int vmin )
|
|
|
+{
|
|
|
+ struct termios opt;
|
|
|
+ tcgetattr(fd, &opt);
|
|
|
+ //设置波特率
|
|
|
+ set_baudrate(&opt, baudrate);
|
|
|
+ opt.c_cflag |= CLOCAL | CREAD; /* | CRTSCTS */
|
|
|
+ //设置数据位
|
|
|
+ set_data_bit(&opt, databit);
|
|
|
+ //设置校验位
|
|
|
+ set_parity(&opt, parity);
|
|
|
+ //设置停止位
|
|
|
+ set_stopbit(&opt, stopbit);
|
|
|
+ //其它设置
|
|
|
+ opt.c_oflag = 0;
|
|
|
+ opt.c_lflag |= 0;
|
|
|
+ opt.c_oflag &= ~OPOST;
|
|
|
+ opt.c_cc[VTIME] = vtime;
|
|
|
+ opt.c_cc[VMIN] = vmin;
|
|
|
+ tcflush (fd, TCIFLUSH);
|
|
|
+ return (tcsetattr (fd, TCSANOW, &opt));
|
|
|
}
|
|
|
|
|
|
|
|
|
void ThreadRecvRTK()
|
|
|
{
|
|
|
+ std::cout<<" enter thread "<<std::endl;
|
|
|
QSerialPort *m_serialPort_GPS;
|
|
|
m_serialPort_GPS = new QSerialPort();
|
|
|
m_serialPort_GPS->setPortName(gstrserialportname.data());
|
|
@@ -313,25 +423,54 @@ void ThreadRecvRTK()
|
|
|
m_serialPort_GPS->setStopBits(QSerialPort::OneStop);
|
|
|
m_serialPort_GPS->setFlowControl(QSerialPort::NoFlowControl);
|
|
|
m_serialPort_GPS->setReadBufferSize(0);
|
|
|
+ // m_serialPort_GPS->open(QIODevice::ReadWrite);
|
|
|
+ // m_serialPort_GPS->close();
|
|
|
+
|
|
|
+
|
|
|
+ int fd;
|
|
|
+ int len, i,ret;
|
|
|
+
|
|
|
+
|
|
|
+ fd = open(gstrserialportname.data(), O_RDWR | O_NOCTTY);
|
|
|
+ if(fd < 0) {
|
|
|
+ perror(gstrserialportname.data());
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ set_port_attr(fd,B230400,8,"1",'N',0,0);
|
|
|
+
|
|
|
|
|
|
+ char strbuf[1000];
|
|
|
+ bool bSerialPortOpen = true;
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+/*
|
|
|
bool bSerialPortOpen = false;
|
|
|
+ std::cout<<" open "<<std::endl;
|
|
|
if(m_serialPort_GPS->open(QSerialPort::ReadWrite))
|
|
|
{
|
|
|
bSerialPortOpen = true;
|
|
|
+ std::cout<<" succ "<<std::endl;
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
std::cout<<" Open Port "<<gstrserialportname<<" Fail."<<std::endl;
|
|
|
return;
|
|
|
}
|
|
|
+ */
|
|
|
|
|
|
while(bSerialPortOpen)
|
|
|
{
|
|
|
- QByteArray ba = m_serialPort_GPS->readAll();
|
|
|
+ // QByteArray ba = m_serialPort_GPS->readAll();
|
|
|
|
|
|
- if(ba.length() > 0)
|
|
|
+ len = read(fd, strbuf, 999);
|
|
|
+ if(len > 0)
|
|
|
{
|
|
|
- mstrHCP2.append(ba);
|
|
|
+ strbuf[len] = 0;
|
|
|
+ // std::cout<<strbuf<<std::endl;
|
|
|
+ // std::cout<<" ba len : "<<len<<std::endl;
|
|
|
+ mstrHCP2.append(strbuf);
|
|
|
SerialGPSDecode();
|
|
|
// mnNotRecvCount = 0;
|
|
|
//Decode
|
|
@@ -339,10 +478,12 @@ void ThreadRecvRTK()
|
|
|
else
|
|
|
{
|
|
|
std::this_thread::sleep_for(std::chrono::milliseconds(1));
|
|
|
+ // std::cout<<" no data"<<std::endl;
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+
|
|
|
int main(int argc, char *argv[])
|
|
|
{
|
|
|
ros::init(argc, argv, "pilottoros");
|