[开源]蜘蛛机器人V2

2020-02-11 10:17发布

本帖最后由 Gorgon_Meducer 于 2014-10-28 12:01 编辑



- 2014-10-28 致歉

     由于我个人在团队管理实践上的重大错误,V2版蜘蛛可靠性不足以完成今日举行的产品展示,最终影响了飞思卡尔产品
     的展示计划。在这里,我真心的向阿莫致歉,向相信我,期待蜘蛛项目的广大坛友致歉,向飞思卡尔(上海)致歉。
    我们认识到自己能力的不足,后续将继续在硬件驱动能力上进行改进,降低机器人对电源系统的依赖。

                                                                                                                  特此致歉:王卓然(傻孩子)

     P.S 此次飞思卡尔展会将使用蜘蛛V1进行演示。


- 2014-10-23 V2版蜘蛛改进

     a. 由于驱动电路考虑不足,发现蜘蛛在joints_calibration()时由于所有的关节顺势运动时电流过大会导致驱动电路保护,
         导致很多时候无法正常工作。显然现在修改驱动电路已经来不及了,只能修改代码,让所有关节顺次启动,从而避免
         峰值电流。

  1. static void joints_calibration(joint_t *ptJoints, joint_no_t tIndex)
  2. {
  3.     if (NULL == ptJoints) {
  4.         return ;
  5.     }

  6.     switch (tIndex) {
  7.         case RIGHT_BACK_LEG_0:
  8.             JOINT_CFG(
  9.                 ptJoints[RIGHT_BACK_LEG_0],
  10.                 RIGHT_BACK_LEG_0,
  11.                 70,                         //!< offset
  12.                 110,                        //!< start angle
  13.                 200,                        //!< end angle
  14.                 270,                        //!< Max Angular Speed
  15.                 225,                        //!< Reset Position
  16.             );break;

  17.         case RIGHT_MIDDLE_LEG_0:
  18.             JOINT_CFG(
  19.                 ptJoints[RIGHT_MIDDLE_LEG_0],
  20.                 RIGHT_MIDDLE_LEG_0,
  21.                 54,                     //!< offset
  22.                 81,                     //!< start angle
  23.                 171,                    //!< end angle
  24.                 270,                    //!< Max Angular Speed
  25.                 180,                    //!< Reset Position
  26.             );break;

  27.         case RIGHT_FRONT_LEG_0:
  28.             JOINT_CFG(
  29.                 ptJoints[RIGHT_FRONT_LEG_0],
  30.                 RIGHT_FRONT_LEG_0,
  31.                 50,                     //!< offset
  32.                 40,                     //!< start angle
  33.                 130,                    //!< end angle
  34.                 270,                    //!< Max Angular Speed
  35.                 135,                    //!< Reset Position
  36.             );break;

  37.         case LEFT_FRONT_LEG_0:
  38.             JOINT_CFG(
  39.                 ptJoints[LEFT_FRONT_LEG_0],
  40.                 LEFT_FRONT_LEG_0,
  41.                 220,                     //!< offset
  42.                 0,                      //!< start angle
  43.                 270,                    //!< end angle
  44.                 270,                    //!< Max Angular Speed
  45.                 45,                      //!< Reset Position
  46.             );break;

  47.         case LEFT_MIDDLE_LEG_0:
  48.             JOINT_CFG(
  49.                 ptJoints[LEFT_MIDDLE_LEG_0],
  50.                 LEFT_MIDDLE_LEG_0,
  51.                 215,                     //!< offset
  52.                 0,                      //!< start angle
  53.                 270,                    //!< end angle
  54.                 270,                    //!< Max Angular Speed
  55.                 0,                      //!< Reset Position
  56.             );break;

  57.         case LEFT_BACK_LEG_0:
  58.             JOINT_CFG(
  59.                 ptJoints[LEFT_BACK_LEG_0],
  60.                 LEFT_BACK_LEG_0,
  61.                 195,                    //!< offset
  62.                 0,                      //!< start angle
  63.                 270,                    //!< end angle
  64.                 270,                    //!< Max Angular Speed
  65.                 315,                      //!< Reset Position
  66.             );break;

  67.         case RIGHT_BACK_LEG_1:
  68.             JOINT_CFG(
  69.                 ptJoints[RIGHT_BACK_LEG_1],
  70.                 RIGHT_BACK_LEG_1,
  71.                 35,                    //!< offset
  72.                 0,                      //!< start angle
  73.                 270,                    //!< end angle
  74.                 270,                    //!< Max Angular Speed
  75.                 225,                     //!< Reset Position
  76.             );break;

  77.         case RIGHT_MIDDLE_LEG_1:
  78.             JOINT_CFG(
  79.                 ptJoints[RIGHT_MIDDLE_LEG_1],
  80.                 RIGHT_MIDDLE_LEG_1,
  81.                 40,                    //!< offset
  82.                 0,                      //!< start angle
  83.                 270,                    //!< end angle
  84.                 270,                    //!< Max Angular Speed
  85.                 225,                     //!< Reset Position
  86.             );break;

  87.         case RIGHT_FRONT_LEG_1:
  88.             JOINT_CFG(
  89.                 ptJoints[RIGHT_FRONT_LEG_1],
  90.                 RIGHT_FRONT_LEG_1,
  91.                 33,                    //!< offset
  92.                 0,                      //!< start angle
  93.                 270,                    //!< end angle
  94.                 270,                    //!< Max Angular Speed
  95.                 225,                     //!< Reset Position
  96.             );break;
  97.             
  98.          case LEFT_BACK_LEG_1:
  99.             JOINT_CFG(
  100.                 ptJoints[LEFT_BACK_LEG_1],
  101.                 LEFT_BACK_LEG_1,
  102.                 235,                    //!< offset
  103.                 0,                      //!< start angle
  104.                 270,                    //!< end angle
  105.                 270,                    //!< Max Angular Speed
  106.                 315,                     //!< Reset Position
  107.             );break;

  108.         case LEFT_MIDDLE_LEG_1:
  109.             JOINT_CFG(
  110.                 ptJoints[LEFT_MIDDLE_LEG_1],
  111.                 LEFT_MIDDLE_LEG_1,
  112.                 240,                    //!< offset
  113.                 0,                      //!< start angle
  114.                 270,                    //!< end angle
  115.                 270,                    //!< Max Angular Speed
  116.                 315,                     //!< Reset Position
  117.             );break;

  118.         case LEFT_FRONT_LEG_1:
  119.             JOINT_CFG(
  120.                 ptJoints[LEFT_FRONT_LEG_1],
  121.                 LEFT_FRONT_LEG_1,
  122.                 245,                    //!< offset
  123.                 0,                      //!< start angle
  124.                 270,                    //!< end angle
  125.                 270,                    //!< Max Angular Speed
  126.                 315,                     //!< Reset Position
  127.             );break;

  128.         case LEFT_BACK_LEG_2:
  129.             JOINT_CFG(
  130.                 ptJoints[LEFT_BACK_LEG_2],
  131.                 LEFT_BACK_LEG_2,
  132.                 328,                    //!< offset
  133.                 0,                     //!< start angle
  134.                 270,                    //!< end angle
  135.                 270,                    //!< Max Angular Speed
  136.                 45,                     //!< Reset Position
  137.             );break;

  138.         case LEFT_MIDDLE_LEG_2:
  139.             JOINT_CFG(
  140.                 ptJoints[LEFT_MIDDLE_LEG_2],
  141.                 LEFT_MIDDLE_LEG_2,
  142.                 332,                    //!< offset
  143.                 0,                     //!< start angle
  144.                 270,                    //!< end angle
  145.                 270,                    //!< Max Angular Speed
  146.                 45,                     //!< Reset Position
  147.             );break;

  148.         case LEFT_FRONT_LEG_2:
  149.             JOINT_CFG(
  150.                 ptJoints[LEFT_FRONT_LEG_2],
  151.                 LEFT_FRONT_LEG_2,
  152.                 323,                    //!< offset
  153.                 0,                     //!< start angle
  154.                 270,                    //!< end angle
  155.                 270,                    //!< Max Angular Speed
  156.                 45,                     //!< Reset Position
  157.             );break;

  158.         case RIGHT_BACK_LEG_2:
  159.             JOINT_CFG(
  160.                 ptJoints[RIGHT_BACK_LEG_2],
  161.                 RIGHT_BACK_LEG_2,
  162.                 312,                    //!< offset
  163.                 0,                     //!< start angle
  164.                 270,                    //!< end angle
  165.                 270,                    //!< Max Angular Speed
  166.                 135,                     //!< Reset Position
  167.             );break;

  168.         case RIGHT_MIDDLE_LEG_2:
  169.             JOINT_CFG(
  170.                 ptJoints[RIGHT_MIDDLE_LEG_2],
  171.                 RIGHT_MIDDLE_LEG_2,
  172.                 311,                    //!< offset
  173.                 0,                     //!< start angle
  174.                 270,                    //!< end angle
  175.                 270,                    //!< Max Angular Speed
  176.                 135,                     //!< Reset Position
  177.             );break;

  178.         case RIGHT_FRONT_LEG_2:
  179.             JOINT_CFG(
  180.                 ptJoints[RIGHT_FRONT_LEG_2],
  181.                 RIGHT_FRONT_LEG_2,
  182.                 312,                    //!< offset
  183.                 0,                     //!< start angle
  184.                 270,                    //!< end angle
  185.                 270,                    //!< Max Angular Speed
  186.                 135,                     //!< Reset Position
  187.             );break;
  188.     }

  189. }
  190. ...

  191. IMPLEMENT_FSM(SpiderTask)
  192.     NO_INIT static uint8_t s_hwJointsCount;
  193.     PRIVATE STATE(Spider_Init) BEGIN
  194.         s_hwJointsCount = CEREBEL_JOINTS_COUNT;
  195.         //! initialize servo service
  196.         SERVO.Init ();
  197.         SERVO.Start ();
  198.         
  199.         CS_SET_EVENT(&s_wDelayEvent);
  200.         
  201.         TRANSFER_TO_STATE(Spider_Joints_Init);
  202.         EXIT_STATE;
  203.     END
  204.     PRIVATE STATE(Spider_Joints_Init) WAIT_EVENT_BEGIN(&s_wDelayEvent)
  205.         
  206.         if (s_hwJointsCount) {
  207.             request_for_delay_ms(250);
  208.             joints_calibration(s_tJoints, s_hwJointsCount - 1);
  209.             s_hwJointsCount--;
  210.         } else {

  211.             //! initialize cerebel layer
  212.             CEREBEL_CFG(&s_tJoints);
  213.             TRANSFER_TO_STATE(Spider_Task);
  214.         }

  215.         REFLEXIVE_STATE;
  216.     END
  217.     PRIVATE STATE(Spider_Task) BEGIN

  218.         CALL_ACTION(Spider_Go_Front);
  219.         REFLEXIVE_STATE;
  220.     END
  221. END_IMPLEMENT_FSM
复制代码
    b. 增加一个异步的毫秒级精确延时服务,主要是前面关节初始化的时候需要在每个关节之间插入非阻塞的延时。
       这也展示了状态机架构下如何配合调度器实现任务和时间的同步(应用代码参考a):


  1. NO_INIT static event_t s_wDelayEvent;
  2. static volatile uint32_t s_wDelayCounter = 0;

  3. void request_for_delay_ms(uint32_t wDelayMs)
  4. {
  5.     SAFE_ATOM_CODE(
  6.         s_wDelayCounter = wDelayMs;
  7.     )
  8. }

  9. ISR(SysTick_Handler)
  10. {
  11. ...

  12.     if (s_wDelayCounter) {
  13.         s_wDelayCounter--;
  14.         if (!s_wDelayCounter) {
  15.             CS_SET_EVENT(&s_wDelayEvent);
  16.         }
  17.     }

  18. ...
  19. }
复制代码
    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 上传 点击文件名下载附件



友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
99条回答
myqiang1990
1楼-- · 2020-02-19 06:01
本帖最后由 myqiang1990 于 2014-10-24 14:37 编辑
dawanpi 发表于 2014-10-24 13:12
可以提高效率的,尤其是一些经常被调用但是本身有不复杂的函数上,这时候例如栈操作所费的时间可能超过函 ...


适当可以用__inline~~~~在我读过的代码中,我觉得UCOS的代码是非常优美的~十分清晰有条理~而且代码整整齐齐~看得十分舒服~~一读就懂~~
Gorgon_Meducer
2楼-- · 2020-02-19 10:11
myqiang1990 发表于 2014-10-24 09:30
为何C语言要把它弄成这样?首先比较崇拜楼主~也比较尊敬~~我没仔细看~因为我没有楼主用的编译器也没装看代 ...

只要你看懂了代码要做什么事情,目的就达到了,至于你是否看懂了代码(知道背后的原理),这不是我关心的。
我是推崇黑盒子思想的,只要知道怎么用就可以了。毕竟底层的东西没有多少价值,而如何用别人提供的服务
设计出满足应用的东西——或者说关注于应用本身才是设计的最终目的。

你如果说你看这个代码不知道这个代码的意图,那么我们可以好好聊聊。
Gorgon_Meducer
3楼-- · 2020-02-19 10:20
本帖最后由 Gorgon_Meducer 于 2014-10-24 15:37 编辑
myqiang1990 发表于 2014-10-24 14:20
适当可以用__inline~~~~在我读过的代码中,我觉得UCOS的代码是非常优美的~十分清晰有条理~而且代码整整齐 ...


有很多需要大量重复的结构性代码本身是没法用inline的,因为这只是代码片段。
另外用宏虽然看似和inline差不多,但inline很多时候是“强制”的,但用宏就赋予了编译器灵活处理的权利,
他可以inline——如果你选择速度优化的话,也可以不inline——通常是你选择size优化的时候。

宏的作用是给一些重复的代码片段赋予简单易懂的意义,同时也避免书写多次。你可以认为是一种模板,
这种模板当成为一定规模后,实际上确保了你过去用宏固定下来的“成功代码”不会在重写的时候出现
笔误或者偏差。

比如我写过一个宏模板用来产生FIFO的,用起来很方便,也不用担心每次为一个新的特定类型写FIFO
代码的时候会出现笔误或者逻辑错误。

再说个玩笑话:我觉得你属于C语言的“纯血派”。我则是强调实用主义的。我用宏并不是像你看到的文字
那样是为了追求像某种语言(最初我这么尝试过,但发现没有意义,也不好玩),我用宏的目标完全是
为了提高代码效率,降低出错效率,辅助编码规范——比如状态机写出来拥有统一格式之类的。

尤其是C不支持模板,而宏是唯一最接近这一概念的实现了。

计算机科学历来都是“唯心主义”泛滥的圣地,除了做应用与物理世界相连,或者解决数学高度相关的问题,
平时的计算机世界完全就是程序员说了算的。有影响的人可以这么解释一种语言,其它人可以附庸,也可以
提出自己的解释,最牛掰的人干脆自己创造一门语言——尤其是在自己的应用范围自己说了算的时候。

所以,“纯血派”嘛我只能笑笑。我影响我的范围,你影响你的。不过我还是很乐于沟通的。相对于其他直接
MARK的人,我真的非常开心有人说出自己的想法,认真的评论。从这点角度来说,你就是直接骂我,我都
是开心的——毕竟你说的有理有据,还专门耐心去截图。

真的,非常感谢,还请以后继续关注我的帖子。欢迎吐槽~真心的。做技术对事不对人~谢谢你。
Gorgon_Meducer
4楼-- · 2020-02-19 13:30
 精彩回答 2  元偷偷看……
阿文
5楼-- · 2020-02-19 14:29
要是有KEIL C版本就好了。并且工程代码,太多的封装了,看起来不够直接。
kuangrenyu
6楼-- · 2020-02-19 17:55
顶牛人啊!

一周热门 更多>