01. 음성으로 조종하기
알버트 로봇을 음성 명령으로 움직여 보자.
음성 명령으로 알버트 로봇을 앞뒤로 움직이는 프로그램을 작성하시오.
새 프로젝트 만들기를 참고하여 안드로이드 프로젝트와 플래시 파일을 만들고, setOnInitialized(callback:Function) 메소드를 사용하여 콜백 함수를 등록하자. 또한, 플래시가 종료될 때 호출되는 리스너 함수를 등록하고, activate() 메소드를 호출하여 스마트 로봇 론처와 연결하도록 하자.
import flash.events.Event; import org.smartrobot.android.SmartRobot; import org.roboid.robot.Robot; NativeApplication.nativeApplication.addEventListener(Event.DEACTIVATE, handleDeactivate, false, 0, true); SmartRobot.setOnInitialized(onInitialized); SmartRobot.activate(); function onInitialized(robot:Robot):void { } function handleDeactivate(evt:Event):void { SmartRobot.deactivate(); }
VoiceRecognition 액션의 객체를 얻기 위해서는 Action 클래스의 obtain(actionId:String) 메소드에서 actionId에 Action.VoiceRecognition.ID를 입력하면 된다.
import flash.events.Event; import org.smartrobot.android.SmartRobot; import org.roboid.robot.Robot; import org.smartrobot.android.action.Action; NativeApplication.nativeApplication.addEventListener(Event.DEACTIVATE, handleDeactivate, false, 0, true); SmartRobot.setOnInitialized(onInitialized); SmartRobot.activate(); var action:Action = Action.obtain(Action.VoiceRecognition.ID); // 액션 객체를 얻는다. action.activate(); // 액션을 시작한다. function onInitialized(robot:Robot):void { } function handleDeactivate(evt:Event):void { action.deactivate(); // 액션을 중지한다. action.dispose(); // 액션을 폐기한다. SmartRobot.deactivate(); }
handleDeactivated 메소드에서 액션을 중지 및 폐기하였지만 어디에서 해도 상관은 없다. 플래시가 종료되기 전에 액션을 모두 폐기하여야 한다는 것만 잊지 않도록 하자.
VoiceRecognition 액션에는 음성 인식 결과를 얻는 디바이스로 EVENT_TEXT가 있다.
import flash.events.Event; import org.smartrobot.android.SmartRobot; import org.roboid.robot.Robot; import org.smartrobot.android.action.Action; import org.roboid.robot.Device; NativeApplication.nativeApplication.addEventListener(Event.DEACTIVATE, handleDeactivate, false, 0, true); SmartRobot.setOnInitialized(onInitialized); SmartRobot.activate(); var action:Action = Action.obtain(Action.VoiceRecognition.ID); action.addDeviceDataChangedListener(onDeviceDataChanged); action.activate(); function onInitialized(robot:Robot):void { } function onDeviceDataChanged(device:Device, values:Array, timestamp:int) { switch(device.getId()) { case Action.VoiceRecognition.EVENT_TEXT: { var results:Array = values; } break; } } function handleDeactivate(evt:Event):void { action.deactivate(); action.dispose(); SmartRobot.deactivate(); }
음성 인식 결과에 따라 알버트 로봇을 앞뒤로 움직여 보도록 하자.
import flash.events.Event; import org.smartrobot.android.SmartRobot; import org.roboid.robot.Robot; import org.smartrobot.android.action.Action; import org.roboid.robot.Device; import kr.robomation.physical.Albert; NativeApplication.nativeApplication.addEventListener(Event.DEACTIVATE, handleDeactivate, false, 0, true); SmartRobot.setOnInitialized(onInitialized); SmartRobot.activate(); var leftWheelDevice:Device; var rightWheelDevice:Device; var action:Action = Action.obtain(Action.VoiceRecognition.ID); action.addDeviceDataChangedListener(onDeviceDataChanged); action.activate(); function onInitialized(robot:Robot):void { leftWheelDevice = robot.findDeviceById(Albert.EFFECTOR_LEFT_WHEEL); rightWheelDevice = robot.findDeviceById(Albert.EFFECTOR_RIGHT_WHEEL); } function onDeviceDataChanged(device:Device, values:Array, timestamp:int) { switch(device.getId()) { case Action.VoiceRecognition.EVENT_TEXT: { var results:Array = values; var len:int = results.length; var i:int; for(i = 0; i < len; ++i) { if(results[i] == "앞으로") { leftWheelDevice.write(20); rightWheelDevice.write(20); break; } else if(results[i] == "뒤로") { leftWheelDevice.write(-20); rightWheelDevice.write(-20); break; } } } break; } } function handleDeactivate(evt:Event):void { action.deactivate(); action.dispose(); SmartRobot.deactivate(); }
프로그램을 실행하고 스마트 폰의 마이크에 '앞으로' 또는 '뒤로'라고 말을 하면 알버트 로봇이 움직일 것이다.