ROS与Arduino学习(九)ros_arduino_brige固件
ROS与Arduino学习(九)ros_arduino_brige固件
Tutorial Level:电机控制(基于ros_arduino_brige)
Next Tutorial:
Tips 1 ros_arduino_bridge的安装
1、下载
进入你的workspace目录下的src目录,catkin_ws是workspace
cd ~/catkin_ws/src
git clone https://github.com/hbrobotics/ros_arduino_bridge.git
2、编译,在workspace目录编译
cd <catkin_ws>
catkin_make
3、架构
├── 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 #类包默认空文件
4
、拷贝Arduino库文件中到相应的Arduino IDE的libraries目录
$ cd SKETCHBOOK_PATH//Arduino IDE的库文件目录
$ \cp -rp ~/catkin_ws/src/ros_arduino_bridge/ros_arduino_firmware/src/libraries/ROSArduinoBridge -T ROSArduinoBridge
这时候可以把ROSArduinoBridge拷贝到其他windows, Mac电脑的Arduino IDE环境下使用,重启后既可以用
Tips 2 ros_arduino_bridge架构介绍
1、common.h 此文件存放了用于串口通信的指令。
2、diff_controller.h PID控制代码
(1)结构体SetPointInfo
存储一些PID设定值信息,包括
Encoder编码器测量值、
PrevEnc上一次编码器测量值、
PrevInput上一次输入、
output代表输出
typedef struct {
double TargetTicksPerFrame; // target speed in ticks per frame
long Encoder; // encoder count
long PrevEnc; // last encoder count
int PrevInput; // last input
//int PrevErr; // last error
//int Ierror;
int ITerm; //integrated term
long output; // last motor setting
}
SetPointInfo;
(2)PID参数可以在此修改
/* PID Parameters */
int Kp = 20;
int Kd = 12;
int Ki = 0;
int Ko = 50;
(3)resetPID()函数
用来复位PID结构体。
(4)doPID(SetPointInfo * p)函数
此函数为PID执行函数。
(5)updatePID()
更新PID函数,包括编码器采集、PID执行以及设定电机PWM。实际我们调用这个函数即可。
3、encoder_driver.h 编码器代码
这里只是针对了Arduino UNO,使用了中断接口D2,D3,和模拟接口A4,A5;所以电机编码器的输出接线需要按照此规则接线,另外要注意编码器要有两路输出
左侧电机的编码输出接D2,D3;右侧电机的编码输出接A4,A5
4、encoder_driver.ino 编码器的实现代码
5、motor_driver.h 马达驱动的接口定义
此处采取L298驱动芯片,对两个电机的接口进行了定义,包括电机使能端、正转、反转。声明了三个函数初始化电机函数、设定单电机速度、双轮速度。
#ifdef L298_MOTOR_DRIVER
#define RIGHT_MOTOR_BACKWARD 5
#define LEFT_MOTOR_BACKWARD 6
#define RIGHT_MOTOR_FORWARD 9
#define LEFT_MOTOR_FORWARD 10
#define RIGHT_MOTOR_ENABLE 12
#define LEFT_MOTOR_ENABLE 13
#endif
void initMotorController();
void setMotorSpeed(int i, int spd);
void setMotorSpeeds(int leftSpeed, int rightSpeed);
6、motor_driver.ino
马达驱动实现代码,根据预定义选择不同的驱动板库
7、sensors.h传感器的实现文件
8、servos.h舵机的实现文件
声明了舵机的结构体
Tips 3 主程序的修改
1、启用Base Controller
#define USE_BASE // Enable the base controller code
//#undef USE_BASE // Disable the base controller code
2、马达控制板定义
选择一种电机驱动方式。可以采用L298驱动方式。
/* Define the motor controller and encoder library you are using */
#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 board */
//#define ARDUINO_ENC_COUNTER
/* L298 Motor driver*/
//#define L298_MOTOR_DRIVER
#endif
3、波特率以及占空比最大值
/* Serial port baud rate */
#define BAUDRATE 57600
/* Maximum PWM signal */
#define MAX_PWM 255
4、调控周期
此项可以设置PID调控周期。
/* Run the PID loop at 30 times per second */
#define PID_RATE 30 // Hz
Tips 4 固件测试
将程序下载到Arduino中,硬件固件就好了,接下来做进一步测试,我们打开串口利用common.h中的指令进行测试。
例如发送b返回波特率。
注意:把串口监视器的波特率设置为57600然后把行结束符设置为“Carriage return(回车)”或“Both NL & CR”(NL和CR)。
主要指令:
a 模拟读入 例如 a 3
b 获取波特率
c 设置某引脚状态
d 读取某引脚状态 例如 d 4
e
m 设定速度 例如 m 20 20
p
r 复位
s 舵机写值
t 舵机读值
u 更新PID
w 数字写0/1
x 模拟写
0