gpt4 book ai didi

c++ - 如何防止我的自动驾驶解决方案过度校正?

转载 作者:搜寻专家 更新时间:2023-10-31 00:55:19 24 4
gpt4 key购买 nike

我正在使用 C++ 中的 OpenCV 为 Euro Truck Simulator 2 开发自动驾驶解决方案。

这是我们检测道路曲线的地方:

    int bottom_center = 160;
int sum_centerline = 0;
int count_centerline = 0;
int first_centerline = 0;
int last_centerline = 0;
double avr_center_to_left = 0;
double avr_center_to_right = 0;

//#pragma omp parallel for
for (int i = 240; i > 30; i--){
double center_to_right = -1;
double center_to_left = -1;

for (int j = 0; j < 150; j++) {
if (contours.at<uchar>(i, bottom_center + j) == 112 && center_to_right == -1) {
center_to_right = j;
}
if (contours.at<uchar>(i, bottom_center - j) == 112 && center_to_left == -1) {
center_to_left = j;
}
}
if (center_to_left != -1 && center_to_right != -1){
int centerline = (center_to_right - center_to_left + 2 * bottom_center) / 2;
if (first_centerline == 0) {
first_centerline = centerline;
}
cv::circle(outputImg, Point(centerline, i), 1, Scalar(30, 255, 30), 3);
cv::circle(outputImg, Point(centerline + center_to_right+20, i), 1, Scalar(255, 30, 30) , 3);
cv::circle(outputImg, Point(centerline - center_to_left+10, i), 1, Scalar(255, 30, 30) , 3);
sum_centerline += centerline;
avr_center_to_left = (avr_center_to_left * count_centerline + center_to_left) / count_centerline + 1;
avr_center_to_right = (avr_center_to_right * count_centerline + center_to_right) / count_centerline + 1;
last_centerline = centerline;
count_centerline++;
}
else {}
}

这是我目前的转向解决方案:

int diff = 0;
if (count_centerline != 0) {
diff = sum_centerline / count_centerline - bottom_center;
int degree = atan2(last_centerline - first_centerline, count_centerline) * 180 / PI;
//diff = (90 - degree);

int move_mouse_pixel = diff;
cout << "Steer: " << move_mouse_pixel << "px ";
if (diff <= 20 || diff >= -20){
SetCursorPos(pt.x + (move_mouse_pixel / 10), height / 2);
}
else{
SetCursorPos(pt.x + (move_mouse_pixel / 25), height / 2);
}
}

最后,这是我的程序当前所做的视频:https://www.youtube.com/watch?v=rqyvoFuGKKk&feature=youtu.be

我目前遇到的问题是转向中心的速度不够快,导致它不断过度校正,直到转向偏离车道。我曾尝试提高游戏中的转向灵敏度,以允许更快或更慢的转弯,但这要么会使卡车失去控制,要么在沿着大弯道行驶时转弯不够。

我目前的方法只是将轻微的移动(-20px 和 20px 之间)除以 10,将较大的移动除以 20。我也尝试过将其反转但没有解决过度校正的问题。

到目前为止,我发现了两种可能的解决方案:

  1. 我可以逐渐增加应用于 move_mouse_pixel 的分隔线,从而减少小 Action 之间的转向力。

  2. 或者,我可以通过某种方式让程序更快地使方向盘居中。我不确定我将如何实现它。

大家怎么看?

最佳答案

我相信 PID Controller 适合这项任务。 https://en.wikipedia.org/wiki/PID_controller在您的情况下,它看起来类似于:

            diffOld = diff;
diff = sum_centerline / count_centerline - bottom_center;
SetCursorPos(width/2 + Kp* diff + Kd*(diff - diffOld) , height / 2);

不要在此 Controller 中使用 if 语句。即使没有需要更正的错误,您也需要保持转向。我建议跳过积分部分,因为你的对象整合(当你不直行时你整合错误)。您需要通过实验选择 Kp 和 Kd 参数的值,例如使用 Ziegler–Nichols 方法 https://en.wikipedia.org/wiki/Ziegler%E2%80%93Nichols_method .

关于c++ - 如何防止我的自动驾驶解决方案过度校正?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42370796/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com