瀏覽代碼

入队节点增加 车辆轴距记录,并在停车时更新测量轴距功能

zx 2 年之前
父節點
當前提交
afb1036242
共有 2 個文件被更改,包括 78 次插入2 次删除
  1. 77 2
      指令入队节点/PushCommand.py
  2. 1 0
      指令入队节点/node.py

+ 77 - 2
指令入队节点/PushCommand.py

@@ -6,7 +6,7 @@ import google.protobuf.text_format as tf
 import threading
 import datetime
 import uuid
-
+import math
 class CommandInfo:
     def __init__(self,type,table):
         self.type=type
@@ -190,6 +190,27 @@ class DBCommand():
                     time_mns=diff.total_seconds()/60
                     queue_id=int(last_num+1+ time_mns*1)
 
+                #停车入队前,按照库内轴距更新测量轴距值 --------------------------------------------
+                database_wheelbase=self.get_wheelbase(cursor,cmd.car_number)
+                new_wheelbase=cmd.entrance_measure_info.wheelbase
+                if database_wheelbase is not None:
+                    [wheelbase,delta]=database_wheelbase
+                    entrance_wheelbase=cmd.entrance_measure_info.wheelbase
+                    if abs(entrance_wheelbase-wheelbase)>0.1:  #与入口测量偏差过大,不更新
+                        print("车辆:%s 测量轴距与数据库相差太大(测量:%f 数据库:%f),不做融合,以测量为准"%(cmd.car_number,entrance_wheelbase,wheelbase))
+                    else:
+                        sum=(delta*delta)+0.05*0.05
+                        new_wheelbase=entrance_wheelbase*delta*delta/sum+wheelbase*(0.05*0.05)/sum
+                        print("车辆:%s 停车更新轴距:%f ,测量:%f,数据库:%f"%(cmd.car_number,new_wheelbase,entrance_wheelbase,wheelbase))
+                        new_measure_info=message.measure_info()
+                        new_measure_info.CopyFrom(cmd.entrance_measure_info)
+                        new_measure_info.wheelbase=new_wheelbase
+                        cmd.entrance_measure_info.CopyFrom(new_measure_info)
+
+                else:
+                    print("车辆:%s 不存在数据库轴距,使用测量轴距:%f"%(cmd.car_number,cmd.entrance_measure_info.wheelbase))
+                #-----------------------------------
+
                 SQL="insert into command_queue values('%s','%s',%d,%d,1,0,NULL,'%s', %d , NULL)"%(
                     cmd.car_number,cmd.primary_key,cmd.unit_id,queue_id
                     ,tf.MessageToString(cmd.entrance_measure_info,as_utf8=True), cmd.terminal_id )
@@ -197,8 +218,9 @@ class DBCommand():
                 #更新指令时间表,
                 dt=datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
                 SQL="update queue_number_data set last_number=%d,input_time=str_to_date('%s','%%Y-%%m-%%d %%H:%%i:%%S') where unit=%d"%(queue_id,dt,cmd.unit_id)
-
                 cursor.execute(SQL)
+
+
             self.conn.commit()
             cursor.close()
             return tf.MessageToString(cmd,as_utf8=True)
@@ -287,9 +309,62 @@ class DBCommand():
                         SQL="update queue_number_data set last_number=%d,input_time=str_to_date('%s','%%Y-%%m-%%d %%H:%%i:%%S') where unit=%d"%(queue_id,dt,unit_id)
                         cursor.execute(SQL)
 
+                        #取车指令入队完成,记录轴距信息
+                        self.update_wheelbase(cursor,cmd.car_number)
+
             self.conn.commit()
             cursor.close()
             return tf.MessageToString(cmd,as_utf8=True)
+    def update_wheelbase(self,cursor,car_number):
+        #取车指令入队成功,此处将车辆夹持杆轴距偏差按照 delta=0.03 更新  ----------------------------
+        #获取车辆表中的轴距信息
+        SQL="select actually_measure_info,plc_measure_info from vehicle where car_number='%s'"%car_number
+        cursor.execute(SQL)
+        records=cursor.fetchall()
+        act_info=message.measure_info() #入口测量数据
+        plc_info=message.measure_info() #plc反馈数据(夹持杆雷达)
+        clamp_wheelbase=None
+        if len(records)==1: #找到记录
+            if records[0][0] is not None and records[0][1] is not None:
+                tf.Parse(records[0][0],act_info)
+                tf.Parse(records[0][1],plc_info)
+                if abs(act_info.wheelbase-plc_info.wheelbase)<0.05: #入口数据与夹持数据相近,可靠,
+                    clamp_wheelbase=plc_info.wheelbase
+
+        #夹持数据存在,且可靠数据,存库,
+        if(clamp_wheelbase is not None):
+            SQL="select * from car_parameter where car_number='%s'"%car_number
+            cursor.execute(SQL)
+            records=cursor.fetchall()
+
+            update_wheelbase=clamp_wheelbase
+            update_delta=0.03
+            SQL="insert into car_parameter values('%s',%f,%f,%f,0.03)"%(car_number,update_wheelbase,update_delta,plc_info.width)
+            if len(records)==1:#有历史数据
+                wheel_base=float(records[0][1])
+                wheel_base_delta=float(records[0][2])
+                if abs(clamp_wheelbase-wheel_base)>0.05: #可能存在改装或者换牌,重置delta
+                    print("车辆:%s 可能存在换牌或者改装,重置轴距信息"%(car_number))
+                else:   #计算新值
+                    dcdc=update_delta*update_delta
+                    dd=wheel_base_delta*wheel_base_delta
+                    update_wheelbase=clamp_wheelbase*dd/(dcdc+dd)+wheel_base*dcdc/(dd+dcdc)
+                    update_delta=math.sqrt(dcdc*dd/(dcdc+dd))
+                    print("车辆:%s 更新数据库轴距:%.5f,标准差:%.5f"%(car_number,update_wheelbase,update_delta))
+                SQL="update car_parameter set wheelbase=%f,var_wheelbase=%f where car_number='%s'"%(update_wheelbase,update_delta,car_number)
+            else:
+                print("新车:%s 第一次光临,存入轴距:%f"%(car_number,update_wheelbase))
+            cursor.execute(SQL)
+    def get_wheelbase(self,cursor,car_number):
+        SQL="select * from car_parameter where car_number='%s'"%(car_number)
+        cursor.execute(SQL)
+        records=cursor.fetchall()
+        if len(records)==1:
+            wheelbase=float(records[0][1])
+            delta=float(records[0][2])
+            return [wheelbase,delta]
+        else:
+            return None
 
     @staticmethod
     def table_type(table):

+ 1 - 0
指令入队节点/node.py

@@ -53,6 +53,7 @@ def command_enqueue_callback(table):
 
 if __name__ == '__main__':
     #消费指令消息
+    print("入队节点启动----")
     cmd_callbacks=[["command_enqueue_queue",command_enqueue_callback]]
     g_rabbitmq.Init(cmd_callbacks,None)