梯控系统
注意:
- 梯控机器人地图定位成功
- 梯控机器人必须建立巡线
- 梯控机器人必须处于巡线的点位之上
- 梯控机器人的地图不能使用复制的地图,会造成点位ID,楼层冲突,无法到达
导航乘梯
组件名称: NavigationElevatorComponent
组件描述: 导航乘梯组件,用于控制机器人前往指定位置点。
使用示例:
//DeliveryScreen类文件 import DeliveryElevatorViewModel from './DeliveryElevatorViewModel'; public constructor(props: BaseComponentProps) { super(props); let viewModel = new DeliveryElevatorViewModel(props); this.setViewModel(viewModel); let voice = new DeliveryVoice(viewModel); this.setVoice(voice); } public render() { return ( <> <NavigationElevatorComponent param={this.viewModel.getNavigationElevatorParams()} onStatusUpdate={this.viewModel.handleNaviStatus} onFinish={this.viewModel.handleNaviFinish} /> </> ); }
//DeliveryElevatorViewModel文件 /** *获取导航参数 */ import { NavigationElevatorParam, } from 'orionos-eve-core'; public getNavigationElevatorParams(): NavigationElevatorParam { return new NavigationElevatorParam ( floorIndex + '', //floorIndex 楼层序号,手动设置固定值 poseName //poseName地点名称,手动设置固定值 ); } /** *导航状态处理 *@param event */ public handleNaviStatus = (event?: ComponentEvent): boolean => { console.log(TAG, 'On navigation status update : ' + JSON.stringify(event)); if (!(event && event.status)) { return false; } let subType = this.getEventSubType(event); switch (event.status) { case 32730022: this.reportInvalidEvent(DeliveryInvalidEvent.EVENT_TYPE_AVOID_START, subType); return true; case 32730001: // DanceOperation.playLightEffect(LIGHT_EFFECT_TYPE.LIGHT_EFFECT_NAVI_BREATH); this.state.setState(State.CRUISING); return true; case 32730002: if (settingStore.getIsOpenDemoSwitch) { return true; } //梯控导航,不处理传统的避障超时 //this.handleAvoidingEvent(event, subType); return true; case 32730011: if (settingStore.getIsOpenDemoSwitch) { return true; } this.handleAvoidStartEvent(); return true; case 32730003: if (settingStore.getIsOpenDemoSwitch) { return true; } this.handleAvoidEndEvent(event, subType); return true; case -32620015: this.waitInPlace(); return true; case 32730004: this.handleObstaclesEvent(event, subType); return true; case 32750004: //进电梯,到达电梯门 this.handleArriveElevatorDoor(); return true; case 32750005: //进电梯,到达电梯中心,开始转向 this.handleArriveElevatorCenterAndStartTurn(); return true; case 32750023: //进电梯,到达电梯中心,转向完成 return true; case 32750009: //出电梯,离开电梯门 this.handleExitElevatorDoor(); return true; case 32750008: //出电梯,离开电梯中心 this.handleLeaveElevatorCenter(); return true; case 32750003: //进电梯,从电梯口去电梯中心 this.handleEnterElevator(); return true; default: return false; } }; /** *导航结束事件处理 *@param event */ public handleNaviFinish = (event?: ComponentEvent): boolean => { console.log(TAG, 'On navigation finish : ' + JSON.stringify(event)); if (!(event && event.status)) { return false; } // DanceOperation.playLightEffect(LIGHT_EFFECT_TYPE.LIGHT_EFFECT_BLUE_LIGHT); let subType = this.getEventSubType(event); switch (event.status) { case 32610007: this.handleNaviArrivedEvent(event); return true; case -32620015: this.handleNaviArrivedEvent(event, false); return true; case -32610004: case -32620007: case -32620008: //navigation moving time out case 32610009: case -32620006: case -32660015: //enter elevator failed this.reportInvalidEvent(DeliveryInvalidEvent.EVENT_TYPE_DESTINATION_UNREACHABLE, subType); this.waitInPlace(); return true; case -32620009: this.reportInvalidEvent(DeliveryInvalidEvent.EVENT_TYPE_DESTINATION_UNREACHABLE, subType, I18n.t('ttsNavigationGlobalPathFailedPleaseEditMap')); this.showNaviError(subType); return true; case -32620014: case -32600001: case -32600002: this.showNaviError(subType); return true; case -32620002: this.reportInvalidEvent(DeliveryInvalidEvent.EVENT_TYPE_OUT_MAP, subType, I18n.t('ttsNavigationOutMap')); this.showNaviError(subType, true); return true; case -32620001: this.handleNotEstimateEvent(subType); return true; case -32620029: this.reportInvalidEvent(DeliveryInvalidEvent.EVENT_TYPE_MULTI_ROBOT_WAIT_TIMEOUT, subType, I18n.t('nav_waitTimeout_tts')); this.showNaviError(subType, false, true); return true; case -32650006: this.reportInvalidEvent(DeliveryInvalidEvent.EVENT_TYPE_MULTI_ROBOT_ERROR, subType, I18n.t('nav_multiRobotError_tts')); this.showNaviError(subType, false, false, true); return true; case -32620030: this.handleRobotWheelError(subType); return true; case -32660021: //梯控多楼层导航,地图错误 this.showNaviError(NavErrorConst.NAVI_ERROR_ELEVATOR_MAP_RONG); return true; default: this.showNaviError(subType); return false; } }; private getEventSubType(event: ComponentEvent) { let eventSubType = 0; if (event.extraData) { let extraData = JSON.parse(event.extraData); let code = extraData.code; console.log(TAG, ' onStatusUpdate code: ' + code); if (code) { eventSubType = code; } } return eventSubType; }
属性:
- param:组件参数,类型为NavigationElevatorParam
- onStatusUpdate:组件状态回调
- onFinish:组件执行结束回调
参数说明:
- floorIndex:楼层,必填项,不能为空,否则会抛出崩溃异常
- poseName:地点名称
状态说明:
通过ComponentEvent.status获取到状态码:
- 32730022:报告非法事件,常量定义ComponentStatusConst.STATUS_NAVIGATION_AVOID_IMMEDIATELY
- 32730001:开始导航,常量定义ComponentStatusConst.STATUS_START_NAVIGATION
- 32730002:梯控导航,不处理传统的避障超时,常量定义ComponentStatusConst.STATUS_NAVIGATION_AVOID
- 32730011:处理避障开始事件,常量定义ComponentStatusConst.STATUS_NAVIGATION_AVOID_START
- 32730003:处理避障结束事件,常量定义ComponentStatusConst.STATUS_NAVIGATION_AVOID_END
- -32620015:原地停留,常量定义ComponentErrorConst.ERROR_NAVIGATION_ALREADY_IN_DESTINATION
- 32730004:处理避停状态,常量定义ComponentStatusConst.STATUS_OBSTACLES_AVOID
- 32750004:进电梯,到达电梯门
- 32750005:进电梯,到达电梯中心,开始转向
- 32750023:进电梯,到达电梯中心,转向完成
- 32750009:出电梯,离开电梯门
- 32750008:出电梯,离开电梯中心
- 32750003:进电梯,从电梯口去电梯中心
结果说明:
通过ComponentEvent.status获取到结果码:
- 32610007:到达事件处理,常量定义 ComponentResultConst.RESULT_NAVIGATION_ARRIVED
- -32620015:已在目标位置点,常量定义ComponentErrorConst.ERROR_NAVIGATION_ALREADY_IN_DESTINATION
- -32610004:位置点名称无效,常量定义 ComponentErrorConst.ERROR_PARAMS_PLACE_NAME_INVALID
- -32620007:目标点不存在,常量定义 ComponentErrorConst.ERROR_DESTINATION_NOT_EXIST
- -32620008:目标点移动超时,常量定义 ComponentErrorConst.ERROR_DESTINATION_CAN_NOT_ARRIVE
- 32610009:底盘启动导航任务失败,常量定义 ComponentResultConst.RESULT_NAVIGATION_FAILURE
- -32620006:避让超时,常量定义 ComponentErrorConst.ERROR_REQUEST_RES_BUSYComponentErrorConst.ERROR_NAVIGATION_AVOID_TIMEOUT
- -32660015:进入电梯失败
- -32620009:全局路径规划失败,常量定义 ComponentErrorConst.ERROR_NAVIGATION_GLOBAL_PATH_FAILED
- -32620014:尝试重定位失败,常量定义 ComponentErrorConst.ERROR_NAVIGATION_RESET_ESTIMATE_FAIL
- -32600001:请求结果繁忙,常量定义 ComponentErrorConst.ERROR_REQUEST_RES_BUSY
- -32600002:请求结果失败,常量定义 ComponentErrorConst.ERROR_REQUEST_RES_FAILED
- -32620002:超出地图范围,常量定义 ComponentErrorConst.ERROR_NAVIGATION_OUT_MAP
- -32620001:没有定位,常量定义 ComponentErrorConst.ERROR_NOT_ESTIMATE
- -32620029: 多机器人等待超时,常量定义ComponentErrorConst.ERROR_MULTI_ROBOT_WAITING_TIMEOUT
- -32650006:多模式错误,常量定义ComponentErrorConst.ERROR_MULTIPLE_MODE_ERROR
- -32620030: 轮子过流,常量定义ComponentErrorConst.ERROR_WHEEL_OVER_CURRENT_RUN_OUT
- -32660021:梯控多楼层导航,地图错误
注意:开发中请使用常量定义进行结果及状态判断,以上出现的返回码在后续版本中有可能会发生变更
最低版本: 2.33.0
适用平台:
豹小秘 | mini | 招财豹 | 豹小递max | 豹小秘DP | 消杀豹 |
---|---|---|---|---|---|
否 | 否 | 否 | 否 | 否 | 是 |
充电乘梯
组件名称: ChargeElevatorComponent
组件描述: 乘梯充电组件,用于控制机器人前往不同楼层充电。
使用示例:
//ChargeProvider类文件 import {ChargeStartComponent,ChargeElevatorComponent,ChargeElevatorParam} from 'orionos-eve-core'; @observer export class ChargeProvider<Props extends BaseComponentProps> extends BaseComponent<BaseComponentProps, ChargeViewModel, ChargeVoice> { private chargeElevatorParam: ChargeElevatorParam; private chargeComponentRef: RefObject< ChargeStartComponent > = React.createRef(); public constructor(props: any) { super(props, false); console.log(TAG, 'constructor prop is ' + JSON.stringify(props)); this.viewModel = new ChargeViewModel(props); let voice = new ChargeVoice(this.viewModel); this.setViewModel(this.viewModel); this.setVoice(voice); this.chargeStartParam = new ChargeStartParam( undefined, undefined, undefined ); this.chargeElevatorParam = new ChargeElevatorParam( undefined, undefined, undefined ); } public render() { return ( <> <ChargeElevatorComponent ref={this.chargeComponentRef} param={this.chargeElevatorParam} onStatusUpdate={ this.viewModel && this.viewModel.onStatusUpdate } onFinish={ this.viewModel && this.viewModel.onChargeFinish } /> <> ); } }
//ChargeViewModel文件 public onStatusUpdate = (event?: ComponentEvent): boolean => { console.log(TAG, 'onStatusUpdate', event); if (event) { switch (event.status) { case 32730001 DanceOperation.playLightEffect( LIGHT_EFFECT_TYPE.LIGHT_EFFECT_NAVI_BREATH ); break; default: break; } } return false; }; public onChargeFinish = (event?: ComponentEvent): boolean => { console.log(TAG, ' onChargeFinish', event); DanceOperation.playLightEffect( LIGHT_EFFECT_TYPE.LIGHT_EFFECT_BLUE_LIGHT ); if (event && event.status) { switch (event.status) { case 32610001: console.log(TAG, 'Charge success'); chargeStore.setIsChargeEnable(false); this.toMain(); break; case -32620001: console.log(TAG, 'charge ERROR_NOT_ESTIMATE'); Broadcast.sendBroadcast('action_reposition', { repositionVision: true }); break; case -32620023: case -32600007: case -32600008: case -32600009: console.log(TAG, 'Charge fail. retry Without Forward...'); chargeStore.setIsChargeEnable(false); chargeStore.setIsChargeEnable(true); break; default: console.log(TAG, 'Charge error', event.status); chargeStore.setIsChargeEnable(false); this.retryCharge(); break; } } return true; };
属性:
- ref: RefObject<ChargeStartComponent> = React.createRef();
- param:组件参数,new ChargeElevatorParam(undefined, undefined, undefined);
- onStatusUpdate:组件状态回调
- onFinish:组件执行结束回调
状态说明:
通过ComponentEvent.status获取到状态码:
- 32730001:开始导航,常量定义ComponentStatusConst.STATUS_START_NAVIGATION
结果说明:
通过ComponentEvent.status获取到结果码:
- 32610001:充电成功,常量定义 ComponentResultConst.RESULT_SUCCESS
- -32620001:没有定位,常量定义ComponentErrorConst.ERROR_NOT_ESTIMATE
- -32620023:充电位置不能到达,常量定义 ComponentErrorConst.ERROR_CHARGE_POINT_CAN_NOT_ARRIVE
- -32600007:导航超时,常量定义 ComponentErrorConst.ERROR_CHARGE_START_NAVI_TIMEOUT
- -32600008:充电开始解析错误,常量定义 ComponentErrorConst.ERROR_CHARGE_START_PARSE_IN_LOCATION
- -32600009:尝试充电未移动,常量定义 ComponentErrorConst.ERROR_CHARGE_START_NOT_MOVE
注意:开发中请使用常量定义进行结果及状态判断,以上出现的返回码在后续版本中有可能会发生变更
最低版本: 2.33.0
适用平台:
豹小秘 | mini | 招财豹 | 豹小递max | 豹小秘DP | 消杀豹 |
---|---|---|---|---|---|
否 | 否 | 否 | 否 | 否 | 是 |
获取多楼层点位
组件名称: getMultiFloorConfigAndPose
组件描述: 获取多楼层点位列表。
使用示例:
console.log(TAG, 'getElevatorPlaceList()'); let action = new CommandListener(); action.addListener(CommandListener.EVENT_RESULT, (msg: any) => { console.log(TAG, 'getElevatorPlaceList data : ' + JSON.stringify(msg)); if (msg && typeof msg !== 'undefined') { if (msg) { let code = msg.result; let placeList = msg.message; if(code === 1 && placeList){ this.processElevatorFloorData(placeList); } } } else { console.log(TAG, 'current ElevatorPlaceList is not exits'); } }); RobotApi.getMultiFloorConfigAndCommonPose(action.getId()); //数据结构示例: [ { "availableElevators": [ //该地图使用的电梯名称 "1梯", "2梯" ], "floorId": 26, //数据主键ID,自增长 "floorIndex": 1, //楼层id,lora发送给梯控时使用的楼层id "floorState": 1, //楼层类型,主楼层 默认的配送楼层,默认值0,主楼层1 "floorAlias": "1层", //楼层名称 "mapId": "b6fc75006f443c61bc32cdffa66a395c", //地图ID "mapName": "地图名1", //地图名称 "poseList": [//站点列表 { "name": "接待点" }, { "name": "会议室" }, { "name": "办公室" } ] }, { "availableElevators": [ "1梯", "2梯" ], "floorId": 27, "floorIndex": 2, "floorState": 0, "floorAlias": "2层", "mapId": "b6fc75006f443c61bc32cdffa66a395d", "mapName": "地图名2", "poseList": [ { "name": "接待点" }, { "name": "会议室" }, { "name": "办公室" } ] } ]
注意:开发中请使用常量定义进行结果及状态判断,以上出现的返回码在后续版本中有可能会发生变更
最低版本: 2.33.0
适用平台:
豹小秘 | mini | 招财豹 | 豹小递max | 豹小秘DP | 消杀豹 |
---|---|---|---|---|---|
否 | 否 | 否 | 否 | 否 | 是 |