zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    c语言面试
    汇编面试基础
    求余符号的用法
    ++a和a++的一点不同
    OVER子句
    SQL执行计划解析(1) 执行计划基础
    sql 排序规则 chinese_prc_ci_as
    SQL执行计划解析(2) 基本查询的图形执行计划
    过sql_trace跟踪得到了该SQL的执行计划,如何看懂执行计划
    JS日历控件集合附效果图、源代码
  • 原文地址:https://www.cnblogs.com/flyingjun/p/8954156.html
Copyright © 2011-2022 走看看