远程控制软件优化(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 图像