当前位置:   article > 正文

ROS与Arduino学习(九)ros_arduino_brige固件

ROS与Arduino学习(九)ros_arduino_brige固件

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

  1. cd ~/catkin_ws/src
  2. git clone https://github.com/hbrobotics/ros_arduino_bridge.git

 2、编译,在workspace目录编译

  1. cd <catkin_ws>
  2. catkin_make

3、架构

  1. ├── README.md
  2. ├── ros_arduino_bridge # metapackage (元包)
  3. │ ├── CMakeLists.txt
  4. │ └── package.xml
  5. ├── ros_arduino_firmware #固件包,更新到Arduino
  6. │ ├── CMakeLists.txt
  7. │ ├── package.xml
  8. │ └── src
  9. │ └── libraries #库目录
  10. │ ├── MegaRobogaiaPololu #针对Pololu电机控制器,MegaRobogaia编码器的头文件定义
  11. │ │ ├── commands.h #定义命令头文件
  12. │ │ ├── diff_controller.h #差分轮PID控制头文件
  13. │ │ ├── MegaRobogaiaPololu.ino #PID实现文件
  14. │ │ ├── sensors.h #传感器相关实现,超声波测距,Ping函数
  15. │ │ └── servos.h #伺服器头文件
  16. │ └── ROSArduinoBridge #Arduino相关库定义
  17. │ ├── commands.h #定义命令
  18. │ ├── diff_controller.h #差分轮PID控制头文件
  19. │ ├── encoder_driver.h #编码器驱动头文件,定义插脚(pins)
  20. │ ├── encoder_driver.ino #编码器驱动实现, 读取编码器数据,重置编码器等
  21. │ ├── motor_driver.h #电机驱动头文件
  22. │ ├── motor_driver.ino #电机驱动实现,初始化控制器,设置速度
  23. │ ├── ROSArduinoBridge.ino #核心功能实现,
  24. │ ├── sensors.h #传感器头文件及实现
  25. │ ├── servos.h #伺服器头文件,定义插脚,类
  26. │ └── servos.ino #伺服器实现
  27. ├── ros_arduino_msgs #消息定义包
  28. │ ├── CMakeLists.txt
  29. │ ├── msg #定义消息
  30. │ │ ├── AnalogFloat.msg #定义模拟IO浮点消息
  31. │ │ ├── Analog.msg #定义模拟IO数字消息
  32. │ │ ├── ArduinoConstants.msg #定义常量消息
  33. │ │ ├── Digital.msg #定义数字IO消息
  34. │ │ └── SensorState.msg #定义传感器状态消息
  35. │ ├── package.xml
  36. │ └── srv #定义服务
  37. │ ├── AnalogRead.srv #模拟IO输入
  38. │ ├── AnalogWrite.srv #模拟IO输出
  39. │ ├── DigitalRead.srv #数字IO输入
  40. │ ├── DigitalSetDirection.srv     #数字IO设置方向
  41. │ ├── DigitalWrite.srv #数字IO输入
  42. │ ├── ServoRead.srv #伺服电机输入
  43. │ └── ServoWrite.srv #伺服电机输出
  44. └── ros_arduino_python #ROS相关的Python包,用于上位机,树莓派等开发板或电脑等。
  45. ├── CMakeLists.txt
  46. ├── config #配置目录
  47. │ └── arduino_params.yaml #定义相关参数,端口,rate,PID,sensors等默认参数。由arduino.launch调用
  48. ├── launch
  49. │ └── arduino.launch #启动文件
  50. ├── nodes
  51. │ └── arduino_node.py #python文件,实际处理节点,由arduino.launch调用,即可单独调用。
  52. ├── package.xml
  53. ├── setup.py
  54. └── src #Python类包目录
  55. └── ros_arduino_python
  56. ├── arduino_driver.py #Arduino驱动类
  57. ├── arduino_sensors.py #Arduino传感器类
  58. ├── base_controller.py #基本控制类,订阅cmd_vel话题,发布odom话题
  59. └── __init__.py #类包默认空文件

 

 

4、拷贝Arduino库文件中到相应的Arduino IDE的libraries目录

  1. $ cd SKETCHBOOK_PATH//Arduino IDE的库文件目录
  2. $ \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代表输出

  1. typedef struct {
  2. double TargetTicksPerFrame; // target speed in ticks per frame
  3. long Encoder; // encoder count
  4. long PrevEnc; // last encoder count
  5. int PrevInput; // last input
  6. //int PrevErr; // last error
  7. //int Ierror;
  8. int ITerm; //integrated term
  9. long output; // last motor setting
  10. }
  11. SetPointInfo;

 

(2)PID参数可以在此修改

  1. /* PID Parameters */
  2. int Kp = 20;
  3. int Kd = 12;
  4. int Ki = 0;
  5. 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驱动芯片,对两个电机的接口进行了定义,包括电机使能端、正转、反转。声明了三个函数初始化电机函数、设定单电机速度、双轮速度。

  1. #ifdef L298_MOTOR_DRIVER
  2. #define RIGHT_MOTOR_BACKWARD 5
  3. #define LEFT_MOTOR_BACKWARD 6
  4. #define RIGHT_MOTOR_FORWARD 9
  5. #define LEFT_MOTOR_FORWARD 10
  6. #define RIGHT_MOTOR_ENABLE 12
  7. #define LEFT_MOTOR_ENABLE 13
  8. #endif
  9. void initMotorController();
  10. void setMotorSpeed(int i, int spd);
  11. void setMotorSpeeds(int leftSpeed, int rightSpeed);

 
6、motor_driver.ino

马达驱动实现代码,根据预定义选择不同的驱动板库

7、sensors.h传感器的实现文件
8、servos.h舵机的实现文件

声明了舵机的结构体

 

 

Tips 3 主程序的修改

1、启用Base Controller

  1. #define USE_BASE // Enable the base controller code
  2. //#undef USE_BASE // Disable the base controller code

 2、马达控制板定义

选择一种电机驱动方式。可以采用L298驱动方式。

  1. /* Define the motor controller and encoder library you are using */
  2. #ifdef USE_BASE
  3. /* The Pololu VNH5019 dual motor driver shield */
  4. #define POLOLU_VNH5019
  5. /* The Pololu MC33926 dual motor driver shield */
  6. //#define POLOLU_MC33926
  7. /* The RoboGaia encoder shield */
  8. #define ROBOGAIA
  9. /* Encoders directly attached to Arduino board */
  10. //#define ARDUINO_ENC_COUNTER
  11. /* L298 Motor driver*/
  12. //#define L298_MOTOR_DRIVER
  13. #endif

 3、波特率以及占空比最大值

  1. /* Serial port baud rate */
  2. #define BAUDRATE 57600
  3. /* Maximum PWM signal */
  4. #define MAX_PWM 255

 4、调控周期

此项可以设置PID调控周期。

  1. /* Run the PID loop at 30 times per second */
  2. #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 阅读(...) 评论(...) 编辑 收藏

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/菜鸟追梦旅行/article/detail/568614
推荐阅读
相关标签
  

闽ICP备14008679号