1.robot_base_control 概述
--------
该功能包包含Arduino库和用来控制Arduino的ROS驱动包,它旨在成为在ROS下运行Arduino控制的机器人的完整解决方案。
其中当前主要关注的是:功能包集中一个兼容不同驱动的机器人的基本控制器(base controller),它可以接收ROS Twist类型的消息,可以发布里程数据到ROS端。
**1.1 特点:**
* 直接支持 Ping 声纳和Sharp红外 (GP2D12) 传感器
* 也可以从通用的模拟和数字信号的传感器读取数据
* 可以控制数字输出(例如打开和关闭开关或 LED)
* 支持PWM伺服机
* 如果使用所要求的硬件的话,可以配置基本的控制
* 如果你的Arduino编程基础好的话,并且具有python基础的话,你就可以很自由的改动代码来满足你的硬件要求
* * 该库包括一个用于差速驱动机器人的Base Controller,该控制器接受 ROS Twist 消息并将 Odom 里程计数据发布回 PC。Base Controller需要使用电机控制器和编码器来读取里程数据。库的当前版本支持以下基本控制器硬件:
**1.2 注意:**
* Robogaia Mega Encoder shield 只能与 Arduino Mega 一起使用。
* 板上编码计数器(ARDUINO_ENC_COUNTER)目前仅支持Arduino Uno
* 上面非硬性规定,有一定的编程基础,你也可以按需更改
**1.3 模块:**
* ros_arduino_bridge: metapackage (元功能包),catkin_make安装即可
* ros_arduino_msgs: #消息定义包
* ros_arduino_firmware: 固件包,更新到Arduino(执行运动指令、发送电机编码器数据,通过serial与上位机通讯)
* ros_arduino_python: #ROS相关的Python包,用于上位机,树莓派等开发板或电脑等(监听/cmd_vel并转换为移动指令下发给电机;将电机编码器数据转换为里程计数据发到/odom)
**1.4 文件结构:**
├── robot_base_control # metapackage (元功能包)
├── CMakeLists.txt
└── package.xml
├── ros_arduino_firmware #固件包,更新到Arduino
├── CMakeLists.txt
├── package.xml
└── src
└── libraries #库目录
├── MegaRobogaiaPololu #针对Pololu电机控制器,MegaRobogaia编码器的头文件定义
├── commands.h #定义命令头文件
├── diff_controller.h #差分轮PID控制头文件
├── MegaRobogaiaPololu.ino #PID实现文件
├── sensors.h #传感器相关实现,超声波测距,Ping函数
└── servos.h #伺服器头文件
└── ROSArduinoBridge #Arduino相关库定义
├── commands.h #定义命令
├── diff_controller.h #差分轮PID控制头文件
├── encoder_driver.h #编码器驱动头文件
├── encoder_driver.ino #编码器驱动实现, 读取编码器数据,重置编码器等
├── motor_driver.h #电机驱动头文件
├── motor_driver.ino #电机驱动实现,初始化控制器,设置速度
├── ROSArduinoBridge.ino #核心功能实现,程序入口
├── sensors.h #传感器头文件及实现
├── servos.h #伺服器头文件,定义插脚,类
└── servos.ino #伺服器实现
├── ros_arduino_msgs #消息定义包
├── CMakeLists.txt
├── msg #定义消息
├── AnalogFloat.msg #定义模拟IO浮点消息
├── Analog.msg #定义模拟IO数字消息
├── ArduinoConstants.msg #定义常量消息
├── Digital.msg #定义数字IO消息
└── SensorState.msg #定义传感器状态消息
├── package.xml
└── srv #定义服务
├── AnalogRead.srv #模拟IO输入
├── AnalogWrite.srv #模拟IO输出
├── DigitalRead.srv #数字IO输入
├── DigitalSetDirection.srv #数字IO设置方向
├── DigitalWrite.srv #数字IO输入
├── ServoRead.srv #伺服电机输入
└── ServoWrite.srv #伺服电机输出
└── ros_arduino_python #ROS相关的Python包,用于上位机,树莓派等开发板或电脑等。
├── CMakeLists.txt
├── config #配置目录
└── arduino_params.yaml #定义相关参数,端口,rate,PID,sensors等默认参数。由arduino.launch调用
├── launch
└── arduino.launch #启动文件
├── nodes
└── arduino_node.py #python文件,实际处理节点,由arduino.launch调用,即可单独调用。
├── package.xml
├── setup.py
└── src #Python类包目录
└── ros_arduino_python
├── arduino_driver.py #Arduino驱动类
├── arduino_sensors.py #Arduino传感器类
├── base_controller.py #基本控制类,订阅cmd_vel话题,发布odom话题
└── __init__.py #类包默认空文件
上述目录结构虽然复杂,但是关注的只有两大部分:
* robot_base_control/ros_arduino_firmware/src/libraries/ROSArduinoBridge
* robot_base_control/ros_arduino_python/config/arduino_params.yaml
前者是Arduino端的固件包实现,需要修改并上传至Arduino电路板;
后者是ROS端的一个配置文件,相关驱动已经封装完毕,我们只需要修改配置信息即可。
整体而言,借助于 robot_base_control 可以大大提高我们的开发效率。
**1.5 官方 ROS 文档**
可以在 ROS wiki 上找到此文档的标准 ROS 样式版本:
http://www.ros.org/wiki/robot_base_control
2.准备工作
-------------------
**2.1 Python Serial:**
robot_base_control 依赖于 python-serial 功能包,请提前安装此包。
在Ubuntu下安装python-serial包,使用命令:
$ sudo apt-get install python-serial
在非 Ubuntu 系统上,使用:
$ sudo pip install --upgrade pyserial
or
$ sudo easy_install -U pyserial
**2.2 Arduino IDE 1.6.6 或更高版本:**
请注意,条件 #include 语句的预处理在早期版本的 Arduino IDE 中被破坏。为确保 ROS Arduino Bridge 固件正确编译,请务必安装 1.6.6 或更高版本的 Arduino IDE。您可以从https://www.arduino.cc/en/Main/Software下载 IDE 。
**2.3 硬件:**
固件应与任何兼容 Arduino 的控制器配合使用,以读取传感器和控制 PWM 伺服系统。但是,要使用Base Controller,您将需要上述支持的电机控制器和编码器硬件。如果您没有这个硬件,您仍然可以尝试读取传感器和控制伺服系统的软件包。有关如何执行此操作的说明,请参阅本文档末尾的 NOTES 部分。
要使用Base Controller,您还必须为电机控制器和编码器安装适当的库。对于 Pololu VNH5019 双电机屏蔽,可以在以下位置找到库:
https://github.com/pololu/Dual-VNH5019-Motor-Shield
对于 Pololu MC33926 双电机屏蔽,可以在以下位置找到库:
https://github.com/pololu/dual-mc33926-motor-shield
Ro