ros_arduino_bridge功能包集
请尽量自行在源码上修改。
文件树及说明:这里引用创客智造
├── README.md
├── ros_arduino_bridge # 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 #编码器驱动头文件,定义插脚(pins)
│ ├── 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 #类包默认空文件
各部分源码:
arduino下位机部分:(如果不能运行,可能是注释的问题)
- commands.h 命令:
/* Define single-letter commands that will be sent by the PC over the
serial link.
*/
#ifndef COMMANDS_H
#define COMMANDS_H
#define ANALOG_READ 'a' // 模拟读取
#define GET_BAUDRATE 'b' // 获取波特率
#define PIN_MODE 'c' // 接口模式
#define DIGITAL_READ 'd' // 数字读取
#define READ_ENCODERS 'e' // 读取编码器数据 输出为:左数据,右数据
#define MOTOR_SPEEDS 'm' // 设置马达速度,脉冲计数 如: m 20 20 会以一个很的速度转动
#define PING 'p' // 无用
#define RESET_ENCODERS 'r' // 重设编码器读数
#define SERVO_WRITE 's' // 舵机相关,我这里没有用到
#define SERVO_READ 't' // 舵机相关,我这里没有用到
#define UPDATE_PID 'u' // 更新pid参数
#define DIGITAL_WRITE 'w' // 数字端口设置
#define ANALOG_WRITE 'x' // 模拟端口设置
#define READ_PIDOUT 'f' // 读取pid计算出的速度(脉冲数计数)
#define READ_PIDIN 'i' // 读取进入pid的速度
#define LEFT 0
#define RIGHT 1
#define FORWARDS true //FORWARDS前进代表bool真值true
#define BACKWARDS false //BACKWARDS后退代表bool假值false
#endif
- ROSArduinoBridge.ino源码:
//这是在官方包基础上修改来的
#define USE_BASE // Enable the base controller code 是否使用base controller
//#undef USE_BASE // Disable the base controller code
/* Define the motor controller and encoder library you are using */
//定义电机控制方式,使用ifdef 的方式,和正常的if 语句类似
#ifdef USE_BASE
/* The Pololu VNH5019 dual motor driver shield */
//#define POLOLU_VNH5019
/* The Pololu MC33926 dual motor driver shield */
//#define POLOLU_MC33926
/* The RoboGaia encoder shield */
//#define ROBOGAIA
/* Encoders directly attached to Arduino boa