Behaviors Driven Robotics (#178)

* adding avoid crash behavior

* more implementation

* add another simple behavior

* fixed synched motors

* bump common packages
This commit is contained in:
Peli de Halleux 2018-01-04 12:55:30 -08:00 committed by GitHub
parent 69f8453947
commit 7da811246c
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
10 changed files with 93 additions and 15 deletions

View File

@ -0,0 +1,14 @@
{
"behaviors": "Behavior drive blocks",
"behaviors.Behavior": "A behavior",
"behaviors.BehaviorManager": "A manager for behaviors",
"behaviors.BehaviorManager.add": "Adds a new behavior to the behavior manager",
"behaviors.BehaviorManager.add|param|behavior": "the behavior to add",
"behaviors.BehaviorManager.start": "Starts the behavior control loop",
"behaviors.BehaviorManager.stop": "Stops the execution loop",
"behaviors.addBehavior": "Adds the behavior and starts it",
"behaviors.addBehavior|param|behavior": "a behavior",
"behaviors.avoidCrash": "A behavior that stops all motors if the sensor distance get too short",
"behaviors.driveForward": "A behavior that turns on the motors to the specified speed",
"behaviors.driveForward|param|motors": "@param speed the desired speed, eg: 50"
}

View File

@ -0,0 +1,7 @@
{
"behaviors.addBehavior|block": "add behavior %behavior",
"behaviors.avoidCrash|block": "avoid crash using %ultrasonic",
"behaviors.driveForward|block": "drive %motors|forward at %speed|%",
"behaviors|block": "behaviors",
"{id:category}Behaviors": "Behaviors"
}

6
libs/behaviors/pxt.json Normal file
View File

@ -0,0 +1,6 @@
{
"additionalFilePath": "../../node_modules/pxt-common-packages/libs/behaviors",
"dependencies": {
"core": "file:../ev3"
}
}

View File

@ -0,0 +1,56 @@
namespace behaviors {
class AvoidCrashBehavior extends behaviors.Behavior {
private ultrasonic: sensors.UltraSonicSensor;
constructor(ultrasonic: sensors.UltraSonicSensor) {
super();
this.ultrasonic = ultrasonic;
}
shouldRun(): boolean {
return this.ultrasonic.distance() < 5;
}
run(): void {
motors.stopAllMotors();
this.active = false;
}
}
/**
* A behavior that stops all motors if the sensor distance get too short
*/
//% blockId=behaviorsAvoidCrash block="avoid crash using %ultrasonic"
export function avoidCrash(ultrasonic: sensors.UltraSonicSensor) : behaviors.Behavior {
return new AvoidCrashBehavior(ultrasonic);
}
class DriveForwardBehavior extends behaviors.Behavior {
private motors: motors.MotorBase;
private speed: number;
constructor(motors: motors.MotorBase, speed: number) {
super();
this.motors = motors;
this.speed = speed;
}
shouldRun(): boolean {
return true;
}
run(): void {
this.motors.setSpeed(this.speed);
pauseUntil(() => !this.active);
this.motors.setSpeed(0);
}
}
/**
* A behavior that turns on the motors to the specified speed
* @param motors
* @param speed the desired speed, eg: 50
*/
//% blockId=behaviorsDriveForward block="drive %motors|forward at %speed|%"
export function driveForward(motors: motors.MotorBase, speed: number): behaviors.Behavior {
return new DriveForwardBehavior(motors, speed);
}
}

View File

@ -343,7 +343,7 @@ namespace motors {
* Gets motor angle. * Gets motor angle.
* @param motor the port which connects to the motor * @param motor the port which connects to the motor
*/ */
//% blockId=motorTachoCount block="%motor|angle" //% blockId=motorAngle block="%motor|angle"
//% weight=70 //% weight=70
//% group="Sensors" //% group="Sensors"
angle(): number { angle(): number {
@ -445,7 +445,7 @@ namespace motors {
private __setSpeed(speed: number) { private __setSpeed(speed: number) {
syncMotors(this._port, { syncMotors(this._port, {
speed: speed, speed: speed,
turnRatio: 0, turnRatio: 100, // same speed
useBrake: !!this._brake useBrake: !!this._brake
}) })
} }

View File

@ -19,6 +19,10 @@ namespace sensors {
namespace motors { namespace motors {
} }
//% labelLineWidth=0
namespace behaviors {
}
//% color="#D67923" weight=80 icon="\uf10e" //% color="#D67923" weight=80 icon="\uf10e"
namespace music { namespace music {

View File

@ -1,16 +1,6 @@
{ {
"name": "tests",
"description": "A unit test library",
"files": [
"README.md",
"tests.ts",
"platformoverrides.ts"
],
"testFiles": [
],
"public": true,
"additionalFilePath": "../../node_modules/pxt-common-packages/libs/tests", "additionalFilePath": "../../node_modules/pxt-common-packages/libs/tests",
"dependencies": { "dependencies": {
"core": "file:../core" "core": "file:../ev3"
} }
} }

View File

@ -44,7 +44,7 @@
"webfonts-generator": "^0.4.0" "webfonts-generator": "^0.4.0"
}, },
"dependencies": { "dependencies": {
"pxt-common-packages": "0.15.1", "pxt-common-packages": "0.15.3",
"pxt-core": "3.0.5" "pxt-core": "3.0.5"
}, },
"scripts": { "scripts": {

View File

@ -16,7 +16,8 @@
"libs/infrared-sensor", "libs/infrared-sensor",
"libs/gyro-sensor", "libs/gyro-sensor",
"libs/ev3", "libs/ev3",
"libs/tests" "libs/tests",
"libs/behaviors"
], ],
"simulator": { "simulator": {
"autoRun": true, "autoRun": true,