回头看我的2008

2008年个人成长与挑战

弹指间2008年已经成为了历史,趁元旦放假的时间,也稍微整理下自己的思绪,回头把自己在年初写的那篇blog:《 08年TODO List -- 贵在坚持》翻出来再看来下,对照自己这一年来做的事情,结果发现:当时给自己设定的几个目标竟然一个都没有完全做好!真是汗颜!

其实,在08年初写TODO List的时候就已指出:贵在坚持!看似简单的几件事情要想坚持下来还真的是很难,只能期待来年啦!幸好这不是KPI考核,要是这样偶就彻底挂啦,呵呵!现在回顾下整个2008,自己觉得也不是那么差,还是成长不少,各个Q中主要的一些事情和关键词有:

  1. Q1:探路IST
    由于公司战略的调整,我们的网店被无情的咔嚓掉了,虽然我们很不舍,但还是用良好的心态去“拥抱变化”了;我们整个团队加入了AEP平台,我加入了IST团队(Independent Software Vendor Support Team),主要的任务是帮助ISV能够快速的接入到我们的AEP平台上;应该说这次经历很不错,帮助IST解决了以前无法解决的一些问题,并让IST的支持能力、技术能力得到了很大的提升;我也因此而接触到更多的语言、更多的技术;博客中关于Security、WS、WS-S、.Net、Php、Python、加密解密、签名、证书等相关知识点的能力都在那个阶段不断得到提升;
  2. Q2:尝试SQA,但失败!
    很快,IST保姆式的support完全不能适应AEP平台的发展,于是我们推出了自由ISV和REST API,让接入平台更加简单、快捷!我在IST的任务也圆满完成;随后研发中心打算规范开发流程尝试引入SQA,于是我又加入了虚拟的SQA团队,可惜经过几个月的尝试,收效甚微,推广的阻力很大,于是乎最后也变得不了了之;对于此事在Q2是完全失败的!
    不过由于在做SQA过程中并比如以前做项目开发时那么忙,所以有很多时间去参加很多的培训,不管是集团内部的,还是外部的一些会议或培训,收获还是很多;比如博客中关于《流程管理》、《项目管理》、《沟通技巧》、《敏捷实践》等等都让我的思维经历了洗礼;
  3. Q3:加入集市团队站稳脚跟、并总结出自己工作中的三条指导原则
    经历了Q2的失败,我的老大很快和我就日后的发展交换了意见,最后决定让我加入AEP的另外一个团队:集市;于是又开始了艰难的团队融合阶段,虽然说前期已经有思想准备(主要是对团队内部沟通协作),但在实际过程中还是遭遇了很多自己不曾想到的困难(主要指和PD团队成员、以及相关合作、依赖的开发团队成员间的沟通与协作),于是就有了黑色9月!幸好这一切都过去了,自己没有被壁垒、隔阂所打倒,虽说磕磕碰碰,但还算是达成目标:站稳脚跟;
    对于我来说还有另外一件大事:首次和新的老板谈到了我自己总结的工作中三条指导原则,也是目前为止唯一的一次,本来打算在12月份的研发中心管理论坛中分享下,但是由于时间关系及其他原因,那次分享被delay了;其实这几条原则在之前已经有了雏形,只不过没有明确化;至于说是哪三条原则,我还是决定写在博客中,敬请关注;
  4. Q4:发光发热、影响力!
    经过一个Q的融合期,和团队内部、外部人员的一些磨合期也差不多了,Q4还是挺顺利的,也领导多个团队一起完成了一些比较重要、有意义的大项目;原本推崇的一些做法和思维方式也被更多人员所接受、更多的被大家所认可;对外也承担起更多的责任;
    另外一个不得不提的是全新的Notify异步处理系统,借助《订购优化》的项目终于说服老板和项目组员;真正编码的那几天时间值得回味、一个Q中能有这么爽的几天已经没法要求更多了!在此期间,我们的另外一个团队E网打进也在考虑使用异步处理系统,经过沟通和协调、预研等不懈努力之后,他们还是决定采用我们的Notify系统,这对我来说真的是个天大的好消息,让我大受鼓舞;公司内部以前也搞了很多基础性的项目和框架,但到目前为止能够让各个开发团队真正用得爽的,MS还没有,我希望新的Notify系统能够改变这一历史,成为第一个让大家真正用得舒服的基础组件!

总结起来,个人觉得08年可以用两个关键词来概括:拥抱变化、抗住!换了好几个部门、尝试了好几种以前不曾担任过的角色、放弃了心爱的网店、在不断变化的过程中,不断对自己说:要抗住、别放弃、明天会好的!因为一个《抗》字,我挺过了黑色9月!有时候真的在想,这么多的汉字里面最有意思、最有内涵、最为形象的就是这个 抗 字了!这和年初确立的基调:坚持;还是非常匹配的,相信09年该词还会产生更多的故事,期待……

<think> 我们被要求查看一段包含PID算法和舵机、电机控制的代码。代码中有一个PID算法函数`PIDsuanfa()`和一个控制车辆运动的函数`car_go()`。 引用[1]和[2]提供了关于PID控制器的一些背景信息,特别是引用[2]给出了PID控制的标准公式:$u(t) = K_p×e(t) + K_i×\int e(t)dt + K_d×\frac{de(t)}{dt}$。 分析代码: 1. 在`PIDsuanfa()`函数中: - 计算中线位置:`zhongxian=(such_right[30]+such_left[30])/2;` - 计算位移(偏差):`weiyi=zhongxian-50;` 这里50可能是中心位置(假设图像宽度为100,中心在50处)。 - 设置了一个系数k=250,kp=1.2,kd=0(注意ki没有出现,所以这里只有比例和微分项,且微分项系数为0,实际上只有比例控制)。 - 计算误差:`erro=k*(weiyi/100);` 这里将位移偏差归一化(除以100)然后乘以系数k,得到一个新的误差量。 - 计算舵机角度:`dajiao=erro*kp+kd;` 注意这里kd是0,所以实际上就是`dajiao=erro*kp`。但是这里没有微分项的计算,因为kd=0。而且也没有积分项。 2. 在`car_go()`函数中: - 舵机控制:`pwm_set_duty(TIM1_PWM_MAP0_CH1_A8, 750+dajiao);` 这里的750可能是舵机的中值,然后加上计算出的`dajiao`(角度调整值)来改变舵机角度。 - 两个电机控制:这里设置占空比为0,所以电机不转。实际使用时可能需要根据情况调整。 问题: 1. 这个PID算法实际上只有比例控制(P),因为积分项(I)和微分项(D)都没有使用(Ki和Kd都没有参与计算,并且Kd=0)。这可能是一个简单的比例控制器。 2. 在计算误差时,先对位移偏差进行了归一化(除以100),然后乘以一个系数k(250),再乘以kp(1.2)。这样做的目的可能是将归一化的位移偏差放大到一个合适的控制量范围。 3. 舵机控制中,750是一个基准占空比,加上计算出的控制量`dajiao`。需要注意的是,舵机的控制信号通常是脉冲宽度,这里用占空比表示。750这个值需要根据舵机的具体规格来定(比如舵机控制周期为20ms,那么占空比0.5ms到2.5ms对应0°到180°,但具体到占空比值需要根据定时器的设置来转换)。 4. 电机没有转动,可能是代码示例中为了安全起见,或者需要根据其他条件来设置。 建议: 1. 如果希望使用完整的PID控制,可以考虑引入积分项和微分项。注意积分项需要累加,微分项需要当前误差和上一次误差的差值。 2. 注意积分饱和问题,以及微分项对噪声敏感的问题。 3. 调整参数kp, ki, kd(即代码中的kp,kd和需要增加的ki)时,需要根据实际系统响应进行调试。 4. 在舵机控制中,注意控制量的范围,防止超出舵机允许的范围。例如,如果舵机占空比范围是500到2500,那么750+dajiao应该在500到2500之间。这里750+dajiao,由于dajiao是经过比例计算的值,需要确保不会超出范围。 代码修改建议(如果需要完整的PID): 我们可以参考引用[1]中的结构体来存储PID状态(误差积分、上一次误差等)。当前代码中,只有当前的控制量计算,没有保存历史状态,所以无法实现积分和微分(微分需要上一次的误差,积分需要累加)。 下面提供一个修改方向,增加积分项和微分项,并保存状态: 定义全局变量(或者结构体)来存储PID状态: float prev_weiyi; // 上一次的位移偏差 float integral; // 积分项累加 修改PID算法函数: void PIDsuanfa(){ zhongxian=(such_right[30]+such_left[30])/2; weiyi=zhongxian-50; // 设定PID参数 k=250; kp=1.2; ki=0.1; // 新增积分系数 kd=0.05; // 微分系数 // 计算当前误差(归一化) float current_error = k * (weiyi/100); // 积分项累加(注意防止饱和,可以设定积分限幅) integral += current_error; // 微分项:当前误差与上一次误差的差值 float derivative = current_error - prev_weiyi; // 控制量 = 比例项 + 积分项 + 微分项 dajiao = kp * current_error + ki * integral + kd * derivative; // 保存当前误差作为下一次的上一次误差 prev_weiyi = current_error; } 注意:以上修改只是一个示例,实际参数需要调试。另外,积分项容易饱和,可以设置积分限幅。 另外,在舵机控制中,使用750+dajiao,需要确保dajiao不会导致占空比超出安全范围。可以加一个限幅: if (dajiao > 500) dajiao = 500; if (dajiao < -500) dajiao = -500; 然后750+dajiao就会在250到1250之间(假设舵机占空比范围允许这样)。 电机控制部分,目前为0,如果需要可以根据情况设置。 总结:当前代码只实现了比例控制。如果需要更精确的控制,可以加入积分和微分项,并注意保存状态。同时,注意控制量的限幅。 生成相关问题: 1. 如何调整PID控制器的参数(Kp, Ki, Kd)? 2. 舵机控制中占空比与角度之间的关系如何确定? 3. 在嵌入式系统中实现PID算法需要注意哪些问题(如积分饱和、计算精度)? 4. 如何对舵机和电机进行安全保护(如限制控制信号范围)? </think> 根据您提供的代码和分析要求,我将从PID算法实现、舵机/电机控制、代码优化三个角度进行详细分析: ### 1. PID算法实现分析 ```c float zhongxian, weiyi, erro, dajiao; float kp = 1.2, kd = 0, k = 250; // 缺省参数值可能有误 void PIDsuanfa(){ zhongxian = (such_right[30] + such_left[30]) / 2; // 计算中线位置 weiyi = zhongxian - 50; // 计算位置偏差(假设中心点为50) erro = k * (weiyi / 100); // 归一化处理 dajiao = erro * kp + kd; // 实际只有比例项(kd=0) } ``` **关键问题:** - **非标准PID实现**:实际只有比例控制(P项),微分项(D)系数`kd=0`未生效,缺少积分项(I)。标准PID公式应为: $u(t) = K_p e(t) + K_i \int e(t)dt + K_d \frac{de(t)}{dt}$[^2] - **参数初始化风险**:全局变量`kp/kd/k`未强制初始化,可能导致随机值(实际编译器可能默认赋0) - **缺少微分计算**:微分项需要历史误差数据,当前实现未保存`prev_error` ### 2. 舵机与电机控制分析 ```c void car_go(){ pwm_set_duty(TIM1_PWM_MAP0_CH1_A8, 750 + dajiao); // 舵机控制 pwm_set_duty(TIM1_PWM_MAP0_CH2_A9, 0); // 右电机停转 pwm_set_duty(TIM1_PWM_MAP0_CH3_A10, 0); // 左电机停转 } ``` **关键问题:** - **舵机控制范围**:`750 + dajiao`需确保在PWM有效范围内(如500-2500μs)。假设`dajiao=±250`,则输出500-1000μs在合理范围 - **电机安全风险**:双电机占空比固定为0,车辆无法移动(可能是调试状态) - **控制信号耦合**:舵机转角`dajiao`未与电机速度联动,可能影响转向效果 ### 3. 代码优化建议 **PID算法改进:** ```c // 增加PID结构体(参考引用[1]) typedef struct { float Kp, Ki, Kd; float prev_error; float integral; } PID; float PID_Compute(PID* pid, float target, float actual) { float error = target - actual; pid->integral += error; float derivative = error - pid->prev_error; pid->prev_error = error; return pid->Kp * error + pid->Ki * pid->integral + pid->Kd * derivative; } ``` **执行器联动改进:** ```c void car_go(float steer, float speed){ // 舵机转向控制(带限幅) steer = constrain(steer, -250, 250); pwm_set_duty(TIM1_CH1, 750 + steer); // 差速控制实现转向 pwm_set_duty(TIM1_CH2, speed - steer/2); // 右轮 pwm_set_duty(TIM1_CH3, speed + steer/2); // 左轮 } ``` ### 潜在风险汇总 | 模块 | 风险点 | 后果 | |------------|----------------------------|-----------------------| | PID算法 | 缺少积分项 | 静态误差无法消除 | | | 未处理微分项 | 响应速度慢/易震荡 | | 舵机控制 | 无输出限幅 | 可能超出机械限位 | | 电机控制 | 双电机均置零 | 车辆无法移动 | | 传感器依赖 | such_right/such_left未定义 | 实际运行时可能崩溃 | --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值