Fork me on GitHub

ros_arduino_bridge文件系统

 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             #定义相关参数,我们需要对此修改才能使用。由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                 #类包默认空文件 

1.下载安装ros_arduino_bridge

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

2.编译

 

cd ..
catkin_make

实际上,编译完成后并不能直接控制小车,还需要匹配串口,修改设置文件
在ubuntu终端输入(查看串口号)

ls /dev/ttyACM*

 

 

 

可以看到你的串口情况,比如我的上位机和下位机就是通过 /dev/ttyACM0 连接的。
接下来修改配置文件arduino_params.yaml,比如说我的就位于
~/catkin_ws/src/ros_arduino_bridge/ros_arduino_python/config,打开:

 1 # For a direct USB cable connection, the port name is typically
 2 # /dev/ttyACM# where is # is a number such as 0, 1, 2, etc
 3 # For a wireless connection like XBee, the port is typically
 4 # /dev/ttyUSB# where # is a number such as 0, 1, 2, etc.
 5 
 6 port: /dev/ttyUSB0            #你要修改的部分,改为arduino板和上位机连接的串口号
 7 baud: 57600
 8 timeout: 0.1
 9 
10 rate: 50
11 sensorstate_rate: 10
12 
13 use_base_controller: True     #你要修改的部分 改为True
14 base_controller_rate: 10
15 
16 # For a robot that uses base_footprint, change base_frame to base_footprint
17 base_frame: base_link
18 
19 # === 这部分是车子的参数,比如轮子直径,减速比,编码器信息等,根据你自己的车子来修改
20 wheel_diameter: 0.146        #你要修改的部分
21 wheel_track: 0.2969          #你要修改的部分
22 encoder_resolution: 8384     #你要修改的部分
23 gear_reduction: 1.0          #你要修改的部分
24 motors_reversed: True        #你要修改的部分
25 
26 # === PID 部分,控制轮速,修改到车子能够根据命令走直线且速度稳定
27 Kp: 10                       #你要修改的部分
28 Kd: 12                       #你要修改的部分
29 Ki: 0                        #你要修改的部分
30 Ko: 50                       #你要修改的部分
31 accel_limit: 1.0             #你要修改的部分
32 
33 # === Sensor definitions.  Examples only - edit for your robot.
34 #     Sensor type can be one of the follow (case sensitive!):
35 #      * Ping
36 #      * GP2D12
37 #      * Analog
38 #      * Digital
39 #      * PololuMotorCurrent
40 #      * PhidgetsVoltage
41 #      * PhidgetsCurrent (20 Amp, DC)
42 
43 
44 
45 sensors: {
46   #motor_current_left:   {pin: 0, type: PololuMotorCurrent, rate: 5},
47   #motor_current_right:  {pin: 1, type: PololuMotorCurrent, rate: 5},
48   #ir_front_center:      {pin: 2, type: GP2D12, rate: 10},
49   #sonar_front_center:   {pin: 5, type: Ping, rate: 10},
50   arduino_led:          {pin: 13, type: Digital, rate: 5, direction: output}
51 }

给配置文件改个名,改成my_arduino_params.yaml

3.下位机

从github下载的代码中包含对应的arduino mega2560下位机程序,严格按照原作者推荐安装下位机的话就可以直接使用,否则就要做对应修改。

4.测试

环境设置

1 echo "source ~/catkin_ws/devel/setup.bash" >> ~/.bashrc
2 source ~/.bashrc

新终端,启动节点

roslaunch ros_arduino_python arduino.launch

 

 

新终端,发布Twist消息来控制机器人的运行,如:

1 rostopic pub /cmd_vel geometry_msgs/Twist -r 1 -- '[2.0, 0.0, 0.0]' '[0.0, 0.0, 1.8]'

 

 运行此命令,机器人会原地打转,用如下命令查看odom的信息,此信息会不断的变化

新终端,查看里程
rostopic echo /odom

 

 显然很多人不太喜欢小车的行走信息只是一串串数字,那样看起来太不直观了,幸好ros提供这样的工具rqt_plot,可以图形化显示这些信息,新开一个终端,输入:

1 rosrun rqt_plot rqt_plot

会出现以下一个窗口,把需要显示的里程计topic输入左上角窗口,例如/odom/pose/pose/orientation就会把这些信息以曲线的形式显示出来,当然这里只是一个使用rqt_plot的例子,位置信息显然不适合这样显示出来,但各位可以修改ros_arduino_bridge的base_controller.py这个文件,将小车的速度以一个话题的形式发布出来,这样也方便大家调节PID参数。

 

 

至此机器人已经可以按照Twist消息进行控制,但是使用rostopic pub 为cmd_vel话题发送控制信息显然很麻烦。这里我们改为使用键盘来控制小车。

5.使用键盘控制小车

安装键盘控制程序,可以直接安装在小车的workspace里面

 

1 cd ~/catkin_ws/src
2 git clone https://github.com/ros-teleop/teleop_twist_keyboard.git 
3 catkin_make

 

启动小车后,再启动键盘控制:

1 rosrun teleop_twist_keyboard teleop_twist_keyboard.py

接下来就可以直接使用键盘来控制小车了

 

 

 

6.关系图

新终端,执行:

 

1 rqt_graph

 

接下来我们就能看到节点之间是如何通信的:键盘节点通过/cmd_vel这个话题向arduino节点发送控制信息,从而控制小车。(由于我们没有查看odom话题,就没有显示在下面)

topics(all)

 

 node only

使用键盘发布命令就是代替rostopic pub的作用给cmd_vel发布控制信息,这样就方便了不少,当然这本质上仍然是一个简单的项目教程,就类似ros上的小乌龟教学项目,只不过是实物化了。即使如此,一个ros小车作为平台,是可以进行很多后续项目的开发的,可以说是既简单又重要了。

 

 

posted @ 2019-12-09 16:16  90hou技术员  阅读(1076)  评论(0编辑  收藏  举报