本帖最后由 Gorgon_Meducer 于 2014-10-28 12:01 编辑
- 2014-10-28 致歉
由于我个人在团队管理实践上的重大错误,V2版蜘蛛可靠性不足以完成今日举行的产品展示,最终影响了飞思卡尔产品
的展示计划。在这里,我真心的向阿莫致歉,向相信我,期待蜘蛛项目的广大坛友致歉,向飞思卡尔(上海)致歉。
我们认识到自己能力的不足,后续将继续在硬件驱动能力上进行改进,降低机器人对电源系统的依赖。
特此致歉:王卓然(傻孩子)
P.S 此次飞思卡尔展会将使用蜘蛛V1进行演示。
- 2014-10-23 V2版蜘蛛改进
a. 由于驱动电路考虑不足,发现蜘蛛在joints_calibration()时由于所有的关节顺势运动时电流过大会导致驱动电路保护,
导致很多时候无法正常工作。显然现在修改驱动电路已经来不及了,只能修改代码,让所有关节顺次启动,从而避免
峰值电流。
- static void joints_calibration(joint_t *ptJoints, joint_no_t tIndex)
- {
- if (NULL == ptJoints) {
- return ;
- }
- switch (tIndex) {
- case RIGHT_BACK_LEG_0:
- JOINT_CFG(
- ptJoints[RIGHT_BACK_LEG_0],
- RIGHT_BACK_LEG_0,
- 70, //!< offset
- 110, //!< start angle
- 200, //!< end angle
- 270, //!< Max Angular Speed
- 225, //!< Reset Position
- );break;
- case RIGHT_MIDDLE_LEG_0:
- JOINT_CFG(
- ptJoints[RIGHT_MIDDLE_LEG_0],
- RIGHT_MIDDLE_LEG_0,
- 54, //!< offset
- 81, //!< start angle
- 171, //!< end angle
- 270, //!< Max Angular Speed
- 180, //!< Reset Position
- );break;
- case RIGHT_FRONT_LEG_0:
- JOINT_CFG(
- ptJoints[RIGHT_FRONT_LEG_0],
- RIGHT_FRONT_LEG_0,
- 50, //!< offset
- 40, //!< start angle
- 130, //!< end angle
- 270, //!< Max Angular Speed
- 135, //!< Reset Position
- );break;
- case LEFT_FRONT_LEG_0:
- JOINT_CFG(
- ptJoints[LEFT_FRONT_LEG_0],
- LEFT_FRONT_LEG_0,
- 220, //!< offset
- 0, //!< start angle
- 270, //!< end angle
- 270, //!< Max Angular Speed
- 45, //!< Reset Position
- );break;
- case LEFT_MIDDLE_LEG_0:
- JOINT_CFG(
- ptJoints[LEFT_MIDDLE_LEG_0],
- LEFT_MIDDLE_LEG_0,
- 215, //!< offset
- 0, //!< start angle
- 270, //!< end angle
- 270, //!< Max Angular Speed
- 0, //!< Reset Position
- );break;
- case LEFT_BACK_LEG_0:
- JOINT_CFG(
- ptJoints[LEFT_BACK_LEG_0],
- LEFT_BACK_LEG_0,
- 195, //!< offset
- 0, //!< start angle
- 270, //!< end angle
- 270, //!< Max Angular Speed
- 315, //!< Reset Position
- );break;
- case RIGHT_BACK_LEG_1:
- JOINT_CFG(
- ptJoints[RIGHT_BACK_LEG_1],
- RIGHT_BACK_LEG_1,
- 35, //!< offset
- 0, //!< start angle
- 270, //!< end angle
- 270, //!< Max Angular Speed
- 225, //!< Reset Position
- );break;
- case RIGHT_MIDDLE_LEG_1:
- JOINT_CFG(
- ptJoints[RIGHT_MIDDLE_LEG_1],
- RIGHT_MIDDLE_LEG_1,
- 40, //!< offset
- 0, //!< start angle
- 270, //!< end angle
- 270, //!< Max Angular Speed
- 225, //!< Reset Position
- );break;
- case RIGHT_FRONT_LEG_1:
- JOINT_CFG(
- ptJoints[RIGHT_FRONT_LEG_1],
- RIGHT_FRONT_LEG_1,
- 33, //!< offset
- 0, //!< start angle
- 270, //!< end angle
- 270, //!< Max Angular Speed
- 225, //!< Reset Position
- );break;
-
- case LEFT_BACK_LEG_1:
- JOINT_CFG(
- ptJoints[LEFT_BACK_LEG_1],
- LEFT_BACK_LEG_1,
- 235, //!< offset
- 0, //!< start angle
- 270, //!< end angle
- 270, //!< Max Angular Speed
- 315, //!< Reset Position
- );break;
- case LEFT_MIDDLE_LEG_1:
- JOINT_CFG(
- ptJoints[LEFT_MIDDLE_LEG_1],
- LEFT_MIDDLE_LEG_1,
- 240, //!< offset
- 0, //!< start angle
- 270, //!< end angle
- 270, //!< Max Angular Speed
- 315, //!< Reset Position
- );break;
- case LEFT_FRONT_LEG_1:
- JOINT_CFG(
- ptJoints[LEFT_FRONT_LEG_1],
- LEFT_FRONT_LEG_1,
- 245, //!< offset
- 0, //!< start angle
- 270, //!< end angle
- 270, //!< Max Angular Speed
- 315, //!< Reset Position
- );break;
- case LEFT_BACK_LEG_2:
- JOINT_CFG(
- ptJoints[LEFT_BACK_LEG_2],
- LEFT_BACK_LEG_2,
- 328, //!< offset
- 0, //!< start angle
- 270, //!< end angle
- 270, //!< Max Angular Speed
- 45, //!< Reset Position
- );break;
- case LEFT_MIDDLE_LEG_2:
- JOINT_CFG(
- ptJoints[LEFT_MIDDLE_LEG_2],
- LEFT_MIDDLE_LEG_2,
- 332, //!< offset
- 0, //!< start angle
- 270, //!< end angle
- 270, //!< Max Angular Speed
- 45, //!< Reset Position
- );break;
- case LEFT_FRONT_LEG_2:
- JOINT_CFG(
- ptJoints[LEFT_FRONT_LEG_2],
- LEFT_FRONT_LEG_2,
- 323, //!< offset
- 0, //!< start angle
- 270, //!< end angle
- 270, //!< Max Angular Speed
- 45, //!< Reset Position
- );break;
- case RIGHT_BACK_LEG_2:
- JOINT_CFG(
- ptJoints[RIGHT_BACK_LEG_2],
- RIGHT_BACK_LEG_2,
- 312, //!< offset
- 0, //!< start angle
- 270, //!< end angle
- 270, //!< Max Angular Speed
- 135, //!< Reset Position
- );break;
- case RIGHT_MIDDLE_LEG_2:
- JOINT_CFG(
- ptJoints[RIGHT_MIDDLE_LEG_2],
- RIGHT_MIDDLE_LEG_2,
- 311, //!< offset
- 0, //!< start angle
- 270, //!< end angle
- 270, //!< Max Angular Speed
- 135, //!< Reset Position
- );break;
- case RIGHT_FRONT_LEG_2:
- JOINT_CFG(
- ptJoints[RIGHT_FRONT_LEG_2],
- RIGHT_FRONT_LEG_2,
- 312, //!< offset
- 0, //!< start angle
- 270, //!< end angle
- 270, //!< Max Angular Speed
- 135, //!< Reset Position
- );break;
- }
- }
- ...
- IMPLEMENT_FSM(SpiderTask)
- NO_INIT static uint8_t s_hwJointsCount;
- PRIVATE STATE(Spider_Init) BEGIN
- s_hwJointsCount = CEREBEL_JOINTS_COUNT;
- //! initialize servo service
- SERVO.Init ();
- SERVO.Start ();
-
- CS_SET_EVENT(&s_wDelayEvent);
-
- TRANSFER_TO_STATE(Spider_Joints_Init);
- EXIT_STATE;
- END
- PRIVATE STATE(Spider_Joints_Init) WAIT_EVENT_BEGIN(&s_wDelayEvent)
-
- if (s_hwJointsCount) {
- request_for_delay_ms(250);
- joints_calibration(s_tJoints, s_hwJointsCount - 1);
- s_hwJointsCount--;
- } else {
- //! initialize cerebel layer
- CEREBEL_CFG(&s_tJoints);
- TRANSFER_TO_STATE(Spider_Task);
- }
- REFLEXIVE_STATE;
- END
- PRIVATE STATE(Spider_Task) BEGIN
- CALL_ACTION(Spider_Go_Front);
- REFLEXIVE_STATE;
- END
- END_IMPLEMENT_FSM
复制代码
b. 增加一个异步的毫秒级精确延时服务,主要是前面关节初始化的时候需要在每个关节之间插入非阻塞的延时。
这也展示了状态机架构下如何配合调度器实现任务和时间的同步(应用代码参考a):
- NO_INIT static event_t s_wDelayEvent;
- static volatile uint32_t s_wDelayCounter = 0;
- void request_for_delay_ms(uint32_t wDelayMs)
- {
- SAFE_ATOM_CODE(
- s_wDelayCounter = wDelayMs;
- )
- }
- ISR(SysTick_Handler)
- {
- ...
- if (s_wDelayCounter) {
- s_wDelayCounter--;
- if (!s_wDelayCounter) {
- CS_SET_EVENT(&s_wDelayEvent);
- }
- }
- ...
- }
复制代码
c. v1.2工程模板下载
SpiderRobot_Template(v1.2).rar
(1.17 MB, 下载次数: 257)
2014-10-27 11:04 上传
点击文件名下载附件
- 2014-10-23 凌晨 V2版蜘蛛初步完成
历经磨难,原本以为很容易搞定的新版蜘蛛机器人,总算是搞定了——上视频:
V41023-025542.part1.rar
(15 MB, 下载次数: 886)
2014-10-23 03:09 上传
点击文件名下载附件
V41023-025542.part2.rar
(15 MB, 下载次数: 843)
2014-10-23 03:10 上传
点击文件名下载附件
V41023-025542.part3.rar
(3.22 MB, 下载次数: 528)
2014-10-23 03:10 上传
点击文件名下载附件
数字舵机是0~270度的,非常精准,校准只需要处理offset即可。另外由于安装的原因,坐标系又被迫做了镜像,
回头软件上考虑加入处理,避免这种坐标系上的差异存在。
睡了,好困,其它内容明天再补充。
工程下载
SpiderRobot_Template(v1.1).rar
(551.88 KB, 下载次数: 343)
2014-10-23 03:12 上传
点击文件名下载附件
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
有很多需要大量重复的结构性代码本身是没法用inline的,因为这只是代码片段。
另外用宏虽然看似和inline差不多,但inline很多时候是“强制”的,但用宏就赋予了编译器灵活处理的权利,
他可以inline——如果你选择速度优化的话,也可以不inline——通常是你选择size优化的时候。
宏的作用是给一些重复的代码片段赋予简单易懂的意义,同时也避免书写多次。你可以认为是一种模板,
这种模板当成为一定规模后,实际上确保了你过去用宏固定下来的“成功代码”不会在重写的时候出现
笔误或者偏差。
比如我写过一个宏模板用来产生FIFO的,用起来很方便,也不用担心每次为一个新的特定类型写FIFO
代码的时候会出现笔误或者逻辑错误。
再说个玩笑话:我觉得你属于C语言的“纯血派”。我则是强调实用主义的。我用宏并不是像你看到的文字
那样是为了追求像某种语言(最初我这么尝试过,但发现没有意义,也不好玩),我用宏的目标完全是
为了提高代码效率,降低出错效率,辅助编码规范——比如状态机写出来拥有统一格式之类的。
尤其是C不支持模板,而宏是唯一最接近这一概念的实现了。
计算机科学历来都是“唯心主义”泛滥的圣地,除了做应用与物理世界相连,或者解决数学高度相关的问题,
平时的计算机世界完全就是程序员说了算的。有影响的人可以这么解释一种语言,其它人可以附庸,也可以
提出自己的解释,最牛掰的人干脆自己创造一门语言——尤其是在自己的应用范围自己说了算的时候。
所以,“纯血派”嘛我只能笑笑。我影响我的范围,你影响你的。不过我还是很乐于沟通的。相对于其他直接
MARK的人,我真的非常开心有人说出自己的想法,认真的评论。从这点角度来说,你就是直接骂我,我都
是开心的——毕竟你说的有理有据,还专门耐心去截图。
真的,非常感谢,还请以后继续关注我的帖子。欢迎吐槽~真心的。做技术对事不对人~谢谢你。
一周热门 更多>