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

1

posted @ 2018-04-26 17:57  #Cloud  阅读(2676)  评论(0编辑  收藏  举报