远程控制软件优化(1)

远程控制软件优化(1)

在这里插入图片描述

第一版存在以下缺点:

1、四大部分中 Robot States 部分过于简陋,不适合放到论文中

2、Lidar BEV 图像显示效果非常差,显示不全且很稀疏

3、视频流传输延时过高,无法实现远程控制

以上 3 个问题其实都挺棘手的,视频流传输延时的问题已经基本解决

软件界面优化

优化后的界面如下

在这里插入图片描述

不再显示状态信息,转而显示控制信息

1、对界面的布局进行了多次优化调整,整体显得简洁美观

2、设计转向模式的显示,在对应的转向模式下字体会变红,同时图标(Icon)会闪

void MainWindow::showMode0(const QString &mode0)
	{
		ui.front_steer->setVisible(true);
		ui.four_steer->setVisible(true);
		ui.pivot_steer->setVisible(!ui.pivot_steer->isVisible());

		ui.front_label->setStyleSheet("color:black;");
		ui.four_label->setStyleSheet("color:black;");
		ui.pivot_label->setStyleSheet("color:red;");
	}

	void MainWindow::showMode1(const QString &mode1)
	{
		ui.front_steer->setVisible(!ui.front_steer->isVisible());
		ui.four_steer->setVisible(true);
		ui.pivot_steer->setVisible(true);

		ui.front_label->setStyleSheet("color:red;");
		ui.four_label->setStyleSheet("color:black;");
		ui.pivot_label->setStyleSheet("color:black;");
	}

	void MainWindow::showMode2(const QString &mode2)
	{
		ui.front_steer->setVisible(true);
		ui.four_steer->setVisible(!ui.four_steer->isVisible());
		ui.pivot_steer->setVisible(true);

		ui.front_label->setStyleSheet("color:black;");
		ui.four_label->setStyleSheet("color:red;");
		ui.pivot_label->setStyleSheet("color:black;");
	}

3、速度控制通过仪表盘显示,更加直观

仪表盘这部分的实现还是比较有难度的,通过自定义控件实现

#ifndef GAUGEARC_H
#define GAUGEARC_H

/**
 * 圆弧仪表盘控件 作者:feiyangqingyun
 * 1:可设置范围值,支持负数值
 * 2:可设置精确度,最大支持小数点后3位
 * 3:可设置大刻度数量/小刻度数量
 * 4:可设置开始旋转角度/结束旋转角度
 * 5:可设置是否启用动画效果以及动画效果每次移动的步长
 * 6:可设置外圆背景/内圆背景/饼圆三种颜色/刻度尺颜色/文字颜色
 * 7:自适应窗体拉伸,刻度尺和文字自动缩放
 * 8:可自由拓展各种渐变色,各圆的半径
 * 9:指示器样式可选择 圆形指示器 指针指示器 圆角指针指示器 三角形指示器
 */

#include <QWidget>

class GaugeArc : public QWidget
{
	Q_OBJECT	
	Q_ENUMS(PointerStyle)

public:	
	enum PointerStyle {
        PointerStyle_Circle = 0,        //圆形指示器
        PointerStyle_Indicator = 1,     //指针指示器
        PointerStyle_IndicatorR = 2,    //圆角指针指示器
        PointerStyle_Triangle = 3       //三角形指示器
	};

	explicit GaugeArc(QWidget *parent = 0);
	~GaugeArc();

protected:
	void paintEvent(QPaintEvent *);
	void drawArc(QPainter *painter);
	void drawScale(QPainter *painter);
	void drawScaleNum(QPainter *painter);
    void drawPointerCircle(QPainter *painter);
    void drawPointerIndicator(QPainter *painter);
    void drawPointerIndicatorR(QPainter *painter);
    void drawPointerTriangle(QPainter *painter);
	void drawRoundCircle(QPainter *painter);
	void drawCenterCircle(QPainter *painter);
    void drawValue(QPainter *painter);

private:    
    double minValue;                //最小值
    double maxValue;                //最大值
    double value;                   //目标值
    int precision;                  //精确度,小数点后几位

    int scaleMajor;                 //大刻度数量
    int scaleMinor;                 //小刻度数量
    int startAngle;                 //开始旋转角度
    int endAngle;                   //结束旋转角度

    bool animation;                 //是否启用动画显示
    double animationStep;           //动画显示时步长

    QColor arcColor;                //圆弧颜色
    QColor scaleColor;              //刻度尺颜色
    QColor scaleNumColor;           //刻度值颜色
    QColor pointerColor;            //指针颜色
    QColor textColor;               //文字颜色

    PointerStyle pointerStyle;      //指针样式

    bool reverse;                   //是否往回走
    double currentValue;            //当前值
    QTimer *timer;                  //定时器绘制动画

public:	
	double getMinValue()            const;
	double getMaxValue()            const;
    double getValue()               const;
	int getPrecision()              const;

	int getScaleMajor()             const;
	int getScaleMinor()             const;
	int getStartAngle()             const;
	int getEndAngle()               const;

	bool getAnimation()             const;
	double getAnimationStep()       const;

	QColor getArcColor()            const;
	QColor getScaleColor()          const;
    QColor getScaleNumColor()       const;
	QColor getPointerColor()        const;
	QColor getTextColor()           const;

	PointerStyle getPointerStyle()  const;

    QSize sizeHint()                const;
    QSize minimumSizeHint()         const;

public Q_SLOTS:
	//设置范围值
	void setRange(double minValue, double maxValue);
	void setRange(int minValue, int maxValue);

	//设置最大最小值
	void setMinValue(double minValue);
	void setMaxValue(double maxValue);

	//设置目标值
    void setValue(double value);
	void setValue(int value);

	//设置精确度
	void setPrecision(int precision);

	//设置主刻度数量
	void setScaleMajor(int scaleMajor);
	//设置小刻度数量
	void setScaleMinor(int scaleMinor);
	//设置开始旋转角度
	void setStartAngle(int startAngle);
	//设置结束旋转角度
	void setEndAngle(int endAngle);

	//设置是否启用动画显示
	void setAnimation(bool animation);
	//设置动画显示的步长
	void setAnimationStep(double animationStep);

	//设置圆弧颜色
    void setArcColor(const QColor &arcColor);
	//设置刻度尺颜色
    void setScaleColor(const QColor &scaleColor);
    //设置刻度值颜色
    void setScaleNumColor(const QColor &scaleNumColor);
	//设置指针颜色
    void setPointerColor(const QColor &pointerColor);
	//设置文本颜色
    void setTextColor(const QColor &textColor);

	//设置指针样式
    void setPointerStyle(const PointerStyle &pointerStyle);

	void updateValue();

};

#endif //GAUGEARC_H

主要参考下面的博客

Qt 自定义仪表盘控件

Lidar BEV显示优化

可以分为两个问题,一个是稀疏性问题,一个是显示不全问题

稀疏性问题通过 Python 脚本中的分辨率解决,0.01m的分辨率过高,调整至0.05m即可

res=0.05
side_range=(-15., 15.)  
fwd_range=(-15., 15.) 
height_range=(-1.5, 1.5)

显示不全的问题如下图所示

在这里插入图片描述

显示不全的问题也遇到些挫折,推流端和拉流端图像的分辨率都是400x400,但拉流端显示不全

一开始是在 Python 脚本中先将灰度图转彩色图,赋一层 ColorMap 后再推流,但是拉流后显示的颜色和推流端差别很大

考虑是将灰度图转化为彩色图导致一些像素的丢失,尝试先直接推灰度图,拉流端拉取后再进行转换

def callback(lidarmsg):
    lidar = pc2.read_points(lidarmsg)
    img_points = np.array(list(lidar))
    img_arr = point_cloud_2_birdseye(img_points)
    img = img_arr
    # img = cv2.cvtColor(img_arr, cv2.COLOR_GRAY2BGR)
    # img = cv2.applyColorMap(img, cv2.COLORMAP_MAGMA)
    target_size = (400, 400)
    img = cv2.resize(img, target_size, interpolation= cv2.INTER_LINEAR)
    # Transfer OpenCV Image to ROS message
    global bridge
    img_pub = rospy.Publisher('/lidar_bev', Image, queue_size= 10)    
    # img_msg = bridge.cv2_to_imgmsg(img, encoding="bgr8")
    img_msg = bridge.cv2_to_imgmsg(img, encoding="mono8")
    img_pub.publish(img_msg)
   <node pkg="push_video" type="push_ros_bev" name="push_lidar_bev" output="screen" args="lidar_bev">
        <param name="width" type="int" value="400"/>
        <param name="height" type="int" value="400"/>
        <param name="fps" type="int" value="10"/>
        <param name="bit_rate" type="int" value="20"/>
        <param name="gop_size" type="int" value="30"/>
        <param name="pixel_type" type="string" value="Gray"/>
    </node>
    while (ros::ok())
    {
        drag_rtmp->startDrag();
        img = drag_rtmp->getImage();
        if (node_arg == "realsense_dis_rect")
        {
            drag_rtmp->rectifyImg(img);
        }
        if(node_arg == "lidar_bev")
        {
            applyColorMap(img, img, COLORMAP_OCEAN);
        }
        // imshow(node_name, img);
        // waitKey(1);
        img_msg = cv_bridge::CvImage(std_msgs::Header(), sensor_msgs::image_encodings::BGR8, img).toImageMsg();
        pub.publish(*img_msg);
        ros::spinOnce();
        loop.sleep();
    }

经过上述调整后能够较好显示 Lidar BEV 图像

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/580919.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于OpenMV 双轴机械臂 机器学习

文章目录 一、项目简要二、目标追踪1. 色块识别与最大色块筛选2. PID位置闭环 三、机器学习1. Device12. Device2 四、效果演示 一、项目简要 两套二维云台设备&#xff0c;Device1通过摄像头捕捉目标物块点位进行实时追踪&#xff0c;再将自身点位传到Device2&#xff0c;Dev…

【力扣周赛】第394场周赛

文章目录 1.统计特殊字母的数量2.使矩阵满足条件的最少操作次数 1.统计特殊字母的数量 题目链接 &#x1f34e;该题涉及的小技巧&#xff1a;&#x1f425; &#x1f427;①大写字母和对应的小写字母低5位都是相等的&#xff1b; &#x1f427;②大写字母ASCII二进制第 6 位…

node.js + @elastic/elasticsearch 操作elasticsearch数据库

我这边node.js 使用的是 koa2&#xff0c;elasticsearch是8.11.1版本 官网&#xff1a;https://www.elastic.co/guide/en/elasticsearch/client/javascript-api/current/getting-started-js.html 一、elastic/elasticsearch 连接 elasticsearch数据库 如果elasticsearch没有设…

win c++使用lua环境配置 5.3.5版本

编译lua 下载lua源码&#xff0c;github仓库 使用vs编译源码&#xff0c;新建一个静态库项目(只会生成lib文件)&#xff0c;想要dll的话就新建dll项目&#xff08;有一个lib文件和dll文件&#xff09; 把lua源码下面的文件夹都是&#xff0c;复制到vs项目中 lib目录是我手动…

ResNeXt网络结构

一、简介 在ResNet的基础上&#xff0c;对残差结构的block进行了更新。 ResNeXt网络是一种深度神经网络架构&#xff0c;可以视为对ResNet&#xff08;残差网络&#xff09;的改进和升级。ResNeXt结合了VGG网络的堆叠相同基础模块的策略以及Inception系列网络中的split-trans…

杰发科技AC7840——CAN通信简介(6)_监听模式

参考&#xff1a;http://t.csdnimg.cn/AFFPC 0. 简介 7840支持4种扩展模式&#xff0c;其中监听模式。 监听模式概念 作用: 这里写的用于诊断&#xff0c;实际上我还没有用到&#xff0c;不太理解为啥可以用作诊断。 我的理解是&#xff0c;在多个总线下&#xff0c;使用监听…

装饰器模式【结构型模式C++】

1.概述 装饰器模式是一种结构型设计模式&#xff0c; 允许你通过将对象放入包含行为的特殊封装对象中来为原对象绑定新的行为。 2.结构 抽象构件&#xff08;Component&#xff09;角色&#xff1a;定义一个抽象接口以规范准备接收附加责任的对象。具体构件&#xff08;Concre…

苍穹外卖绕过微信支付

经过以下改动可实现&#xff1a; 1、不用微信支付端口 2、弹出支付成功的界面 3、数据库修改支付成功后的数据 #在OrderServiceImpl.java里加入Autowiredprivate OrderService orderService; #在OrderServiceImpl.java里的payment函数做以下改动 #图片里有&#xff0c;红色为原…

时间序列生成数据,TransformerGAN

简介&#xff1a;这个代码可以用于时间序列修复和生成。使用transformer提取单变量或者多变时间窗口的趋势分布情况。然后使用GAN生成分布类似的时间序列。 此外&#xff0c;还实现了基于prompt的数据生成&#xff0c;比如指定生成某个月份的数据、某半个月的数据、某一个星期的…

Qt | 窗口的显示及可见性|标题、透明度、启用/禁用|窗口标志、设置其他属性|获取窗口部件、设置父部件|鼠标光标

​显示事件:QEvent::show,处理函数为 showEvent(QShowEvent*) 隐藏事件:QEvent::hide,处理函数为 hideEvent(QHideEvent* ) 01 QWidget 类中与可见性有关的属性 visible:bool 访问函数: bool isVisible() const; virtual void setVisible(bool visible); 02 QWid…

同事上班这样摸鱼,我坐边上咋看他都在专心写代码啊

我边上有个同事&#xff0c;我坐他边上&#xff0c;但是每天看着他都眉头紧锁&#xff0c;忙的不亦乐乎&#xff0c;但终于有一天&#xff0c;我发现了他上班摸鱼的秘诀。 我劝你千万不要学会这4招&#xff0c;要不就该不好好上班了。 目录 1 上班看电影&#xff1f; 2 上班…

LeetCode - LCR 179.查找总价格为目标值的两个商品

一. 题目链接 LeetCode - LCR 179. 查找总价格为目标值的两个商品 解法&#xff08;双指针 - 对撞指针&#xff09;&#xff1a; 算法思路&#xff1a; 注意到本题是升序的数组&#xff0c;因此可以用「对撞指针」优化时间复杂度。 算法流程&#xff1a; 初始化left &#…

算法入门ABC

前言 初学算法时真的觉得这东西晦涩难懂&#xff0c;貌似毫无用处&#xff01;后来的后来&#xff0c;终于渐渐明白搞懂算法背后的核心思想&#xff0c;能让你写出更加优雅的代码。就像一首歌唱的那样&#xff1a;后来&#xff0c;我总算学会了如何去爱&#xff0c;可惜你早已远…

Hotcoin Academy 市场洞察-2024年4月15日-21日

加密货币市场表现 BTC ETF在本周出现净流出&#xff0c;大盘有较大跌幅&#xff0c;BTC一度跌破60000美金&#xff0c;ETH一度跌破2800美金&#xff0c;整体以横盘为主&#xff0c;行情在周末有略微回升趋势。BTC市占率创21年4月来新高&#xff0c;目前市值1.28万亿&#xff0c…

ElasticSearch教程入门到精通——第六部分(基于ELK技术栈elasticsearch 7.x+8.x新特性)

ElasticSearch教程入门到精通——第六部分&#xff08;基于ELK技术栈elasticsearch 7.x8.x新特性&#xff09; 1. Elasticsearch优化1.1 硬件选择1.1 分片策略1.1.1 分片策略——合理设置分片数1.1.2 分片策略——推迟分片分配 1.2 路由选择1.2.1 路由选择——不带routing查询1…

哪款洗地机最好用?2024年四大口碑一流品牌推荐

随着人们生活质量的提升&#xff0c;人们的扫地、拖地都可以用智能清洁工具来高效完成&#xff0c;像洗地机它集合了扫地、拖地、自清洁等功能&#xff0c;让我们摆脱了每次打扫卫生就像打仗一样&#xff0c;忙活半小时下来腰酸背痛的窘境。所以越来越多的家庭纷纷开始用洗地机…

84.柱形图中最大的矩阵

二刷终于能过了. 思路解析: 不愧是hard,第一步就很难想, 对于每一个矩阵,我们要想清楚怎么拿到最大矩阵, 对于每个height[i],我们需要找到left和right,left是i左边第一个小于height[i]的,right是右边第一个小于height[i]的,那么他的最大矩阵就是height[i] * (right-left-…

鸿蒙launcher浅析

鸿蒙launcher浅析 鸿蒙launcher源码下载鸿蒙launcher模块launcher和普通的应用ui展示的区别 鸿蒙launcher源码下载 下载地址如下&#xff1a; https://gitee.com/openharmony/applications_launcher 鸿蒙launcher模块 下载页面已经有相关文件结构的介绍了 使用鸿蒙编辑器D…

国外企业使用生成式人工智能实例100

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

Welcome to nginx!怎么解决?

要解决 "welcome to nginx!" 错误&#xff0c;需要检查虚拟主机配置&#xff0c;启用虚拟主机&#xff0c;重新加载 nginx&#xff0c;如果无法找到虚拟主机配置文件&#xff0c;则创建默认页面并重新加载 nginx&#xff0c;这样错误消息将消失&#xff0c;网站将正常…