01 运行终端指令
配置远程登录
ssh-keygen -t rsa
# 然后一直回车
ssh-copy-id tx2@ip地址
# 然后输入密码
ssh tx2@ip地址
02 发布订阅自定义消息话题或服务
2.1 创建节点订阅发布话题
- 注意点:
1、频率是修改qnode
类的run
函数里的ros::Rate loop_rate(10);
,一开始我删去了while里面的东西,后面发现对于订阅视屏话题来说,需要把评率修改的大一点。
2、在QNode::init()
中声明订阅和发布话题名字,然后需要在哪里,就在哪里用话题句柄publish就好。
2.2 自定义消息或服务
对于添加自定义消息
-
CmakeList.txt
中第41行修改增加.h
文件(这样就能读取到h文件了),如下所示:file(GLOB_RECURSE QT_MOC RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} FOLLOW_SYMLINKS include/manipulator_app/*.hpp *.h)
-
然后编译,在工作空间的build里找到编译后的
.h
头文件(这个是msg
或srv
编译后得到的) -
把编译的放到
.h
文件放到include
-
然后在
qnode.hpp
中引用头文件,就可以正常使用啦#include "../myMsg/SyncSetPosition.h" #include "../mySrv/SyncGetPosition.h"
03 订阅图像并显示
3.1 总体流程:
- 这里主要的问题是订阅到的图像遇到转换为QImage才能在Qt中显示,转为QImage的函数如下所示:
QImage QNode::Mat2QImage(cv::Mat const& src) { QImage dest(src.cols, src.rows, QImage::Format_ARGB32); const float scale = 255.0; if (src.depth() == CV_8U) { if (src.channels() == 1) { for (int i = 0; i < src.rows; ++i) { for (int j = 0; j < src.cols; ++j) { int level = src.at<quint8>(i, j); dest.setPixel(j, i, qRgb(level, level, level)); } } } else if (src.channels() == 3) { for (int i = 0; i < src.rows; ++i) { for (int j = 0; j < src.cols; ++j) { cv::Vec3b bgr = src.at<cv::Vec3b>(i, j); dest.setPixel(j, i, qRgb(bgr[2], bgr[1], bgr[0])); } } } } else if (src.depth() == CV_32F) { if (src.channels() == 1) { for (int i = 0; i < src.rows; ++i) { for (int j = 0; j < src.cols; ++j) { int level = scale * src.at<float>(i, j); dest.setPixel(j, i, qRgb(level, level, level)); } } } else if (src.channels() == 3) { for (int i = 0; i < src.rows; ++i) { for (int j = 0; j < src.cols; ++j) { cv::Vec3f bgr = scale * src.at<cv::Vec3f>(i, j); dest.setPixel(j, i, qRgb(bgr[2], bgr[1], bgr[0])); } } } } return dest; }
3.2 遇到的问题及解决
- 问题:显示出来的颜色很奇怪,人的皮肤是蓝色的,像是阿凡达一样
- 解决:是转为QImage时出现了问题,互换R通道和B通道即可