超级quhaihua 超级quhaihua
关注数: 10 粉丝数: 86 发帖数: 995 关注贴吧数: 39
关于类的super()的同属理解 类可以继承,上一级的叫父类,parent,继承的小子就叫child,下面我们定义一个父类先: class parent: def pay(self): paymoney 老子里面定义了一个方法叫买单:pay() 然后我们再定义一个儿子: class child(parent): def buycar(self): 让老子买单 小子里面有个行为叫买车,怎么买呢,当然是让老子掏钱,调用老子的买单方法,那有两种方法 这里是第一种 def buycar(self): parent.pay() 这种方法就是,儿子叫张三,老子叫张二,这个行为就是让张二买单,下面还有另一种方法: def buycar(self): super(child,self).pay() 这种方法就是,儿子叫张三,让张三的老子买单! 看到这里大家就知道, 有时候老子万一躲情人或者躲债,把名字换了,那第一种方法中让张二买单,就找不到张二这个人,但是不管他怎么改,他总归是张三的儿子,所以用super()还是有效的。 除了这个区别,其实还有一点区别,我扯不下去了,直接复制黏贴别人的代码大家研究一下吧: 代码一: class A: def __init__(self): print("Enter A") print("Leave A") class B(A): def __init__(self): print("Enter B") A.__init__(self) print("Leave B") class C(A): def __init__(self): print("Enter C") A.__init__(self) print("Leave C") class D(A): def __init__(self): print("Enter D") A.__init__(self) print("Leave D") class E(B, C, D): def __init__(self): print("Enter E") B.__init__(self) C.__init__(self) D.__init__(self) print("Leave E") E() 结果: Enter E Enter B Enter A Leave A Leave B Enter C Enter A Leave A Leave C Enter D Enter A Leave A Leave D Leave E 执行顺序很好理解,唯一需要注意的是公共父类A被执行了多次。 代码二: class A: def __init__(self): print("Enter A") print("Leave A") class B(A): def __init__(self): print("Enter B") super(B, self).__init__() print("Leave B") class C(A): def __init__(self): print("Enter C") super(C, self).__init__() print("Leave C") class D(A): def __init__(self): print("Enter D") super(D, self).__init__() print("Leave D") class E(B, C, D): def __init__(self): print("Enter E") super(E, self).__init__() print("Leave E") E() 结果: Enter E Enter B Enter C Enter D Enter A Leave A Leave D Leave C Leave B Leave E 在super机制里可以保证公共父类仅被执行一次,至于执行的顺序,是按照mro进行的(E.__mro__)。
求助!在arduino上用PID库文件写了代码不能运行,用的c++ 先贴我的程序代码: 没有OUTPUT输出,555555…… #include "PID_v1/PID_v1.h" /*陀螺仪使用的定义变量*/ unsigned char Re_buf[11],counter=0; unsigned char sign=0; /*电机使用定义的变量*/ int motor_a1=9; int motor_a2=8; int motor_b1=6; int motor_b2=7; int ena=10; int enb=11; /*定义PID库使用的参数*/ double Setpoint, Input, Output; double kp,ki,kd; /*定义PID程序*/ PID myPID(&Input, &Output, &Setpoint,kp,ki,kd, DIRECT); /*初始化*/ void setup() { Serial.begin(115200); //初始化串口速率 /*配置电机针脚为输出*/ pinMode(motor_a1,OUTPUT); pinMode(motor_a2,OUTPUT); pinMode(motor_b1,OUTPUT); pinMode(motor_b2,OUTPUT); myPID.SetMode(AUTOMATIC); //配置PID为自动模式 myPID.SetSampleTime(100); //配置PID采样率为100毫秒 Setpoint = -4.1; //设置小车平衡点角度 } /*主函数*/ void loop() { if (sign==0) return; //sign为数据更新标志,每隔10ms更新一次,也就是说以下代码每隔10ms控制一次 sign=0; getkpkikd(); //获取kp,ki,kd的值 myPID.Compute(); //PID运算 SetMotor(Output); //控制电机 cout2serial() ; //串口输出需要查看的数据 } /*获取kp,ki,kd的值的函数*/ void getkpkikd(){ kp=(double)analogRead(0)/1024*200; ki=(double)analogRead(1)/10240; kd=(double)analogRead(2)/1024*400; } /*控制电机运行的函数*/ void SetMotor(float Output) { if (Output>0){ pinMode(motor_a1,HIGH); pinMode(motor_a2,LOW); pinMode(motor_b1,HIGH); pinMode(motor_b2,LOW); analogWrite(ena,Output); analogWrite(enb,Output); } else if (Output<0) { pinMode(motor_a1,LOW); pinMode(motor_a2,HIGH); pinMode(motor_b1,LOW); pinMode(motor_b2,HIGH); analogWrite(ena,abs(Output)); analogWrite(enb,abs(Output)); } else { ; } } /*输出串口数据的函数*/ void cout2serial() { Serial.print("angle:"); Serial.print(Input);Serial.print(" "); Serial.print("output:"); Serial.print(Output);Serial.print(" "); Serial.print("kp:"); Serial.print(kp);Serial.print(" "); Serial.print("ki:"); Serial.print(ki);Serial.print(" "); Serial.print("kd:"); Serial.print(kd);Serial.println(" "); } void serialEvent() { while (Serial.available()) { Re_buf[counter]=(unsigned char)Serial.read(); if(counter==0&&Re_buf[0]!=0x55) return; //第0号数据不是帧头 counter++; if(counter==11) //接收到11个数据 { counter=0; //重新赋值,准备下一帧数据的接收 switch(Re_buf [1]) { case 0x51: break; case 0x52: break; case 0x53: Input= double(short(Re_buf [3]<<8| Re_buf [2]))/32768*180; sign=1; break; } } } }
【项目发起】尝试和我一起做一个平衡车 写这个文章的目的是记录自己学习arduino的历程,同时帮助需要的人少走点弯路。 做一个平衡小车需要哪些东西呢?既然要平衡,那就需要一个计算角度的东西,还要一对能行走的电机带轮子,那电机就可以用单片机驱动啦。 思路: 获取小车目前的状态(倾斜角度值——input_angle),用这个角度值和小车能够稳定的角度值(setpoint)比较,得出偏差角度值(error),把这个偏差转换成PWM信号,用PWM驱动电机修正,当偏差角度值等于0的时候,这个时候小车就稳定下来了。 选材: 1.直流减速电机一对,减速比有1:48,1:120和1:288的,开工之前我在某论坛上看到某位前辈说他用的288减速度的小车抖动,可能和减速比有关系,我就选择了1:120的,牺牲一点速度获取扭矩。2.6050陀螺仪,获取角度的利器,这个6050用在小车上是浪费,因为可以输出3轴加速度和3轴角速度,共六轴的数据,用时间和温度偏差,结合加速度和角速度计算出角度,用在多轴上也够用了,但是用它来做小车只需要一个角度的输出,所以我说大才小用了。3. Arduino单片机,这里是arduino吧肯定是用这个吧?况且arduino是新手之手,简单方便。到这里其实差不多了,但是还需要一个东西,那就是电机驱动器,原因是这样的,arduino的板子最大只能输出40MA的电流,这个功率对我们的电机来说是不够,所以需要一个驱动器来给电机供电,单片机只要给驱动器发出行动指令就行了。买的时候要注意一点,需要带光耦隔离,至于光耦隔离的作用请大家自行百度,有这个功能有好处没坏处。
【求教】程序中执行顺序和函数调用的情况,新手求教。 unsigned char Re_buf[11],counter=0; unsigned char sign=0; float a[3],w[3],angle[3],T; void setup() { Serial.begin(115200); } void loop() { if(sign) { sign=0; if(Re_buf[0]==0x55) //检查帧头 { switch(Re_buf [1]) { case 0x51: break; case 0x52: break; case 0x53: angle[0] = (short(Re_buf [3]<<8| Re_buf [2]))/32768.0*180; angle[1] = (short(Re_buf [5]<<8| Re_buf [4]))/32768.0*180; angle[2] = (short(Re_buf [7]<<8| Re_buf [6]))/32768.0*180; T = (short(Re_buf [9]<<8| Re_buf [8]))/340.0+36.25; Serial.print("angle:"); Serial.print(angle[0]);Serial.print(" "); Serial.print(angle[1]);Serial.print(" "); Serial.print(angle[2]);Serial.print(" "); Serial.print("T:"); Serial.println(T); break; } } } } void serialEvent() { while (Serial.available()) Re_buf[counter]=(unsigned char)Serial.read(); if(counter==0&&Re_buf[0]!=0x55) return; //第0号数据不是帧头 counter++; if(counter==11) //接收到11个数据 { counter=0; //重新赋值,准备下一帧数据的接收 sign=1; } } } 以上是我买的6050自带卡尔曼的arduino程序经过我简化过的,主要是我只要三个角度输出所以把其他输出删掉了,现在我看了下程序有些看不懂的地方所以想问一下大家 按我的理解程序是从上往下执行的,unsigned char Re_buf[11],counter=0;开始往下,然后经过void setup()这里执行一遍,就开始执行void loop(),然后一直在LOOP里面循环执行。 但是在void loop() 下面还有一个void serialEvent() ,而且在loop程序里面找不到调用serialEvent()的地方,这样的话这个serialEvent() 不是永远没有机会被执行吗?但是要是把它删了又不对,求教我的理解错哪里了呢?
首页 1 2 下一页