Improved condition of stopping algorithm; Changed error threshold in linear regression;

This commit is contained in:
MaximZaitsev
2016-09-01 11:26:32 +03:00
parent d735cbb8a5
commit e5ba0307a9
7 changed files with 32 additions and 21 deletions
+1 -1
View File
@@ -25,7 +25,7 @@ object DebugClInterface {
"route [car_id] - setting a route for car with car id.\n" + "route [car_id] - setting a route for car with car id.\n" +
"refloc - refresh all car locations\n" + "refloc - refresh all car locations\n" +
"sonar [car_id] - get sonar data\n" + "sonar [car_id] - get sonar data\n" +
"dbinfo [car_id] [type] - refresh all car locations\n." + "dbinfo [car_id] [type] - refresh all car locations\n" +
"lines - print lines, detected by car\n" + "lines - print lines, detected by car\n" +
"alg [count] - run algorithm. Make [count] iteration\n" + "alg [count] - run algorithm. Make [count] iteration\n" +
"type is string name of value or int value. available values: MEMORYSTATS - 0\n" + "type is string name of value or int value. available values: MEMORYSTATS - 0\n" +
@@ -77,7 +77,6 @@ abstract class AbstractAlgorithm(val thisCar: Car, val exchanger: Exchanger<IntA
} }
private fun moveCar(messageBytes: ByteArray) { private fun moveCar(messageBytes: ByteArray) {
val request = getDefaultHttpRequest(thisCar.host, setRouteMetricUrl, messageBytes) val request = getDefaultHttpRequest(thisCar.host, setRouteMetricUrl, messageBytes)
try { try {
@@ -150,6 +149,7 @@ abstract class AbstractAlgorithm(val thisCar: Car, val exchanger: Exchanger<IntA
protected abstract fun getCarState(anglesDistances: Map<Angle, AngleData>): CarState? protected abstract fun getCarState(anglesDistances: Map<Angle, AngleData>): CarState?
protected abstract fun getCommand(anglesDistances: Map<Angle, AngleData>, state: CarState): RouteMetricRequest? protected abstract fun getCommand(anglesDistances: Map<Angle, AngleData>, state: CarState): RouteMetricRequest?
protected abstract fun afterGetCommand(route: RouteMetricRequest) protected abstract fun afterGetCommand(route: RouteMetricRequest)
abstract fun isCompleted(): Boolean
private fun getDefaultHttpRequest(host: String, url: String, bytes: ByteArray): DefaultFullHttpRequest { private fun getDefaultHttpRequest(host: String, url: String, bytes: ByteArray): DefaultFullHttpRequest {
@@ -1,13 +1,11 @@
package algorithm package algorithm
import kotlin.concurrent.thread
class AlgorithmThread(val algorithmImpl: AbstractAlgorithm) : Thread() { class AlgorithmThread(val algorithmImpl: AbstractAlgorithm) : Thread() {
private var count = 0 private var count = 0
override fun run() { override fun run() {
while (true) {//todo while !alrightmImpl.isDone(), but need check it while (!algorithmImpl.isCompleted()) {
try { try {
if (count > 0) { if (count > 0) {
algorithmImpl.iterate() algorithmImpl.iterate()
@@ -3,10 +3,7 @@ package algorithm
import Logger.log import Logger.log
import RouteMetricRequest import RouteMetricRequest
import SonarRequest import SonarRequest
import algorithm.geometry.Angle import algorithm.geometry.*
import algorithm.geometry.AngleData
import algorithm.geometry.Point
import algorithm.geometry.Wall
import objects.Car import objects.Car
import java.util.concurrent.Exchanger import java.util.concurrent.Exchanger
@@ -19,7 +16,7 @@ class RoomBypassingAlgorithm(thisCar: Car, exchanger: Exchanger<IntArray>) : Abs
override val WINDOW_SIZE = 3 override val WINDOW_SIZE = 3
//SHOULD BE CALIBRATED BEFORE RUNNING!!!!!!!!!!! //SHOULD BE CALIBRATED BEFORE RUNNING!!!!!!!!!!!
private val CHARGE_CORRECTION = 1.02//on full charge ok is 0.83 - 0.86 private val CHARGE_CORRECTION = 0.88//on full charge ok is 0.83 - 0.86
private val MAX_DISTANCE_TO_WALL_AHEAD = 55 // reached the corner and should turn left private val MAX_DISTANCE_TO_WALL_AHEAD = 55 // reached the corner and should turn left
private val OUTER_CORNER_DISTANCE_THRESHOLD = 90 // reached outer corner private val OUTER_CORNER_DISTANCE_THRESHOLD = 90 // reached outer corner
@@ -28,9 +25,13 @@ class RoomBypassingAlgorithm(thisCar: Car, exchanger: Exchanger<IntArray>) : Abs
private val DISTANCE_TO_WALL_UPPER_BOUND = 60 // have to move closer to the parallel wall private val DISTANCE_TO_WALL_UPPER_BOUND = 60 // have to move closer to the parallel wall
private val DISTANCE_TO_WALL_LOWER_BOUND = 40 // have to move farther to the parallel wall private val DISTANCE_TO_WALL_LOWER_BOUND = 40 // have to move farther to the parallel wall
private val SPURIOUS_REFLECTION_DIFF = 70 // we're approaching corner and get spurious reflection from two walls on 60 meas. ! Should be before outer corner case ! private val SPURIOUS_REFLECTION_DIFF = 70 // we're approaching corner and get spurious reflection from two walls on 60 meas. ! Should be before outer corner case !
private val RANGE_FROM_ZERO_POINT_TO_FINISH_ALG = 50
private var calibrateAfterRotate = false private var calibrateAfterRotate = false
private var isCompleted = false
private var circleFound = false
var carX = 0 var carX = 0
var carY = 0 var carY = 0
var carAngle = 0 var carAngle = 0
@@ -50,8 +51,9 @@ class RoomBypassingAlgorithm(thisCar: Car, exchanger: Exchanger<IntArray>) : Abs
val resultBuilder = RouteMetricRequest.BuilderRouteMetricRequest(IntArray(0), IntArray(0)) val resultBuilder = RouteMetricRequest.BuilderRouteMetricRequest(IntArray(0), IntArray(0))
resultBuilder.setDirections(getIntArray(FORWARD, RIGHT, FORWARD)) resultBuilder.setDirections(getIntArray(FORWARD, RIGHT, FORWARD))
val wallAngle = calculateAngle(anglesDistances, state) val wallAngle = calculateAngle(anglesDistances, state)
resultBuilder.setDistances(getIntArray(15, wallAngle.degs(), 60)) resultBuilder.setDistances(getIntArray(15, wallAngle.degs(), 70))
addWall(-wallAngle) addWall(-wallAngle)
carAngle = RoomModel.walls.last().wallAngleOX.degs()
calibrateAfterRotate = true calibrateAfterRotate = true
return resultBuilder.build() return resultBuilder.build()
} }
@@ -62,6 +64,7 @@ class RoomBypassingAlgorithm(thisCar: Car, exchanger: Exchanger<IntArray>) : Abs
val wallAngle = calculateAngle(anglesDistances, state) val wallAngle = calculateAngle(anglesDistances, state)
resultBuilder.setDistances(getIntArray(wallAngle.degs(), 15)) resultBuilder.setDistances(getIntArray(wallAngle.degs(), 15))
addWall(wallAngle) addWall(wallAngle)
carAngle = RoomModel.walls.last().wallAngleOX.degs()
calibrateAfterRotate = true calibrateAfterRotate = true
return resultBuilder.build() return resultBuilder.build()
} }
@@ -108,7 +111,7 @@ class RoomBypassingAlgorithm(thisCar: Car, exchanger: Exchanger<IntArray>) : Abs
val resultBuilder = RouteMetricRequest.BuilderRouteMetricRequest(IntArray(0), IntArray(0)) val resultBuilder = RouteMetricRequest.BuilderRouteMetricRequest(IntArray(0), IntArray(0))
resultBuilder.setDirections(getIntArray(FORWARD)) resultBuilder.setDirections(getIntArray(FORWARD))
if (distToWall == -1 || distToWall > 200) { if (distToWall == -1 || distToWall > 200) {
resultBuilder.setDistances(getIntArray(50)) resultBuilder.setDistances(getIntArray(70))
} else { } else {
resultBuilder.setDistances(getIntArray(Math.max(distToWall / 4, 20))) resultBuilder.setDistances(getIntArray(Math.max(distToWall / 4, 20)))
} }
@@ -121,10 +124,14 @@ class RoomBypassingAlgorithm(thisCar: Car, exchanger: Exchanger<IntArray>) : Abs
val firstWall = RoomModel.walls.first() val firstWall = RoomModel.walls.first()
val lastWall = RoomModel.walls.last() val lastWall = RoomModel.walls.last()
if (firstWall == lastWall && RoomModel.walls.size > 1) { // if (firstWall == lastWall && RoomModel.walls.size > 1) {
log("Found equal walls, finishing algorithm") if (circleFound) {
log("Found circle, finishing algorithm")
isCompleted = true
RoomModel.finished = true RoomModel.finished = true
lastWall.pushBackPoint(firstWall.rawPoints.last()) val intersectionPoint = firstWall.rawPoints.last()
intersectionPoint.y = lastWall.rawPoints.first().y
lastWall.pushBackPoint(intersectionPoint)
lastWall.markAsFinished() lastWall.markAsFinished()
RoomModel.walls.removeAt(0) RoomModel.walls.removeAt(0)
} else { } else {
@@ -166,7 +173,6 @@ class RoomBypassingAlgorithm(thisCar: Car, exchanger: Exchanger<IntArray>) : Abs
} }
log("No need to realign") log("No need to realign")
calibrateAfterRotate = false calibrateAfterRotate = false
carAngle = RoomModel.walls.last().wallAngleOX.degs()
} }
// Check most basic measurements: 60/90/120 // Check most basic measurements: 60/90/120
@@ -256,6 +262,10 @@ class RoomBypassingAlgorithm(thisCar: Car, exchanger: Exchanger<IntArray>) : Abs
return args return args
} }
override fun isCompleted(): Boolean {
return isCompleted
}
override fun afterGetCommand(route: RouteMetricRequest) { override fun afterGetCommand(route: RouteMetricRequest) {
route.directions.forEachIndexed { idx, direction -> route.directions.forEachIndexed { idx, direction ->
when (direction) { when (direction) {
@@ -277,6 +287,10 @@ class RoomBypassingAlgorithm(thisCar: Car, exchanger: Exchanger<IntArray>) : Abs
} }
} }
} }
if (Math.round(Math.cos(Angle(carAngle).rads())).toInt() == 1 && carAngle != 0
&& Vector(carX.toDouble(), carY.toDouble()).length() < RANGE_FROM_ZERO_POINT_TO_FINISH_ALG) {
circleFound = true
}
} }
@@ -1,6 +1,6 @@
package algorithm.geometry package algorithm.geometry
data class Point(val x: Double, val y: Double) { data class Point(var x: Double, var y: Double) {
operator fun plus(other: Vector): Point { operator fun plus(other: Vector): Point {
return Point(x + other.x, y + other.y) return Point(x + other.x, y + other.y)
} }
@@ -5,8 +5,9 @@ import java.util.*
data class Wall(val wallAngleOX: Angle, data class Wall(val wallAngleOX: Angle,
val rawPoints: ArrayList<Point> = arrayListOf<Point>(), val rawPoints: ArrayList<Point> = arrayListOf<Point>(),
var line: Line = Line(0.0, 0.0, 0.0) var line: Line = Line(0.0, 0.0, 0.0)
) { ) {
val id: Int val id: Int
companion object { companion object {
var idCounter = 0 var idCounter = 0
} }
@@ -17,7 +18,7 @@ data class Wall(val wallAngleOX: Angle,
} }
var isFinished = false var isFinished = false
val MAX_REGRESSION_ERROR = 10.0 val MAX_REGRESSION_ERROR = 5.0
fun pushBackPoint(point: Point) { fun pushBackPoint(point: Point) {
rawPoints.add(point) rawPoints.add(point)
@@ -97,8 +97,6 @@ class ClientHandler : SimpleChannelInboundHandler<Any>() {
} catch (e: InterruptedException) { } catch (e: InterruptedException) {
println("interrupted before sending datas to algorithm!") println("interrupted before sending datas to algorithm!")
} catch (e: TimeoutException) { } catch (e: TimeoutException) {
e.printStackTrace()
println("timeout")
} }
} }