服务端

GitHub - mouming233/qt

切记,进行通信的时候不要使用clash,不要打开系统代理

出现的问题:

当按下按键时,ui界面立马闪退

输入端口号无法进行连接

出现的问题https://www.bilibili.com/video/BV1LB4y1F7P7?t=87.8&p=13

此处为语雀卡片,点击链接查看

QT的ui界面按钮点不了、不更新、无响应的可能原因_qt设计点不了_你洪哥的博客-CSDN博客

QT小记:QT程序异常结束的可能原因_吻等离子的博客-CSDN博客

QT程序异常结束问题分析_泱生的博客-CSDN博客

原因:指针未初始化,导致内存泄漏,这个问题很常见,需要重视

解决办法:提前初始化

此处为语雀卡片,点击链接查看

ip地址问题使用127.0.0.1可以但是选择本机ip地址不行

计算机原理—127.0.0.1是什么_lipviolet的博客-CSDN博客

客户端

初步思路

目前已经了初步的思路,打算在一周内实现思路,完成ui界面的设计

最开始我有一个疑惑,是选择多客户端还是多线程,考虑到可能不止两个小车需要将识别到的视频进行回传(其实就我们识别的量,我觉得多线程和多客户端没区别),

所以选择多客户端,服务器多线程

客户端1

这个客户端需要实现订阅小车摄像头发布的视频,并且订阅到马飞扬进行视觉处理完的视频,然后客户端进行视频的转码以及传输

分别订阅到小车的视频,将ros格式使用cv——bridge转换成opencv的格式,然后将格式转换成能够通过tcp/ip通信的格式,传送给windows的上位机,

客户端2

考虑使用多线程

使用此客户端接受map地图,格式转换

(后期可能会加上小车的位置坐标,以及转向),

服务端

考虑使用多线程

我们应该实现在windows上的服务器能够展示两个小车的识别到的经过视觉定位处理过的视频

同时应该将地图实时展现出来

主线程:

  1. 主线程是服务器程序的主要线程,负责监听客户端连接请求并分配连接给其他线程处理。

接受线程1

接受地图和视频

模仿去年的思路,指定自己的通信协议,利用数据头进行分别

将地图进行格式转换,将视频格式转换,并将其导入主线程中进行展示

首先在ubuntu上配置python环境,编写客户端

基于tcp/ip协议,

订阅之后

python网络编程

Python编程——sys模块的使用详解(附实例)_python中调用sys模块时显示sys未定义_橘子女侠的博客-CSDN博客

Python编程——sys模块的使用详解(附实例)_使用sys.stdin已经导入sys为啥还显示sys.stdin是无效的语法_橘子女侠的博客-CSDN博客

os库

当你在 Python 中编写代码时,你可以使用 os 模块来访问操作系统的功能,例如管理文件和目录,执行命令和处理文件路径等。这个模块提供了许多操作系统相关的功能,包括文件系统操作,进程管理等等。

下面是 os 模块的一些常用函数:

  1. os.name:返回当前操作系统的名称,例如 Windows、Linux 或者 Mac OS。
  2. os.getcwd():返回当前工作目录的路径。
  3. os.chdir(path):改变当前工作目录为 path
  4. os.listdir(path):返回一个列表,其中包含给定路径下的所有文件和目录的名称。
  5. os.mkdir(path):创建一个新目录。
  6. os.makedirs(path):递归地创建目录,包括必要的父目录。
  7. os.rmdir(path):删除一个目录,只能删除空目录。
  8. os.removedirs(path):递归地删除目录,包括所有子目录和文件。
  9. os.rename(src, dst):重命名文件或目录。
  10. os.remove(path):删除指定路径的文件。
  11. os.path.exists(path):如果给定路径存在,返回 True,否则返回 False。
  12. os.path.isfile(path):如果给定路径是一个文件,返回 True,否则返回 False。
  13. os.path.isdir(path):如果给定路径是一个目录,返回 True,否则返回 False。
  14. os.path.join(path1[, path2[, …]]):将多个路径组合成一个路径字符串。
  15. os.path.abspath(path):返回指定路径的绝对路径。
  16. os.path.basename(path):返回指定路径中的文件名部分。
  17. os.path.dirname(path):返回指定路径中的目录部分。
  18. os.path.splitext(path):返回指定路径中的文件扩展名和文件名部分的元组。

除了上面列举的函数之外,os 模块还提供了许多其他功能,例如文件和目录的权限设置、进程管理等等。总的来说,os 模块是一个非常有用的模块,可以让你更好地管理操作系统相关的功能。

将图片从ros转换成opencv的格式

在ROS中,图像通常以ROS的Image消息格式进行传输和处理。要将ROS图像消息转换为OpenCV格式,可以使用cv_bridge库,它可以方便地进行ROS图像消息和OpenCV图像格式之间的转换。

以下是一个示例Python代码,演示如何将ROS Image消息转换为OpenCV图像格式:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
import cv2
import rospy
from sensor_msgs.msg import Image
from cv_bridge import CvBridge

def image_callback(msg):
# 初始化CvBridge
bridge = CvBridge()
# 将ROS图像消息转换为OpenCV图像格式
cv_image = bridge.imgmsg_to_cv2(msg, desired_encoding="passthrough")
# 进行OpenCV图像处理
cv_image = cv2.cvtColor(cv_image, cv2.COLOR_BGR2GRAY)
# 显示图像
cv2.imshow("Image window", cv_image)
cv2.waitKey(3)

def main():
# 初始化ROS节点
rospy.init_node('image_converter', anonymous=True)
# 订阅图像消息
rospy.Subscriber("/camera/image_raw", Image, image_callback)
# 循环等待回调函数
rospy.spin()
# 关闭窗口
cv2.destroyAllWindows()

if __name__ == '__main__':
main()

python-socket

资料汇总

python socket函数中,send 与sendall的区别与使用方法_socket.sendall_无灵的博客-CSDN博客

python struct.unpack和struct.pack详解_eliforsharon的博客-CSDN博客

理解字节序 大端字节序和小端字节序_一颗橙子居然的博客-CSDN博客

python socket.socket()函数 套接字详解及TCP、UDP程序示例(粘包等)_Dontla的博客-CSDN博客

Pycharm打开时一直加载中?现在就给你解决方法 ~_pycharm卡在启动界面_十九1919的博客-CSDN博客

为什么你的pycharm打开时很卡,今天来教你解决方案_pycharm卡顿_Python编程开发的博客-CSDN博客

imencode
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
def imencode(ext, img, params=None): # real signature unknown; restored from __doc__
"""
imencode(ext, img[, params]) -> retval, buf
. @brief Encodes an image into a memory buffer.
将图像编码到内存缓冲区中。
.
. The function imencode compresses the image and stores it in the memory buffer that is resized to fit the
. result. See cv::imwrite for the list of supported formats and flags description.
imencode函数压缩图像并将其存储在已调整大小以适合结果的内存缓冲区中。
有关支持的格式和标志说明的列表,请参见cv :: imwrite。
.
. @param ext File extension that defines the output format.
定义输出格式的文件扩展名。
. @param img Image to be written.
要写入的图像。
. @param buf Output buffer resized to fit the compressed image.
调整输出缓冲区的大小以适合压缩图像。
. @param params Format-specific parameters. See cv::imwrite and cv::ImwriteFlags.
特定于格式的参数。 参见cv :: imwrite和cv :: ImwriteFlags。
"""
pass

struck.pack

struct — Interpret bytes as packed binary data

img_size = struct.unpack(‘!i’, data)[0]

struct.unpack() 是Python内置模块struct提供的函数,用于将一个字节流解析为Python对象。在这里,我们使用它来将接收到的4个字节数据解析为一个整数值。

struct.unpack()函数中,第一个参数‘!i’指定了解析数据的格式,其中‘!’表示使用网络字节序(即大端字节序),‘i’表示解析出来的值的类型为整型。因为客户端发送的数据使用的是网络字节序,所以在服务端接收时需要使用相同的字节序。因此,我们在这里使用大端字节序。

struct.unpack()函数的返回值是一个元组,其中包含了按指定格式解析出来的所有值。在这里,我们只需要一个整数值,因此使用索引[0]取出第一个元素。

问题

什么都可以问chatgpt

他真的什么都会

缺少rospkg

黑屏

安装anaconda的时候出现conda无法识别的情况

Ubuntu18.04安装Anaconda(最新最全亲测图文并茂)_ubuntu18.04 anaconda_向日葵骑士Faraday的博客-CSDN博客

ros安装依赖报错

如果按照以往的教学可能会出现找不到 ackermann-steering-msgs 的情况

其实,它叫 ackermann_msgs

官网没有ackermann-steering-msgs

小车显示为白色

For frame [xxx]: Fixed Frame [map] does not exist_fixed frame里只有map_不知语冰的博客-CSDN博客

无法定位程序输入点

无法定位程序输入点的一种可能_assjaa的博客-CSDN博客

ubuntu unexpected inconsistency;runfsck manually黑屏

黑屏遇到各种命令行不要怕

ubuntu unexpected inconsistency;runfsck manually解决办法_写代码的小姜的博客-CSDN博客

Inotify监视限值不足问题_zhongwcool的博客-CSDN博客

修改pycharm使用内存

修改内存建议直接1g-4g

PyCharm2021-2022版本如何修改配置内存大小?解决PyCharm内存卡死的问题(保姆级图文并茂)_pycharm内存设置多少合适_发现你走远了的博客-CSDN博客

Pycharm打开时一直加载中?解决办法来了~_pycharm正在等待进程分离_蚂蚁爱Python的博客-CSDN博客

当你的虚拟机中的pycharm进行预加载的时候的,总是卡顿,死机,重启的时候,如果看到了这篇文章,对你的问题有所帮助,记得点个赞,被这个bug折腾了好几个小时,阵地难受

胡思乱想

我可以调整输入的端口号,然后开启不同的线程,用来给不同的车打开摄像头

(还是去年的办法)

思考如何让python回传给qt信息,比如发送一个摄像头已连接的信息

现在的问题是小车可以传图,但是一给小车发送信息就会断连

阶段性成果

windows到windows建立通信

一台主机上不同端口号互相传输数据(3月7号完成)

此处为语雀卡片,点击链接查看

qt.rar

10、TCP客户端_哔哩哔哩_bilibili

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#ifndef SERVER_H
#define SERVER_H
#include<QTcpSocket>
#include<QHostAddress>
#include <QWidget>
#include<QTcpServer>
namespace Ui {
class Server;
}

class Server : public QWidget
{
Q_OBJECT

public:
explicit Server(QWidget *parent = 0);
~Server();

private:
Ui::Server *ui;
QTcpServer * server;//监听的套接字
QTcpSocket * conn;//通信的套接字
};

#endif // SERVER_H

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
#include "client.h"
#include "ui_client.h"
#include<QTcpSocket>
#include<QHostAddress>
Client::Client(QWidget *parent) :
QWidget(parent),
ui(new Ui::Client)
{
ui->setupUi(this);
//ui init
ui->sIP->setText("10.236.112.215");

ui->sPort->setText("10300");

//init

client=new QTcpSocket(this);

//连接服务器
client->connectToHost(QHostAddress(ui->sIP->text()),ui->sPort->text().toInt());

//接收数据
connect(client,&QTcpSocket::readyRead,this,[=]{

QByteArray array =client->readAll();

ui->record->append(array);
});


connect(ui->send,&QPushButton::clicked,this,[=]{
client->write(ui->msg->toPlainText().toUtf8());

ui->record->append("Me Say:"+ui->msg->toPlainText());

});
}

Client::~Client()
{
delete ui;
}

两台主机间进行通信

此处为语雀卡片,点击链接查看

windows到ubuntu建立通信

windows到ubuntu(其实啥也不用改,只用在ubuntu上添加一个wine包

如何在 Linux 中运行.exe 程序_linux运行exe_叶之道的博客-CSDN博客

直接sudo apt intall wine就可以,那个stable版本我的报错了

此处为语雀卡片,点击链接查看

奇思妙想

打算用一个服务端,采用多端口号的视频传输方式,总共四个端口号,三个小车视频,一个地图传输;同时打算在ui中显示本机ip地址,用于python程序客户端的连接。

记录一下如何多个客户端同时发消息,来连接