虽然并不打算下位部分使用arduino,但是由于买的小车是用的这个,我也并不打算改里面的程序,所以准备先研究一下这个功能包,希望下一步,设计自己的控制器的bridge的时候,能够以这个为基础来设计,相信可以少走很多弯路。
1 简介
ROS_arduino_bridge 包括一个ROS驱动和一个基本控制,其实这个包是分成两部分的,一部分下载到arduino上。完成数字或模拟传感器采集,PWM侍候电机控制,读取编码器等。可以说这个包是实现底盘在ROS下控制的一个完全解决方案了。
需要注意的是:
这个包中的firmware,是针对于Pololu motor controller shield和Robogaia encoder shield来做的。我们可以根据自己的需要移植,用来控制别的电机驱动和编码器。我们也可以扩展用于读其他传感器。
源码地址:https://github.com/hbrobotics/ros_arduino_bridge.git
2 整体结构
现在的版本比起来下面这个结构略有变化,大概差不多
├── 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 #类包默认空文件
3 安装
3.1 安装串口功能包
sudo apt-get install python-serial
3.2 查看设备所在串口
输入指令:
ls /dev/ttyUSB*
可以看到:
/dev/ttyUSB0
或:
ls /dev/ttyACM*
3.3 设定串口访问权限
qking@qking:~$ ls -l /dev/ttyUSB0
crw-rw---- 1 root dialout 188, 0 10月 28 21:38 /dev/ttyUSB0
我们可以看到,root和dialout可以操作串口,将当前用户加入该用户组:
sudo usermod -a -G dialout <your_user_name>
将<your_user_name>
替换为你的用户名。
然后执行:
groups
或者直接执行:
sudo chmod 600 /dev/ttyUSB0 //一次性的增加权限,也可以把600改为777,最高权限
3.4 安装功能包
$ cd ~/catkin_workspace/src
$ git clone https://github.com/hbrobotics/ros_arduino_bridge.git
$ cd ~/catkin_workspace
$ catkin_make
后面再介绍对节点的参数配置和几个重要程序的内容,arduino端程序暂时不研究。