Compare commits

...

13 Commits

@ -33,21 +33,17 @@ set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTOUIC ON) set(CMAKE_AUTOUIC ON)
set(CMAKE_INCLUDE_CURRENT_DIR ON) set(CMAKE_INCLUDE_CURRENT_DIR ON)
set(SOURCES file(GLOB QT_FORMS RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} src/ui/*.ui)
src/include/qnode.hpp file(GLOB QT_RESOURCES RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} src/resources/*.qrc)
src/include/joystick.h file(GLOB_RECURSE QT_MOC RELATIVE ${CMAKE_CURRENT_SOURCE_DIR}
src/include/dashboard.h FOLLOW_SYMLINKS src/include/Air_Ground_CEC/*.hpp *.h)
src/main/main.cpp file(GLOB_RECURSE QT_SOURCES RELATIVE ${CMAKE_CURRENT_SOURCE_DIR}
src/main/mainwindow.cpp FOLLOW_SYMLINKS src/*.cpp)
src/main/qnode.cpp
src/main/joystick.cpp
src/main/dashboard.cpp
src/ui/mainwindow.hpp
src/ui/mainwindow.ui
) QT5_ADD_RESOURCES(QT_RESOURCES_CPP ${QT_RESOURCES})
QT5_WRAP_UI(QT_FORMS_HPP ${QT_FORMS})
QT5_WRAP_CPP(QT_MOC_HPP ${QT_MOC})
QT5_add_resources(qrc_Files src/resources/images.qrc)
## Specify additional locations of header files ## Specify additional locations of header files
## Your package locations should be listed before other locations ## Your package locations should be listed before other locations
include_directories( include_directories(
@ -56,7 +52,9 @@ include_directories(
${OpenCV_INCLUDE_DIRS} ${OpenCV_INCLUDE_DIRS}
) )
add_executable(Air_Ground_CEC ${SOURCES} ${qrc_Files}) add_executable(Air_Ground_CEC ${QRC_FILES} ${QT_SOURCES}
${QT_RESOURCES_CPP} ${QT_FORMS_HPP} ${QT_MOC_HPP})
target_link_libraries(Air_Ground_CEC target_link_libraries(Air_Ground_CEC
Qt5::Widgets Qt5::Widgets
${catkin_LIBRARIES} ${catkin_LIBRARIES}

Binary file not shown.

@ -1,21 +0,0 @@
obj = Djitellowhite.o keyboard.cpp Triplet.cpp
CXXFLAGS += -c -Wall $(shell pkg-config --cflags opencv4)
LDFLAGS += $(shell pkg-config --libs --static opencv4)
test : $(obj)
$(CXX) -o test $(obj) $(LDFLAGS)
Djitellowhite.o : Djitellowhite.h
$(CXX) -c Djitellowhite.cpp $(CXXFLAGS)
keyboard.o : Hardwarelistener.h
$(CXX) -c keyboard.cpp $(CXXFLAGS)
Triplet : Djitellowhite.h Hardwarelistener.h
$(CXX) -c Triplet.cpp -lpthread $(CXXFLAGS)
.PHONY : clean
clean :
rm test $(obj)

Binary file not shown.

@ -0,0 +1,32 @@
#ifndef LOGIN_H
#define LOGIN_H
#include <QMainWindow>
#include "ui_login.h"
namespace Ui {
class Login;
}
class Login : public QMainWindow
{
Q_OBJECT
public:
explicit Login(QWidget *parent = nullptr);
~Login();
private:
Ui::Login *ui;
bool isPressedWidget;
QPoint m_lastPos;
void initWindow();
void mousePressEvent(QMouseEvent *event);
void mouseMoveEvent(QMouseEvent *event);
void mouseReleaseEvent(QMouseEvent *event);
void setWindowState();
void setBtnAndLabelState();
};
#endif // LOGIN_H

@ -6,9 +6,10 @@
#include <QMutex> #include <QMutex>
#include <QTimer> #include <QTimer>
#include "ui_mainwindow.h" #include "ui_mainwindow.h"
#include "../include/joystick.h"
#include "../include/qnode.hpp" #include "joystick.h"
#include "../include/dashboard.h" #include "qnode.hpp"
#include "dashboard.h"
#include <sensor_msgs/BatteryState.h> #include <sensor_msgs/BatteryState.h>
using namespace cv; using namespace cv;
@ -47,7 +48,7 @@ public slots:
void Slider_raw_valueChanged(int v); void Slider_raw_valueChanged(int v);
void Slider_linear_valueChanged(int v); void Slider_linear_valueChanged(int v);
void importFrame();//read video void importFrame();//read video
void slot_show_image(QImage image);//added void slot_show_image(const QImage& image);//added
private slots: private slots:

@ -75,7 +75,7 @@ private:
void powerCallback(const std_msgs::Float32& message_holder); void powerCallback(const std_msgs::Float32& message_holder);
//void myCallback(const std_msgs::Float64& message_holder); //void myCallback(const std_msgs::Float64& message_holder);
void batteryCallback(const sensor_msgs::BatteryState &message); void batteryCallback(const sensor_msgs::BatteryState &message);
void imageCallback(const sensor_msgs::CompressedImageConstPtr &msg);//camera callback function void imageCallback(const sensor_msgs::ImageConstPtr &msg);//camera callback function
QImage Mat2QImage(cv::Mat const &src); QImage Mat2QImage(cv::Mat const &src);
cv::Mat QImage2Mat(QImage &image); cv::Mat QImage2Mat(QImage &image);

@ -1,6 +0,0 @@
#include "automove.h"
AutoMove::AutoMove()
{
}

@ -0,0 +1,6 @@
#include "../include/Air_Ground_CEC/automove.h"
AutoMove::AutoMove()
{
}

@ -1,4 +1,4 @@
#include "../include/dashboard.h" #include "../include/Air_Ground_CEC/dashboard.h"
#include <qapplication.h> #include <qapplication.h>
#include <qpainter.h> #include <qpainter.h>

@ -1,4 +1,4 @@
#include "../include/joystick.h" #include "../include/Air_Ground_CEC/joystick.h"
#include <QDebug> #include <QDebug>
JoyStick::JoyStick(QWidget* parent) : QWidget(parent) { JoyStick::JoyStick(QWidget* parent) : QWidget(parent) {

@ -0,0 +1,69 @@
#include "../include/Air_Ground_CEC/login.h"
#include <QMovie>
#include <QWidget>
#include <QMouseEvent>
Login::Login(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::Login)
{
ui->setupUi(this);
initWindow();
}
Login::~Login()
{
delete ui;
}
void Login::initWindow(){
setWindowState();
setBtnAndLabelState();
}
void Login::setWindowState(){
this->setAttribute(Qt::WA_TranslucentBackground);
this->setWindowFlags(Qt::FramelessWindowHint);//隐藏边框
}
void Login::setBtnAndLabelState(){
QMovie* movie = new QMovie("://images/background.gif");
ui->label_video->setMovie(movie);
movie->start();
ui->btnWinMin->setIcon(QIcon("://images/min.png"));
ui->btnWinMin_2->setIcon(QIcon("://images/min.png"));
ui->btnWinClose->setIcon(QIcon("://images/close.png"));
ui->btnWinClose_2->setIcon(QIcon("://images/close.png"));
connect(ui->btnWinMin, &QPushButton::clicked, this,
[=]() { this->showMinimized(); });
connect(ui->btnWinMin_2, &QPushButton::clicked, this,
[=]() { this->showMinimized(); });
connect(ui->btnWinClose, &QPushButton::clicked, this, [=]() { this->close(); });
connect(ui->btnWinClose_2, &QPushButton::clicked, this, [=]() { this->close(); });
}
void Login::mousePressEvent(QMouseEvent *event) {
m_lastPos = event->globalPos();
isPressedWidget = true; // 当前鼠标按下的即是QWidget而非界面上布局的其它控件
}
void Login::mouseMoveEvent(QMouseEvent *event) {
if (isPressedWidget) {
this->move(this->x() + (event->globalX() - m_lastPos.x()),
this->y() + (event->globalY() - m_lastPos.y()));
m_lastPos = event->globalPos();
}
}
void Login::mouseReleaseEvent(QMouseEvent *event) {
// 其实这里的mouseReleaseEvent函数可以不用重写
m_lastPos = event->globalPos();
isPressedWidget = false; // 鼠标松开时置为false
}

@ -1,5 +1,5 @@
#include "../include/Air_Ground_CEC/mainwindow.hpp"
#include "../ui/mainwindow.hpp" #include "../include/Air_Ground_CEC/login.h"
#include <QApplication> #include <QApplication>
@ -12,9 +12,11 @@ int main(int argc, char** argv)
QApplication app(argc, argv); QApplication app(argc, argv);
MainWindow CEC(0,0,0);
CEC.show(); //MainWindow CEC(0,0,0);
//CEC.show();
Login a(0);
a.show();
return app.exec(); return app.exec();
return(0); return(0);
@ -25,5 +27,5 @@ int main(int argc, char** argv)
/* /*
* find . "(" -name "*.cpp" -or -name "*.h" -or -name "*.hpp" -or -name "*.qrc" ")" -print | xargs wc -l * find . "(" -name "*.cpp" -or -name "*.h" -or -name "*.hpp" -or -name "*.qrc" ")" -print | xargs wc -l
* rosrun rqt_graph rqt_graph * rosrun rqt_graph rqt_graph
* * git fame
*/ */

@ -1,5 +1,5 @@
#include "../ui/mainwindow.hpp" #include "../include/Air_Ground_CEC/mainwindow.hpp"
#include <QtConcurrent/QtConcurrent>
MainWindow::MainWindow(int argc, char **argv, QWidget *parent) : MainWindow::MainWindow(int argc, char **argv, QWidget *parent) :
@ -7,7 +7,11 @@ MainWindow::MainWindow(int argc, char **argv, QWidget *parent) :
ui(new Ui::MainWindow) ui(new Ui::MainWindow)
{ {
QtConcurrent::run([=](){
qnode.init(); qnode.init();
});
ui->setupUi(this); ui->setupUi(this);
initUis(); initUis();
timer = new QTimer(this); timer = new QTimer(this);
@ -241,13 +245,13 @@ void MainWindow::Slider_linear_valueChanged(int v) {
ui->label_linear->setText(QString::number(v)); ui->label_linear->setText(QString::number(v));
} }
void MainWindow::slot_show_image(QImage image) void MainWindow::slot_show_image(const QImage& image)
{ {
qimage_mutex_.lock(); //qimage_mutex_.lock();
qimage_ = image.copy(); //qimage_ = image.copy();
ui->label_camera->setPixmap(QPixmap::fromImage(qimage_)); ui->label_camera->setPixmap(QPixmap::fromImage(image));
ui->label_camera->resize(ui->label_camera->pixmap()->size()); ui->label_camera->resize(ui->label_camera->pixmap()->size());
qimage_mutex_.unlock(); //qimage_mutex_.unlock();
} }

@ -1,11 +1,11 @@
#include "../include/qnode.hpp" #include "../include/Air_Ground_CEC/qnode.hpp"
#include "sensor_msgs/image_encodings.h" #include "sensor_msgs/image_encodings.h"
#include <QtConcurrent/QtConcurrent>
QNode::QNode(int argc, char **argv) : init_argc(argc), init_argv(argv){ QNode::QNode(int argc, char **argv) : init_argc(argc), init_argv(argv){
} }
@ -25,8 +25,11 @@ bool QNode::init() {
qRegisterMetaType<sensor_msgs::BatteryState>("sensor_msgs::BatteryState"); qRegisterMetaType<sensor_msgs::BatteryState>("sensor_msgs::BatteryState");
ros::init(init_argc,init_argv,"Air_Ground_CEC", ros::init(init_argc,init_argv,"Air_Ground_CEC",
ros::init_options::AnonymousName | ros::init_options::NoSigintHandler); ros::init_options::AnonymousName | ros::init_options::NoSigintHandler);
QtConcurrent::run([=](){
SubAndPubTopic(); SubAndPubTopic();
//start(); });
return true; return true;
} }
@ -44,12 +47,13 @@ void QNode::SubAndPubTopic(){
&QNode::batteryCallback, this); &QNode::batteryCallback, this);
image_transport::ImageTransport it(n); image_transport::ImageTransport it(n);
image_sub0 = n.subscribe("camera/rgb/image_raw",100,&QNode::imageCallback,this); image_sub = it.subscribe("camera/rgb/image_raw", 100, &QNode::imageCallback, this);
//image_sub0 = n.subscribe("camera/rgb/image_raw",100,&QNode::imageCallback,this)
//chatter_publisher = n.advertise<std_msgs::String>("chatter1", 1000); //chatter_publisher = n.advertise<std_msgs::String>("chatter1", 1000);
//chatter_subscriber = n.subscribe("chatter",1000,&QNode::myCallback,this); //chatter_subscriber = n.subscribe("chatter",1000,&QNode::myCallback,this);
ros::spin();
} }
void QNode::batteryCallback(const sensor_msgs::BatteryState& message) { void QNode::batteryCallback(const sensor_msgs::BatteryState& message) {
@ -86,7 +90,7 @@ void QNode::KeyboardMove(char key, float speed_linear, float speed_trun){
cmd_pub.publish(twist); cmd_pub.publish(twist);
ros::spinOnce(); //ros::spinOnce();
} }
void QNode::AutoMove(float speed_linear, float speed_turn, void QNode::AutoMove(float speed_linear, float speed_turn,
@ -161,35 +165,34 @@ void QNode::AutoMove(float speed_linear, float speed_turn,
ros::spinOnce(); ros::spinOnce();
} }
int i =0;
//速度回调函数 //速度回调函数
void QNode::speedCallback(const nav_msgs::Odometry::ConstPtr& msg) void QNode::speedCallback(const nav_msgs::Odometry::ConstPtr& msg)
{ {
std::cout<<i++<<endl;
ROS_INFO("i am ok");
emit speed_x(msg->twist.twist.linear.x); emit speed_x(msg->twist.twist.linear.x);
emit speed_th(msg->twist.twist.angular.z); emit speed_th(msg->twist.twist.angular.z);
} }
void QNode::imageCallback(const sensor_msgs::CompressedImageConstPtr &msg) void QNode::imageCallback(const sensor_msgs::ImageConstPtr &msg)
{ {
ROS_INFO("I'm setting picture in mul_t callback function!"); try
cv_bridge::CvImagePtr cv_ptr; {
cv_bridge::CvImageConstPtr cv_ptr =
try { cv_bridge::toCvShare(msg, sensor_msgs::image_encodings::RGB8);
//深拷贝转换为opencv类型 cv::Mat img = cv_ptr->image;
cv_bridge::CvImagePtr cv_ptr_compressed = QImage image = QImage(img.data,img.cols,img.rows,img.step[0],QImage::Format_RGB888);//change to QImage format
cv_bridge::toCvCopy(msg, sensor_msgs::image_encodings::BGR8); //ROS_INFO("I'm setting picture in mul_t callback function!");
QImage im = Mat2QImage(cv_ptr_compressed->image); //image.save("/home/jackyma/test.jpg");
emit show_image(im); emit show_image(image);
} catch (cv_bridge::Exception& e) { }
//log(Error, ("video frame0 exception: " + QString(e.what())).toStdString()); catch (cv_bridge::Exception& e)
return; {
ROS_ERROR("Could not convert from '%s' to 'bgr8'.", msg->encoding.c_str());
} }
ros::spin();
} }

@ -16,5 +16,10 @@
<file>images/up_left_2.png</file> <file>images/up_left_2.png</file>
<file>images/up_right.png</file> <file>images/up_right.png</file>
<file>images/up_right_2.png</file> <file>images/up_right_2.png</file>
<file>images/close.png</file>
<file>images/min.png</file>
<file>images/power.png</file>
<file>images/power-v.png</file>
<file>images/background.gif</file>
</qresource> </qresource>
</RCC> </RCC>

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 321 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 234 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 553 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 272 B

@ -1,73 +0,0 @@
# This file is used to ignore files which are generated
# ----------------------------------------------------------------------------
*~
*.autosave
*.a
*.core
*.moc
*.o
*.obj
*.orig
*.rej
*.so
*.so.*
*_pch.h.cpp
*_resource.rc
*.qm
.#*
*.*#
core
!core/
tags
.DS_Store
.directory
*.debug
Makefile*
*.prl
*.app
moc_*.cpp
ui_*.h
qrc_*.cpp
Thumbs.db
*.res
*.rc
/.qmake.cache
/.qmake.stash
# qtcreator generated files
*.pro.user*
# xemacs temporary files
*.flc
# Vim temporary files
.*.swp
# Visual Studio generated files
*.ib_pdb_index
*.idb
*.ilk
*.pdb
*.sln
*.suo
*.vcproj
*vcproj.*.*.user
*.ncb
*.sdf
*.opensdf
*.vcxproj
*vcxproj.*
# MinGW generated files
*.Debug
*.Release
# Python byte code
*.pyc
# Binaries
# --------
*.dll
*.exe

@ -1,38 +0,0 @@
QT += core gui
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
CONFIG += c++11
# The following define makes your compiler emit warnings if you use
# any Qt feature that has been marked deprecated (the exact warnings
# depend on your compiler). Please consult the documentation of the
# deprecated API in order to know how to port your code away from it.
DEFINES += QT_DEPRECATED_WARNINGS
# You can also make your code fail to compile if it uses deprecated APIs.
# In order to do so, uncomment the following line.
# You can also select to disable deprecated APIs only up to a certain version of Qt.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0
SOURCES += \
main.cpp \
mainwindow.cpp
HEADERS += \
mainwindow.h
FORMS += \
mainwindow.ui
# Default rules for deployment.
qnx: target.path = /tmp/$${TARGET}/bin
else: unix:!android: target.path = /opt/$${TARGET}/bin
!isEmpty(target.path): INSTALLS += target
INCLUDEPATH += /usr/local/include \
/usr/local/include/opencv2 \
/usr/local/include/opencv4
LIBS += /usr/local/lib/libopencv_world.so

@ -1,11 +0,0 @@
#include "mainwindow.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w;
w.show();
return a.exec();
}

@ -1,51 +0,0 @@
#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
timer = new QTimer(this);
connect(timer, SIGNAL(timeout()), this, SLOT(importFrame()));
//InitVideo();
}
void MainWindow::importFrame()
{
capture >> frame;
cvtColor(frame, frame, CV_BGR2RGB);
QImage srcQImage = QImage((uchar*)(frame.data), frame.cols, frame.rows, QImage::Format_RGB888);
ui->label->setPixmap(QPixmap::fromImage(srcQImage));
ui->label->resize(srcQImage.size());
ui->label->show();
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::on_PLAY_clicked()
{
capture.open("udp://@0.0.0.0:11111");
timer->start(30);
}
void MainWindow::on_CLOSE_clicked()
{
timer->stop();
capture.release();
}

@ -1,47 +0,0 @@
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QtWidgets/QMainWindow>
#include <QTimer>
#include "opencv2/opencv.hpp"
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/imgproc/types_c.h>
#include <opencv2/highgui.hpp>
#include <opencv2/video.hpp>
using namespace std;
using namespace cv;
QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();
VideoCapture cap;
void InitVideo();
private slots:
void importFrame();//read video
void on_PLAY_clicked();//start video
void on_CLOSE_clicked();//finish video
private:
Ui::MainWindow *ui;
VideoCapture capture;
QTimer *timer;
Mat frame;
bool isCamerea = 0;
};
#endif // MAINWINDOW_H

@ -1,71 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>MainWindow</class>
<widget class="QMainWindow" name="MainWindow">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>1280</width>
<height>768</height>
</rect>
</property>
<property name="windowTitle">
<string>MainWindow</string>
</property>
<widget class="QWidget" name="centralwidget">
<widget class="QPushButton" name="CLOSE">
<property name="geometry">
<rect>
<x>1100</x>
<y>440</y>
<width>80</width>
<height>25</height>
</rect>
</property>
<property name="text">
<string>CLOSE</string>
</property>
</widget>
<widget class="QPushButton" name="PLAY">
<property name="geometry">
<rect>
<x>1100</x>
<y>250</y>
<width>80</width>
<height>25</height>
</rect>
</property>
<property name="text">
<string>PLAY</string>
</property>
</widget>
<widget class="QLabel" name="label">
<property name="geometry">
<rect>
<x>50</x>
<y>30</y>
<width>731</width>
<height>461</height>
</rect>
</property>
<property name="text">
<string/>
</property>
</widget>
</widget>
<widget class="QMenuBar" name="menubar">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>1280</width>
<height>22</height>
</rect>
</property>
</widget>
<widget class="QStatusBar" name="statusbar"/>
</widget>
<resources/>
<connections/>
</ui>

File diff suppressed because it is too large Load Diff

@ -203,7 +203,7 @@ margin:0px 0px 0px 0px;
<item row="0" column="0"> <item row="0" column="0">
<widget class="QStackedWidget" name="stackedWidget_main"> <widget class="QStackedWidget" name="stackedWidget_main">
<property name="currentIndex"> <property name="currentIndex">
<number>1</number> <number>2</number>
</property> </property>
<widget class="QWidget" name="mainWidget"> <widget class="QWidget" name="mainWidget">
<widget class="QLabel" name="label_2"> <widget class="QLabel" name="label_2">

Loading…
Cancel
Save