当前位置:   article > 正文

自定义配置ros arduino bridge功能包集_arduino vnh5019

arduino vnh5019

写在前面

首先我对未及时分享自己的配置及源码向各位网友道歉。本文是对博文ros_arduino_bridge功能包集的使用的拓展,主要是对如何修改ros arduino bridge功能包集,使其兼容其他硬件做一些简要的说明。在这里我以自己的配置为例为大家讲解,如有疑问可以通过csdn私信我或者通过邮箱联系我,我的email:chaoyanglius@outlook.com,欢迎大家为我纠错。

硬件说明

如果要直接使用ros arduino bridge功能包集的话比较困难,因为原作者使用的硬件很多在国内很难买到,因此我们需要修改其中的源码来适应我们的硬件。下面是我对这些硬件做一些说明。正如我在ros_arduino_bridge功能包集的使用这篇博文中所提到的,如果你有一定的Arduino编程基础,你就可以随心所欲的让该功能包集支持任何你想用的硬件。

电动机

我所用的电动机为普通的直流减速电动机。对于电动机我们并没有太高的要求,但是笔者建议最好要选购那些带编码器的电动机,如果要自己安装编码器的话是比较麻烦的。

NOTE:如果要买“裸奔”的电动机的话,一定要确定所买电动机可以安装编码器(电动机尾轴要足够长)。

电动机驱动板

对于两轮的轮式机器人可以选用目前市面上比较常见的L298N双H桥电机驱动板,而四轮的话可以使用L293D电动机驱动板。这里我们以L298N为例进行介绍。

编码器

编码器要尽量选用精度较高的,这样有利于精确地控制小车。我们可以选用磁编码器和光电编码器,这两种都是比较常用的,而且也很容易使用。我这里采用的是AB相增量式磁编码器,线数为390。当然,如果你选用其他的编码器也是没有问题的,只要你可以单独地驱动起来获取数据。对于这种AB相的编码器是比较容易使用的,基本一个驱动程序就可以驱动大部分的AB相编码器。

Arduino驱动板

Arduino的种类很多,笔者建议使用Arduino Mega 2560。这款板子的各种管脚都比较多,可以拓展比较多的传感器。当然如果你使用的传感器不多,可以使用其他型号的Arduino,例如UNO等。

源码修改

ros arduino bridge功能包集包括四个主要部分:

  • ros_arduino_bridge:包含功能包集的功能包集文件和cmake配置文件CMakeLists.txt
  • ros_arduino_firmware:固件程序命令,主要负责驱动硬件
  • ros_arduino_msgs:自定义的ROS消息类型及服务
  • ros_arduino_python:与ROS base controller(基础控制器)的功能相同,主要负责与硬件驱动程序的通信,具体可以参考《ROS机器人程序设计》这本书

由于我们需要使该功能包适应我们的硬件,因此我们需要对ros_arduino_firmware(固件程序功能包,主要负责硬件的驱动)功能包的源码进行修改,修改时为了保持系统正常调用,必须使驱动程序的接口与原来保持一致。

由于我这里并未使用伺服机或者超声波传感器,因此我这里只对电动机驱动和编码器驱动以及主文件ROSArduinoBridge.ino做一些修改。

电动机驱动的修改

打开motor_driver.ino文件,这时你会看到一些#if defined#elif等指令,这里用到就是C语言中所谓的条件编译——根据预处理器所执行的测试结果来包含或排除程序的片段,即编译器只对满足相应条件的代码进行编译。其实这些很好理解,它们就类似与我们编程时经常用到的if ... else语句。

#if defined POLOLU_VNH5019
  /* Include the Pololu library */
  #include "DualVNH5019MotorShield.h"

  /* Create the motor driver object */
  DualVNH5019MotorShield drive;

  /* Wrap the motor driver initialization */
  void initMotorController() {
    drive.init();
  }

  /* Wrap the drive motor set speed function */
  void setMotorSpeed(int i, int spd) {
    if (i == LEFT) drive.setM1Speed(spd);
    else drive.setM2Speed(spd);
  }

  // A convenience function for setting both motor speeds
  void setMotorSpeeds(int leftSpeed, int rightSpeed) {
    setMotorSpeed(LEFT, leftSpeed);
    setMotorSpeed(RIGHT, rightSpeed);
  }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23

在上面的代码中#if defined POLOLU_VNH5019就意味着你在ROSArduinoBridge.ino文件中声明了宏POLOLU_VNH5019,而你声明这个宏就意味着你使用了POLOLU VNH5019这个硬件。所以如果我们要在这里添加我们用到的硬件驱动也就很简单了,只需要做三件事:

  • 在ROSArduinoBridge.ino文件中添加相应的宏,比如L298N_DUAL_HBRIDGE
  • 使用条件编译指令添加相应的条件分支,下面是一个编写框架:
#elif defined L298N_DUAL_HBRIDGE

  void initMotorController() {
  ...
  }

  void setMotorSpeed(int i, int spd) {
  ...
  }

  void setMotorSpeeds(int leftSpeed, int rightSpeed) {
    setMotorSpeed(LEFT, leftSpeed);
    setMotorSpeed(RIGHT, rightSpeed);
  }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

当然我们的电动机驱动不能随心所欲,一定要按照其他硬件驱动的格式编写,保持接口一致,设置电动机速度的函数的名字及参数要完全相同。

NOTE:本文并不对驱动的编写细节做详细说明,第一,这不是本文的重点,本文主要介绍如何根据自己的硬件来修改该功能包集;第二,我之前的博客中说过,如果想要自定义该功能包集的话,必须有一定的Arduino编程基础,所以驱动硬件这部分需要读者自行编写。当然,读者可以参考我的源码。

  • 在motor_driver.h中添加必要的函数声明或宏

编码器驱动的修改

这部分源码与上节中对电动机驱动的修改十分相似,同样使用到了条件编译。因此我们的工作同样是三步:

  • 在ROSArduinoBridge.ino文件中添加相应的宏,例如ABPHASE_COUNTER
  • 使用条件编译指令添加相应的条件分支,下面是一个编写框架:
#elif defined(ABPHASE_COUNTER)
  volatile long left_enc_pos = 0L;
  volatile long right_enc_pos = 0L;

  void initEncoders() {

  }

  // encoder event for the interrupt call
  void leftEncoderEvent() {

  }

  // encoder event for the interrupt call
  void rightEncoderEvent() {

  }

  /* Wrap the encoder reading function */
  long readEncoder(int i) {
    if (i == LEFT) return left_enc_pos;
    else return right_enc_pos;
  }

  /* Wrap the encoder reset function */
  void resetEncoder(int i) {
    if (i == LEFT){
      left_enc_pos=0L;
      return;
    } else {
      right_enc_pos=0L;
      return;
    }
  }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 在encoder_driver.h中添加必要的函数声明或宏

如果你用的是AB相的编码器,那么笔者的编码器驱动你可以直接使用,基本不需要修改。

ROSArduinoBridge.ino文件的修改

这个文件相当于这个工程的主文件。你可以参考之前博客加载ROSArduinoBridge的Sketch这部分对该文件进行相应的修改。

总结

使用ros arduino bridge功能包集的好处是,我们只需要掌握Arduino的相关编程就可以设计一个兼容多数硬件的base controller,而无需从零开始一层一层的设计base controller。所以如果你想使用这个功能包,最好初步学一下Arduino编程,否则使用这个功能包将遇到很多障碍。

这里可以下载我的源码,有兴趣的朋友可以参考一下。

NOTE:分支indigo-devel-lcy是我创建的分支。

参考资料

  1. C语言程序设计现代方法,[美]K.N.King著,人民邮电出版社
  2. ROS机器人程序设计,[西班牙]Aaron Martinez Enrique Fem a nedz著 机械工业出版社

知识共享许可协议
本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/从前慢现在也慢/article/detail/568619
推荐阅读
相关标签
  

闽ICP备14008679号