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小车作为平台,是可以进行很多后续项目的开发的,可以说是既简单又重要了。