编辑16个输入,其中包含最后15次迭代和此迭代的行位置。线位置在
-1
和1
之间,其中-1
表示仅最左侧的传感器可以看到该线,而0表示该线位于中间。我希望它学习一条线位置,当它再次面对此输入时,将以该线位置为中心设置该线位置,并根据该线位置绘制曲线。例如,错误是必需的位置-行位置,因此,假设我输入了16个0
,然后将所需的计算为0.4
。因此,在那之后,汽车将以0.4
为中心,我希望这会有所帮助:) >我的传感器读数返回-1.0f
和1.0f
之间的值。 1.0f
表示右侧的外部传感器仅是线路。我有8个传感器。void MainController::Control(void){
float linePosition = sensors->ReadSensors();
if(linePosition == -2.0f){
lost_line->FindLine(lastPos[1] - lastPos[0]);
}
else{
line_follower->Follow(linePosition);
lastPos.push_back(linePosition);
lastPos.erase(lastPos.begin());
}
}
这是QPredictor值的逻辑(我称其为学习部分)。最后,QPredictor
void LineFollower::Follow(float LinePosition){
float requiredPos = Qpredictor.Process(LinePosition,CurrentSpeed);
float error = requiredPos - LinePosition;
float ErrorDer = error -LastError;
float diffSpeed = (KpTerm * error + (KdTerm * ErrorDer));
float RightMotorSpeed = CurrentSpeed - diffSpeed;
float LeftMotorSpeed = CurrentSpeed + diffSpeed;
LastError = error;
driver->Drive(LeftMotorSpeed,RightMotorSpeed);
}
我现在只有平均错误,并且目前没有使用学习,因为没有奖励功能就无法完成学习。如何根据机器人的尺寸进行调整?
#1 楼
自适应PID控制基于手动编码的线跟随算法,通过强化学习对其进行了修改。这个想法是,在PID函数中,一个参数是未知的(例如,到线的距离可以容忍为偏差),并且该参数将在驱动机器人时动态计算。奖励由操作员Clicker培训手动提供,也可以循环确定。机器人正在开车,时间被测量。机器人再次驱动parcurs,目标是减少时间。评论
$ \ begingroup $
我看过,但是我有kohonen映射和q学习,我使用kohonen对输入向量进行聚类并使用q学习来确定输出,我可以使该系统适合我的吗?
$ \ endgroup $
– Ege Keyvan
16年8月15日在9:07
$ \ begingroup $
当然,自组织映射可以用作关联记忆(Q-KOHON,Claude F. Touzet)。
$ \ endgroup $
–曼努埃尔·罗德里格斯(Manuel Rodriguez)
16年8月15日在9:18
$ \ begingroup $
您是否建议根据输入内容系统更改参数?
$ \ endgroup $
– Ege Keyvan
16年8月15日在9:45
$ \ begingroup $
@EgeKeyvan:请发布您的源代码或NXT-G GUI的屏幕截图
$ \ endgroup $
–曼努埃尔·罗德里格斯(Manuel Rodriguez)
16年8月15日在14:48
$ \ begingroup $
我现在发布了
$ \ endgroup $
– Ege Keyvan
16年8月17日在12:32
#2 楼
我认为Q学习对于这样一个简单的跟踪问题来说是过大的选择。我强烈建议您使用一种更简单的方法,即纯追踪跟踪控制器。这里是一些您可以阅读有关该方法的链接。 Matlab在该主题上的页面非常整洁。Matlab的纯追踪控制器
纯追踪路径跟踪算法的实现
评论
我认为您的问题需要一些改进才能得到解答。例如。你想学什么? PID参数?您对最终系统行为的目标是什么?链接的问题:robotics.stackexchange.com/questions/361/…
内存阵列存储了机器人的过去经验,而不是未来。如果所有数组元素均为白色,则必须给出负数奖励。对于简单的曲线,这将起作用。
是的,这是有道理的,但是如果我没有输掉线怎么办,如何增加或减少奖励或惩罚
+1尝试;您可以使用简单的网络摄像头进行验证;使用简单的检查来确定您的机器人离线条中心有多近。然后,使用它并添加奖励(例如+1表示“每秒继续前进”)和惩罚(如果一个轮子越过线;每秒-50)。