wip
This commit is contained in:
		
							
								
								
									
										46
									
								
								pkg/steering/corrector.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										46
									
								
								pkg/steering/corrector.go
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,46 @@ | ||||
| package steering | ||||
|  | ||||
| import ( | ||||
| 	"fmt" | ||||
| 	"github.com/cyrilix/robocar-protobuf/go/events" | ||||
| 	"go.uber.org/zap" | ||||
| ) | ||||
|  | ||||
| type Corrector struct { | ||||
| } | ||||
|  | ||||
| func (c *Corrector) FixFromObjectPosition(currentSteering float64, objects []*events.Object) float64 { | ||||
| 	// TODO, group rectangle | ||||
|  | ||||
| 	if len(objects) == 0 { | ||||
| 		return currentSteering | ||||
| 	} | ||||
| 	// get nearest object | ||||
| 	nearest, err := c.nearObject(objects) | ||||
| 	if err != nil { | ||||
| 		zap.S().Warnf("unexpected error on nearest seach object, ignore objects: %v", err) | ||||
| 		return currentSteering | ||||
| 	} | ||||
|  | ||||
| 	// Search if current steering is near of Right or Left | ||||
|  | ||||
| 	return currentSteering | ||||
| } | ||||
|  | ||||
| func (c *Corrector) nearObject(objects []*events.Object) (*events.Object, error) { | ||||
| 	if len(objects) == 0 { | ||||
| 		return nil, fmt.Errorf("list objects must contain at least one object") | ||||
| 	} | ||||
| 	if len(objects) == 1 { | ||||
| 		return objects[0], nil | ||||
| 	} | ||||
|  | ||||
| 	var result *events.Object | ||||
| 	for _, obj := range objects { | ||||
| 		if result == nil || obj.Bottom > result.Bottom { | ||||
| 			result = obj | ||||
| 			continue | ||||
| 		} | ||||
| 	} | ||||
| 	return result, nil | ||||
| } | ||||
							
								
								
									
										188
									
								
								pkg/steering/corrector_test.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										188
									
								
								pkg/steering/corrector_test.go
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,188 @@ | ||||
| package steering | ||||
|  | ||||
| import ( | ||||
| 	"github.com/cyrilix/robocar-protobuf/go/events" | ||||
| 	"reflect" | ||||
| 	"testing" | ||||
| ) | ||||
|  | ||||
| var ( | ||||
| 	objectOnMiddleDistant = events.Object{ | ||||
| 		Type:       events.TypeObject_ANY, | ||||
| 		Left:       0.4, | ||||
| 		Top:        0.1, | ||||
| 		Right:      0.6, | ||||
| 		Bottom:     0.2, | ||||
| 		Confidence: 0.9, | ||||
| 	} | ||||
| 	objectOnLeftDistant = events.Object{ | ||||
| 		Type:       events.TypeObject_ANY, | ||||
| 		Left:       0.1, | ||||
| 		Top:        0.09, | ||||
| 		Right:      0.3, | ||||
| 		Bottom:     0.19, | ||||
| 		Confidence: 0.9, | ||||
| 	} | ||||
| 	objectOnRightDistant = events.Object{ | ||||
| 		Type:       events.TypeObject_ANY, | ||||
| 		Left:       0.7, | ||||
| 		Top:        0.21, | ||||
| 		Right:      0.9, | ||||
| 		Bottom:     0.11, | ||||
| 		Confidence: 0.9, | ||||
| 	} | ||||
| 	objectOnMiddleNear = events.Object{ | ||||
| 		Type:       events.TypeObject_ANY, | ||||
| 		Left:       0.4, | ||||
| 		Top:        0.8, | ||||
| 		Right:      0.6, | ||||
| 		Bottom:     0.9, | ||||
| 		Confidence: 0.9, | ||||
| 	} | ||||
| ) | ||||
|  | ||||
| func TestCorrector_FixFromObjectPosition(t *testing.T) { | ||||
| 	type args struct { | ||||
| 		currentSteering float64 | ||||
| 		objects         []*events.Object | ||||
| 	} | ||||
| 	tests := []struct { | ||||
| 		name string | ||||
| 		args args | ||||
| 		want float64 | ||||
| 	}{ | ||||
| 		{ | ||||
| 			name: "run straight without objects", | ||||
| 			args: args{ | ||||
| 				currentSteering: 0., | ||||
| 				objects:         []*events.Object{}, | ||||
| 			}, | ||||
| 			want: 0., | ||||
| 		}, | ||||
| 		{ | ||||
| 			name: "run to left without objects", | ||||
| 			args: args{ | ||||
| 				currentSteering: -0.9, | ||||
| 				objects:         []*events.Object{}, | ||||
| 			}, | ||||
| 			want: -0.9, | ||||
| 		}, | ||||
| 		{ | ||||
| 			name: "run to right without objects", | ||||
| 			args: args{ | ||||
| 				currentSteering: 0.9, | ||||
| 				objects:         []*events.Object{}, | ||||
| 			}, want: 0.9, | ||||
| 		}, | ||||
|  | ||||
| 		{ | ||||
| 			name: "run straight with 1 distant object", | ||||
| 			args: args{ | ||||
| 				currentSteering: 0., | ||||
| 				objects:         []*events.Object{&objectOnMiddleDistant}, | ||||
| 			}, | ||||
| 			want: 0., | ||||
| 		}, | ||||
| 		{ | ||||
| 			name: "run to left with 1 distant object", | ||||
| 			args: args{ | ||||
| 				currentSteering: -0.9, | ||||
| 				objects:         []*events.Object{&objectOnMiddleDistant}, | ||||
| 			}, | ||||
| 			want: -0.9, | ||||
| 		}, | ||||
| 		{ | ||||
| 			name: "run to right with 1 distant object", | ||||
| 			args: args{ | ||||
| 				currentSteering: 0.9, | ||||
| 				objects:         []*events.Object{&objectOnMiddleDistant}, | ||||
| 			}, | ||||
| 			want: 0.9, | ||||
| 		}, | ||||
|  | ||||
| 		{ | ||||
| 			name: "run straight with 1 near object", | ||||
| 			args: args{ | ||||
| 				currentSteering: 0., | ||||
| 				objects:         []*events.Object{&objectOnMiddleNear}, | ||||
| 			}, | ||||
| 			want: 0.5, | ||||
| 		}, | ||||
| 		{ | ||||
| 			name: "run to left with 1 near object", | ||||
| 			args: args{ | ||||
| 				currentSteering: -0.9, | ||||
| 				objects:         []*events.Object{&objectOnMiddleNear}, | ||||
| 			}, | ||||
| 			want: -0.4, | ||||
| 		}, | ||||
| 		{ | ||||
| 			name: "run to right with 1 near object", | ||||
| 			args: args{ | ||||
| 				currentSteering: 0.9, | ||||
| 				objects:         []*events.Object{&objectOnMiddleNear}, | ||||
| 			}, | ||||
| 			want: 0.4, | ||||
| 		}, | ||||
|  | ||||
| 		// Todo Object on left/right near/distant | ||||
| 	} | ||||
| 	for _, tt := range tests { | ||||
| 		t.Run(tt.name, func(t *testing.T) { | ||||
| 			c := &Corrector{} | ||||
| 			if got := c.FixFromObjectPosition(tt.args.currentSteering, tt.args.objects); got != tt.want { | ||||
| 				t.Errorf("FixFromObjectPosition() = %v, want %v", got, tt.want) | ||||
| 			} | ||||
| 		}) | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func TestCorrector_nearObject(t *testing.T) { | ||||
| 	type args struct { | ||||
| 		objects []*events.Object | ||||
| 	} | ||||
| 	tests := []struct { | ||||
| 		name    string | ||||
| 		args    args | ||||
| 		want    *events.Object | ||||
| 		wantErr bool | ||||
| 	}{ | ||||
| 		{ | ||||
| 			name: "List object is empty", | ||||
| 			args: args{ | ||||
| 				objects: []*events.Object{}, | ||||
| 			}, | ||||
| 			want:    nil, | ||||
| 			wantErr: true, | ||||
| 		}, | ||||
| 		{ | ||||
| 			name: "List with only one object", | ||||
| 			args: args{ | ||||
| 				objects: []*events.Object{&objectOnMiddleNear}, | ||||
| 			}, | ||||
| 			want:    &objectOnMiddleNear, | ||||
| 			wantErr: false, | ||||
| 		}, | ||||
| 		{ | ||||
| 			name: "List with many objects", | ||||
| 			args: args{ | ||||
| 				objects: []*events.Object{&objectOnLeftDistant, &objectOnMiddleNear, &objectOnRightDistant, &objectOnMiddleDistant}, | ||||
| 			}, | ||||
| 			want:    &objectOnMiddleNear, | ||||
| 			wantErr: false, | ||||
| 		}, | ||||
| 	} | ||||
| 	for _, tt := range tests { | ||||
| 		t.Run(tt.name, func(t *testing.T) { | ||||
| 			c := &Corrector{} | ||||
| 			got, err := c.nearObject(tt.args.objects) | ||||
| 			if (err != nil) != tt.wantErr { | ||||
| 				t.Errorf("nearObject() error = %v, wantErr %v", err, tt.wantErr) | ||||
| 				return | ||||
| 			} | ||||
| 			if !reflect.DeepEqual(got, tt.want) { | ||||
| 				t.Errorf("nearObject() got = %v, want %v", got, tt.want) | ||||
| 			} | ||||
| 		}) | ||||
| 	} | ||||
| } | ||||
		Reference in New Issue
	
	Block a user