diff --git a/CMakeLists.txt b/CMakeLists.txt index dc04706..7fd0bbf 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -4,9 +4,7 @@ project(Air_Ground_CEC) ## Compile as C++11, supported in ROS Kinetic and newer add_compile_options(-std=c++11) -## Find catkin macros and libraries -## if COMPONENTS list like find_package(catkin REQUIRED COMPONENTS xyz) -## is used, also find other catkin packages + find_package(catkin REQUIRED COMPONENTS roscpp std_msgs @@ -15,94 +13,7 @@ find_package(catkin REQUIRED COMPONENTS image_transport ) -## System dependencies are found with CMake's conventions -# find_package(Boost REQUIRED COMPONENTS system) - - -## Uncomment this if the package has a setup.py. This macro ensures -## modules and global scripts declared therein get installedsudo sh -c 'echo "/usr/local/lib" > /etc/ld.so.conf.d/opencv.conf' -## See http://ros.org/doc/api/catkin/html/user_guide/setup_dot_py.html -# catkin_python_setup() - -################################################ -## Declare ROS messages, services and actions ## -################################################ - -## To declare and build messages, services or actions from within this -## package, follow these steps: -## * Let MSG_DEP_SET be the set of packages whose message types you use in -## your messages/services/actions (e.g. std_msgs, actionlib_msgs, ...). -## * In the file package.xml: -## * add a build_depend tag for "message_generation" -## * add a build_depend and a exec_depend tag for each package in MSG_DEP_SET -## * If MSG_DEP_SET isn't empty the following dependency has been pulled in -## but can be declared for certainty nonetheless: -## * add a exec_depend tag for "message_runtime" -## * In this file (CMakeLists.txt): -## * add "message_generation" and every package in MSG_DEP_SET to -## find_package(catkin REQUIRED COMPONENTS ...) -## * add "message_runtime" and every package in MSG_DEP_SET to -## catkin_package(CATKIN_DEPENDS ...) -## * uncomment the add_*_files sections below as needed -## and list every .msg/.srv/.action file to be processed -## * uncomment the generate_messages entry below -## * add every package in MSG_DEP_SET to generate_messages(DEPENDENCIES ...) - -## Generate messages in the 'msg' folder -# add_message_files( -# FILES -# Message1.msg -# Message2.msg -# ) - -## Generate services in the 'srv' folder -# add_service_files( -# FILES -# Service1.srv -# Service2.srv -# ) -## Generate actions in the 'action' folder -# add_action_files( -# FILES -# Action1.action -# Action2.action -# ) - -## Generate added messages and services with any dependencies listed here -# generate_messages( -# DEPENDENCIES -# std_msgs # Or other packages containing msgs -# ) - -################################################ -## Declare ROS dynamic reconfigure parameters ## -################################################ - -## To declare and build dynamic reconfigure parameters within this -## package, follow these steps: -## * In the file package.xml: -## * add a build_depend and a exec_depend tag for "dynamic_reconfigure" -## * In this file (CMakeLists.txt): -## * add "dynamic_reconfigure" to -## find_package(catkin REQUIRED COMPONENTS ...) -## * uncomment the "generate_dynamic_reconfigure_options" section below -## and list every .cfg file to be processed - -## Generate dynamic reconfigure parameters in the 'cfg' folder -# generate_dynamic_reconfigure_options( -# cfg/DynReconf1.cfg -# cfg/DynReconf2.cfg -# ) - -################################### -## catkin specific configuration ## -################################### -## The catkin_package macro generates cmake config files for your package -## Declare things to be passed to dependent projects -## INCLUDE_DIRS: uncomment this if your package contains header files -## LIBRARIES: libraries you create in this project that dependent projects also need -## CATKIN_DEPENDS: catkin_packages dependent projects also need ## DEPENDS: system dependencies of this project that dependent projects also need catkin_package( # INCLUDE_DIRS include @@ -115,7 +26,8 @@ catkin_package( ## Build ## ########### -find_package(OpenCV REQUIRED) +#set(OpenCV_DIR /usr/local/share/opencv4) +#find_package(OpenCV REQUIRED) find_package(Qt5 REQUIRED COMPONENTS Widgets ) set(CMAKE_AUTOMOC ON) set(CMAKE_AUTOUIC ON) @@ -151,87 +63,5 @@ target_link_libraries(Air_Ground_CEC ${OpenCV_LIBRARIES} ) -## Declare a C++ library -# add_library(${PROJECT_NAME} -# src/${PROJECT_NAME}/Air_Ground_CEC.cpp -# ) - -## Add cmake target dependencies of the library -## as an example, code may need to be generated before libraries -## either from message generation or dynamic reconfigure -# add_dependencies(${PROJECT_NAME} ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS}) - -## Declare a C++ executable -## With catkin_make all packages are built within a single CMake context -## The recommended prefix ensures that target names across packages don't collide -# add_executable(${PROJECT_NAME}_node src/Air_Ground_CEC_node.cpp) - -## Rename C++ executable without prefix -## The above recommended prefix causes long target names, the following renames the -## target back to the shorter version for ease of user use -## e.g. "rosrun someones_pkg node" instead of "rosrun someones_pkg someones_pkg_node" -# set_target_properties(${PROJECT_NAME}_node PROPERTIES OUTPUT_NAME node PREFIX "") - -## Add cmake target dependencies of the executable -## same as for the library above -# add_dependencies(${PROJECT_NAME}_node ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS}) - -## Specify libraries to link a library or executable target against -# target_link_libraries(${PROJECT_NAME}_node -# ${catkin_LIBRARIES} -# ) - -############# -## Install ## -############# - -# all install targets should use catkin DESTINATION variables -# See http://ros.org/doc/api/catkin/html/adv_user_guide/variables.html - -## Mark executable scripts (Python etc.) for installation -## in contrast to setup.py, you can choose the destination -# catkin_install_python(PROGRAMS -# scripts/my_python_script -# DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION} -# ) - -## Mark executables for installation -## See http://docs.ros.org/melodic/api/catkin/html/howto/format1/building_executables.html -# install(TARGETS ${PROJECT_NAME}_node -# RUNTIME DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION} -# ) - -## Mark libraries for installation -## See http://docs.ros.org/melodic/api/catkin/html/howto/format1/building_libraries.html -# install(TARGETS ${PROJECT_NAME} -# ARCHIVE DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION} -# LIBRARY DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION} -# RUNTIME DESTINATION ${CATKIN_GLOBAL_BIN_DESTINATION} -# ) - -## Mark cpp header files for installation -# install(DIRECTORY include/${PROJECT_NAME}/ -# DESTINATION ${CATKIN_PACKAGE_INCLUDE_DESTINATION} -# FILES_MATCHING PATTERN "*.h" -# PATTERN ".svn" EXCLUDE -# ) - -## Mark other files for installation (e.g. launch and bag files, etc.) -# install(FILES -# # myfile1 -# # myfile2 -# DESTINATION ${CATKIN_PACKAGE_SHARE_DESTINATION} -# ) - -############# -## Testing ## -############# -## Add gtest based cpp test target and link libraries -# catkin_add_gtest(${PROJECT_NAME}-test test/test_Air_Ground_CEC.cpp) -# if(TARGET ${PROJECT_NAME}-test) -# target_link_libraries(${PROJECT_NAME}-test ${PROJECT_NAME}) -# endif() -## Add folders to be run by python nosetests -# catkin_add_nosetests(test) diff --git a/src/include/qnode.hpp b/src/include/qnode.hpp index 9f99191..7641131 100644 --- a/src/include/qnode.hpp +++ b/src/include/qnode.hpp @@ -35,12 +35,17 @@ public: bool init(); void SubAndPubTopic(); void KeyboardMove(char key, float speed_linear, float speed_trun); + QImage image; Q_SIGNALS: void speed_x(double x); void speed_th(double th); void power(float p); + void loggingCamera();//发出设置相机图片信号 + + + private: int init_argc; char **init_argv; @@ -49,14 +54,19 @@ private: ros::Publisher cmd_pub; ros::Subscriber cmdVel_sub; ros::Subscriber power_sub; - + QStringListModel logging_model; + image_transport::Subscriber image_sub; + cv::Mat img; QString odom_topic; QString batteryState_topic; void speedCallback(const nav_msgs::Odometry::ConstPtr& msg); 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 myCallback_img(const sensor_msgs::ImageConstPtr& msg);//camera callback function + }; diff --git a/src/main/mainwindow.cpp b/src/main/mainwindow.cpp index a7c0447..8c545d4 100644 --- a/src/main/mainwindow.cpp +++ b/src/main/mainwindow.cpp @@ -277,6 +277,8 @@ void MainWindow::connections(){ connect(&qnode, SIGNAL(speed_x(double)), this, SLOT(slot_speed_x(double))); connect(&qnode, SIGNAL(speed_th(double)), this, SLOT(slot_speed_th(double))); + + QObject::connect(&qnode,SIGNAL(loggingCamera()),this,SLOT(updateLogcamera())); } @@ -322,4 +324,15 @@ void MainWindow::Slider_linear_valueChanged(int v) { ui->label_linear->setText(QString::number(v)); } - +void MainWindow::displayCamera(const QImage &image) +{ + qimage_mutex_.lock(); + qimage_ = image.copy(); + ui->label_camera->setPixmap(QPixmap::fromImage(qimage_)); + ui->label_camera->resize(ui->label_camera->pixmap()->size()); + qimage_mutex_.unlock(); +} +void MainWindow::updateLogcamera() +{ + displayCamera(qnode.image); +} diff --git a/src/main/qnode.cpp b/src/main/qnode.cpp index 0ee8df5..f29746e 100644 --- a/src/main/qnode.cpp +++ b/src/main/qnode.cpp @@ -25,6 +25,7 @@ bool QNode::init() { ros::init(init_argc,init_argv,"Air_Ground_CEC", ros::init_options::AnonymousName | ros::init_options::NoSigintHandler); SubAndPubTopic(); + //start(); return true; } @@ -36,6 +37,11 @@ void QNode::SubAndPubTopic(){ //power_sub = n.subscribe(batteryState_topic.toStdString(), 1000, // &QNode::powerCallback, this); cmd_pub = n.advertise("cmd_vel", 1); + + image_transport::ImageTransport it(n); + //chatter_subscriber = n.subscribe("chatter",1000,&QNode::myCallback,this); + image_sub = it.subscribe("camera/image",100,&QNode::myCallback_img,this); + //chatter_publisher = n.advertise("chatter1", 1000); } void QNode::KeyboardMove(char key, float speed_linear, float speed_trun){ @@ -76,3 +82,22 @@ void QNode::speedCallback(const nav_msgs::Odometry::ConstPtr& msg) emit speed_x(msg->twist.twist.linear.x); emit speed_th(msg->twist.twist.angular.z); } + + + +void QNode::myCallback_img(const sensor_msgs::ImageConstPtr &msg) +{ + try + { + cv_bridge::CvImageConstPtr cv_ptr = cv_bridge::toCvShare(msg, sensor_msgs::image_encodings::RGB8); + img = cv_ptr->image; + image = QImage(img.data,img.cols,img.rows,img.step[0],QImage::Format_RGB888);//change to QImage format + ROS_INFO("I'm setting picture in mul_t callback function!"); + std::cout<<"10"<encoding.c_str()); + } +} diff --git a/src/ui/mainwindow.hpp b/src/ui/mainwindow.hpp index 3a50f5e..bf88283 100644 --- a/src/ui/mainwindow.hpp +++ b/src/ui/mainwindow.hpp @@ -44,6 +44,8 @@ public slots: void Slider_raw_valueChanged(int v); void Slider_linear_valueChanged(int v); + void updateLogcamera();//added + void displayCamera(const QImage& image);//added private: @@ -57,6 +59,8 @@ private: void setBtnStyles(); void connections(); + QImage qimage_;//added + mutable QMutex qimage_mutex_;//added }; diff --git a/src/ui/mainwindow.ui b/src/ui/mainwindow.ui index 4ff96fa..db6802f 100644 --- a/src/ui/mainwindow.ui +++ b/src/ui/mainwindow.ui @@ -670,8 +670,8 @@ background-color: rgb(255,255,255); - 240 - 380 + 100 + 400 302 300 @@ -689,8 +689,8 @@ background-color: rgb(255,255,255); - 580 - 380 + 490 + 400 302 300 @@ -705,6 +705,41 @@ background-color: rgb(255,255,255); + + + + 50 + 10 + 541 + 368 + + + + + 0 + 0 + + + + Logging + + + + + + true + + + + + + + CameraLabel + + + + +