自定义配置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 国际许可协议进行许可。
相关文章推荐
- ros_arduino_bridge功能包集的使用
- ros_arduino_bridge功能包集的使用错误及解决方法总结
- SAP EWM 在仓库管理监视器中配置自定义功能按钮
- 自定义网银导出配置(excel格式)功能指引
- 在ROS中如何配置机器人的导航功能
- FCKeditor是使用非常广泛的HTML编辑器,本文从 ASP.NET 的使用场景对 FCKeditor 与 FCKeditor.NET 的配置、功能扩展(如自定义文件上传子目录、自定义文件名、上传图片的后期处理等)、以及安全性进行初步的阐述。
- springmvc自定义注解拦截器方式实现注解功能拦截器的配置
- ROS探索总结(十九)——怎样配置机器人的导航功能
- 常规功能和模块自定义系统 (cfcmms)—007Extjs的配置文件和自定义ui
- ROS探索总结(十六)(十七)(十八)(十九)——HRMRP机器人的设计 构建完整的机器人应用系统 重读tf 如何配置机器人的导航功能
- 树莓派配置Arduino及其与ROS的通信
- ROS机器人Diego 1#制作(三)base controller---ros_arduino_bridge
- winxp中网桥Bridge功能概述及配置注意事项
- VS web.config/app.conifg配置文件自定义类型使用智能感知功能
- ros跨package使用自定义消息配置
- ros_arduino_bridge的安装及使用
- ros_arduino_bridge使用总结
- ROS探索总结(十九)——如何配置机器人的导航功能
- 在ROS中如何配置机器人的导航功能
- 自定义表单-加强配置工具的说明及描述功能