您的位置:首页 > 产品设计 > UI/UE

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

2016-10-25 23:29 316 查看

写在前面

首先我对未及时分享自己的配置及源码向各位网友道歉。本文是对博文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);
}


在上面的代码中
#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);
}


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

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;
}
}


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

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

ROSArduinoBridge.ino文件的修改

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

总结

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

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

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

参考资料

C语言程序设计现代方法,[美]K.N.King著,人民邮电出版社

ROS机器人程序设计,[西班牙]Aaron Martinez Enrique Fem a nedz著 机械工业出版社




本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  arduino
相关文章推荐