赞
踩
首先我对未及时分享自己的配置及源码向各位网友道歉。本文是对博文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 Mega 2560。这款板子的各种管脚都比较多,可以拓展比较多的传感器。当然如果你使用的传感器不多,可以使用其他型号的Arduino,例如UNO等。
ros arduino bridge功能包集包括四个主要部分:
由于我们需要使该功能包适应我们的硬件,因此我们需要对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);
}
在上面的代码中#if defined POLOLU_VNH5019
就意味着你在ROSArduinoBridge.ino文件中声明了宏POLOLU_VNH5019
,而你声明这个宏就意味着你使用了POLOLU VNH5019这个硬件。所以如果我们要在这里添加我们用到的硬件驱动也就很简单了,只需要做三件事:
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);
}
当然我们的电动机驱动不能随心所欲,一定要按照其他硬件驱动的格式编写,保持接口一致,设置电动机速度的函数的名字及参数要完全相同。
NOTE:本文并不对驱动的编写细节做详细说明,第一,这不是本文的重点,本文主要介绍如何根据自己的硬件来修改该功能包集;第二,我之前的博客中说过,如果想要自定义该功能包集的话,必须有一定的Arduino编程基础,所以驱动硬件这部分需要读者自行编写。当然,读者可以参考我的源码。
这部分源码与上节中对电动机驱动的修改十分相似,同样使用到了条件编译。因此我们的工作同样是三步:
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;
}
}
如果你用的是AB相的编码器,那么笔者的编码器驱动你可以直接使用,基本不需要修改。
这个文件相当于这个工程的主文件。你可以参考之前博客中加载ROSArduinoBridge的Sketch这部分对该文件进行相应的修改。
使用ros arduino bridge功能包集的好处是,我们只需要掌握Arduino的相关编程就可以设计一个兼容多数硬件的base controller,而无需从零开始一层一层的设计base controller。所以如果你想使用这个功能包,最好初步学一下Arduino编程,否则使用这个功能包将遇到很多障碍。
在这里可以下载我的源码,有兴趣的朋友可以参考一下。
NOTE:分支indigo-devel-lcy是我创建的分支。
本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。