首页>书剑共铸>工单中心>混合调度系统如何对接不同品牌的AGV

需要支持?

如果通过文档没办法解决您的问题,请提交工单获取我们的支持!

混合调度系统如何对接不同品牌的AGV

混合调度系统如何对接不同品牌的AGV

混合调度系统,对接不同品牌AGV通讯模型

当需要转换路径报文,一般是从IRouteItem的Decision里面取数据,但是Decision的API比较分散,且命名均已英文为主,现在我们为IRouteItem专门升级了“接口”API,所有导航路径单元的信息,在该API内均可以找到。

有了这些中文API数据,我们可以非常轻松的将导航路径转换为车体所需数据。

怎么对接Agv?

对接一辆Agv最基础也是最复杂的事情就是下发路径和接收上传信息。

对接其实就是从系统给出的一堆信息里面选一些车体需要的信息,编码发给他;然后从他回复的信息里,抽取系统需要的,解析传给系统。这就是车体对接。

下发路径

自主的进行路径规划及交通管制,最终生成带有运动控制决策的导航路径信息,这些决策涵盖了对于一辆Agv所有的控制信息,我们对接车体要做的,即是将这些数据按需转换为车体可以识别的数据即可!

简单来说,对接Agv车体并进行控制,最核心的工作就是下发车体所能识别的指令;提供了完整的运动控制决策,在以下所列数据中,用户一定可以筛选出所需的数据。但是这些数据无法直接使用,因为不同的车体控制协议对于数据的类型和编码方式均不相同,我们可以借助系统提供的各种转换API,很方便的实现数据编码的转换。

并且再次强调和重申定义,系统导航路径的含义:

导航路径(Route)指的是在现有普通路径的连接关系下,通过系统自带的路径规划算法及交通管制算法,计算出的当前Agv确认可以行驶的一段路径。记住,路径是地图元素(直线、曲线、弧线),导航路径可以理解为有方向的路径。导航路径是由一段一段有方向的路径构成,这一段一段的带有方向的子路径,我们称为导航路径单元(RouteItem)。更多概念参考路径规划。

每个导航路径单元内部都有本文所述的接口属性,该属性内部包含了这条导航路径单元的一切信息!

数据在哪?

混合调度系统如何对接不同品牌的AGV

如图所示,我们对一辆车进行导航规划。

混合调度系统如何对接不同品牌的AGV

选中导航成功的车辆,右键单击,在弹出的菜单中找到显示导航路径信息按钮。

混合调度系统如何对接不同品牌的AGV

将滚轮往下滚动,我们可以看到导航路径集合数组,该数组即是导航路径单元的接口数据。

脚本访问

我们在通讯报文中会注册GetNewRoutesEvent事件,该事件在AGV导航完成后被触发,该事件携带一个重要的事件参数Route。

Route是整段的导航路径,是确认路径部分,类型是IRoute。

Route携带了IRouteItem列表,称为Routes,IRouteItem是导航路径单元,简单来说,IRoute是由N段IRouteItem构成。

IRouteItem内部有一个重要接口,名字即为中文“接口”!

在这个接口中,我们可以访问到上述的图片所示的所有属性。

混合调度系统如何对接不同品牌的AGV

数据信息

这些信息其实是有类别的,比如路径信息、运动控制等。注意,当配置了辅助原点,以下所有信息都将按照辅助原点的配置进行自动转换!并且以下数据均是真实物理世界的量纲(米),所有与角度有关的数据都是角度[0~360]

运动控制类别:

⚪ 车速: 单位米/秒 [浮点数]

⚪ 进入站点: 进入站点的地标值 [字符串]

⚪ 离开站点: 离开站点的地标值 [字符串]

⚪ 需要旋转: 表示在进入站点是否需要先旋转 [布尔值]

⚪ 旋转角度: 当需要旋转时,单位度 [浮点数],值域范围 [-180 ~ 180],特殊情况下可能范围 [-360 ~ 360]。

⚪ 左转: 表示在进入站点是否需要先左转 [布尔值]

⚪ 右转: 表示在进入站点是否需要先右转 [布尔值]

⚪ 旋转180度: 表示在进入站点是否需要先旋转180度 [布尔值]

⚪ 旋转180度顺时针: 表示在进入站点是否需要先顺时针旋转180度 [布尔值]

⚪ 旋转180度逆时针: 表示在进入站点是否需要先逆时针旋转180度 [布尔值]

⚪ 工作角度: 表示从进入站点到离开站点,以车体哪一个面行驶,单位度,一般前进为0度,反向行驶为180度,左漂移为-90度,右漂移为90度 [浮点数]

⚪ 前进: 表示从进入站点到离开站点,以车体正面行驶 [布尔值]

⚪ 后退: 表示从进入站点到离开站点,以车体后面行驶 [布尔值]

⚪ 左漂移: 表示从进入站点到离开站点,以车体左侧面行驶 [布尔值]

⚪ 右漂移: 表示从进入站点到离开站点,以车体右侧面行驶 [布尔值]

⚪ 中间岔路: 表示当需要行在岔路口时,走中间的岔路,一般用于磁导航[布尔值]

⚪ 左岔路: 表示当需要行在岔路口时,走右侧岔路,一般用于磁导航[布尔值]

⚪ 右岔路: 表示当需要行在岔路口时,走左侧岔路,一般用于磁导航[布尔值]

⚪ 托盘随动: 表示车体旋转时,托盘跟着旋转,一般用于Kiva车型[布尔值]

⚪ 托盘需要旋转: 表示托盘需要旋转,一般用于Kiva车型[布尔值]

⚪ 托盘旋转角度: 表示托盘需要旋转的角度 [浮点数]

⚪ 托盘最终角度: 表示托盘旋转后的角度 [浮点数]

⚪ Agv起始角度: 表示Agv在进入站点未旋转前的角度 [浮点数]

⚪ Agv离开角度: 表示Agv到达离开站点的角度 [浮点数]

⚪ 即将停车_建议减速: 表示Agv到达离开站点后,将由于旋转、漂移或其他原因停车,推荐在此处控制车体速度 [布尔值]

⚪ 即将到达全程终点: 表示Agv当前的离开站点是整段路径的终点 [布尔值]

路径信息类别:

⚪ 路径长度: 表示当前导航路径单元所在路径的长度,单位米 [浮点数]

⚪ 路径驶入角度: 表示当前导航路径单元进入路径的角度,单位度 [浮点数]

⚪ 路径离开角度: 表示当前导航路径单元离开路径的角度,单位度 [浮点数]

⚪ 是直线: 表示当前导航路径单元所在的路径是直线类型[布尔值]

⚪ 是弧线: 表示当前导航路径单元所在的路径是圆弧类型[布尔值]

⚪ 是曲线: 表示当前导航路径单元所在的路径是三阶贝塞尔曲线类型[布尔值]

⚪ 进入站点坐标: 表示当前进入站点的坐标,类型Point,单位米 [Point类型]

⚪ 离开站点坐标: 表示当前离开站点的坐标,类型Point,单位米 [Point类型]

⚪ 曲线控制点1: 表示当前是贝塞尔曲线类型时,第一控制点的坐标,类型Point,单位米。 如果类型不是曲线,该数据为空。 [Point类型]

⚪ 曲线控制点2: 表示当前是贝塞尔曲线类型时,第二控制点的坐标,类型Point,单位米。 如果类型不是曲线,该数据为空。 [Point类型]

⚪ 圆弧起始角度: 表示当前是圆弧类型时,圆弧起始角度,单位度。 如果类型不是弧线,该数据为空。 [浮点数]

⚪ 圆弧终止角度: 表示当前是圆弧类型时,圆弧终止角度,单位度。 如果类型不是弧线,该数据为空。 [浮点数]

⚪ 圆弧半径: 表示当前是圆弧类型时,圆弧起始角度,单位度。 如果类型不是弧线,该数据为空。 [浮点数]

⚪ 圆弧圆心: 表示当前是圆弧类型时,圆心的坐标,类型Point,单位米。 如果类型不是弧线,该数据为空。 [Point类型]

⚪ 即将进入直线路径:表示下一段路径的类型是直线。 [布尔值]

⚪ 即将进入弧线路径:表示下一段路径的类型是弧线。 [布尔值]

⚪ 即将进入曲线路径:表示下一段路径的类型是曲线。 [布尔值]

⚪ 路径字符串:三种不同线形的路径字符串。 [字符串]

以上信息有很多,不代表我们对接每种车型,都需要使用。要根据车型特征或者车体协议,从以上信息中选择合适的数据使用。

对接不同的车体,我们常见的数据转换方式有两种:

  1. Json字符串

Json字符串类型的转换是特别简单的方式,我们可以使用如下所示代码组装数据报文:

foreach(var routeItem in e.Route.Routes){var jobj =newJObject();    jobj.Add(newJProperty("InMark", routeItem.接口.进入站点));    jobj.Add(newJProperty("OutMark", routeItem.接口.离开站点));    jobj.Add(newJProperty("Speed", routeItem.接口.车速));    jobj.Add(newJProperty("Rotate", routeItem.接口.需要旋转));    jobj.Add(newJProperty("RotateAngle", routeItem.接口.旋转角度));...}

C#

  1. 字节数组

字节数据类型转换需要具备一些数据类型的知识,如果需要位操作,还需要具备位的相关知识:

foreach(var routeItem in e.Route.Routes){var bytes =newList<byte>();int inMark = Convert.ToInt32(routeItem.接口.进入站点);    bytes.AddRange(BitConverter.GetBytes(inMark));int outMark = Convert.ToInt32(routeItem.接口.离开站点);    bytes.AddRange(BitConverter.GetBytes(outMark));    bytes.AddRange(BitConverter.GetBytes((ushort)routeItem.接口.车速 *1000));//放大1000倍,从 m/s 转换为 mm/s,确保转换为整数    bytes.Add(routeItem.接口.需要旋转 ==true?(byte)1:(byte)0);    bytes.AddRange(BitConverter.GetBytes((ushort)routeItem.接口.旋转角度));...}

C#

接收上传信息

除了下发路径外,车体上报的报文信息我们也需要正确接收,以下是相关接收API,同样的,不同车型采用的接收API需要根据协议内容或车体特性决定。

一般来说,我们会根据协议解析报文,大部分车体会具有以下多个信息的组合,我们需要通过接收API正确的将信息返回给系统。

混合调度系统如何对接不同品牌的AGV

接收信息

publicvoid 接收AGV坐标(Point point)//或publicvoidLocationRecv(Point point)

C#

用于接收Agv上传的坐标,一般用于SLAM或激光导航Agv、GPS定位Agv、二维码导航Agv等

publicvoid 接收位移距离(double distance)//或publicvoidDriveDistanceRecv(double distance)

C#

用于接收Agv单位时间的位移距离,一般用于二维码导航Agv或磁导航Agv等

publicvoid 接收到新地标(string mark)//或publicvoidNewMarkPointRecv(string mark)

C#

用于接收Agv收到的新地标,该函数十分关键,是告知系统当前导航路径单元已经完成的主要信息

publicvoid 接收Agv角度(double angle)//或publicvoidAngleRecv(double angle)

C#

接收Agv当前真实角度,将显示在设备监控栏中

publicvoid 电量接收(double battery)//或publicvoidBatteryRecv(double battery)

C#

接收Agv当前电量,值域范围是[0-100],将显示在设备监控栏中

publicvoid 电压接收(double voltage)//或publicvoidVoltageRecv(double voltage)

C#

接收Agv当前电压,单位V

publicvoid 车速接收(double speed)//或publicvoidSpeedRecv(double speed)

C#

接收Agv当前车速,将显示在设备监控栏中

publicvoid 告警接收(string msg,InfoWarningLevel level = InfoWarningLevel.Info,bool autoDisplayInSystemWarning =true,int autoDisposeTime =2)//或publicvoidWarningRecv(string msg,InfoWarningLevel level = InfoWarningLevel.Info,bool autoDisplayInSystemWarning =true,int autoDisposeTime =2)

C#

接收Agv当前告警信息,将显示在设备监控栏中

publicvoid 托盘旋转角度接收(double angle)//或publicvoidPalletRotateRecv(double angle)

C#

接收Agv当前托盘角度,一般不需要使用

执行动作相关

publicvoid 执行动作(string action,IRunTimeInfoCollection runtimes =null)//或publicvoidDoAction(string action,IRunTimeInfoCollection runtimes =null)

C#

该函数用于发起某一个动作,执行该函数,将触发Agv的DoAction事件

publicvoid 动作执行完成接收函数(string action)//或publicvoidDoActionRecv(string action)

C#

当Agv执行完某一个动作,并在上传报文中标识出该完成信号,我们使用该函数通知系统,之前通过DoAction下发的动作已经执行完成

publicvoid 动作执行完成回调函数(Action<string> callback)//或publicvoidDoActionCallback(Action<string> callback)

C#

可以为动作执行完成注册一个额外的回调函数

其他

publicvoid 通讯质量接收(double quality)//或publicvoidCommuQualityRecv(double quality)

C#

代表当前车体的通讯质量,值域[0-1],对应着设备监控栏的信号图标,0为空格,1为满格信号

publicasync System.Threading.Tasks.Task 通讯质量评估()//或publicasyncSystem.Threading.Tasks.TaskCommuQualityEvaluate()

C#

通过异步Ping手段进行通讯质量评估,当车体信息不包含通讯质量信息时,并且通讯媒介是IP协议时,可以采用该方案自动侦测通讯质量

publicvoid 设置临时变量值<T>(string name,Tvalue)//或publicvoidSetVar<T>(string name,Tvalue)

C#

作为脚本互通的变量,调度系统提供了大量的数据手段,该方案目前不推荐

public T 读取临时变量值<T>(string name)//或publicTGetVar<T>(string name)

C#

作为脚本互通的变量,调度系统提供了大量的数据手段,该方案目前不推荐

publicbool 可以导航到(string mark)//或publicboolCanRoute(string mark)

C#

测试当前Agv是否可以导航到某个点

publicvoid 货物区域旋转(double angle,string cargoAreaName =null)//或publicvoidChangeCargoAreaAngle(double angle,string cargoAreaName =null)

C#

旋转车体的货物区域角度

Agv的API信息

publicdouble 当前电量publicdouble 当前车速publicbool 已连接publicbool 当前空闲publicstring 通讯单元连接状态publicint 立库当前所在楼层publicbool 在立库电梯中publicbool 在立库中publicstring 目标站点publicstring 当前所在站点

C#

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
❯
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索