ROS与Arduino:用Twist消息+用键盘+用Xbox one手柄 控制小车
ros_arduino_brige功能包使用和安装这里就不多说了,详情点击
先看一下ros_arduino_brige功能包的文件系统
├── 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 #定义相关参数,我们需要对此修改才能使用。由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 #类包默认空文件
当下位机程序烧好之后,来重点看一下上位机的程序
先看一下给好的launch文件
<launch>
<node name="arduino" pkg="ros_arduino_python" type="arduino_node.py" output="screen">
<rosparam file="$(find ros_arduino_python)/config/my_arduino_params.yaml" command="load" />
</node>
</launch>
它引用的是/config/my_arduino_params.yaml这个文件,而最初的是没有这个文件的,我们只需要把/config/arduino_params.yaml复制一份改个名字就好了,一起看一下这个文件,里面有几个需要注意的地方,下面这个是我改好的我使用的
rate: 50
sensorstate_rate: 10
use_base_controller: True #你要修改的部分 改为True
base_controller_rate: 10
# For a robot that uses base_footprint, change base_frame to base_footprint
base_frame: base_link
# === 这部分是车子的参数,比如*直径,减速比,编码器信息等,根据你自己的车子来修改
wheel_diameter: 0.065 #你要修改的部分
wheel_track: 0.125 #你要修改的部分
encoder_resolution: 8384 #你要修改的部分
gear_reduction: 1.0 #你要修改的部分
motors_reversed: False #你要修改的部分
# === PID 部分,控制轮速,修改到车子能够根据命令走直线且速度稳定
Kp: 10 #你要修改的部分
Kd: 12 #你要修改的部分
Ki: 0 #你要修改的部分
Ko: 50 #你要修改的部分
accel_limit: 1.0 #你要修改的部分
# === Sensor definitions. Examples only - edit for your robot.
# Sensor type can be one of the follow (case sensitive!):
# * Ping
# * GP2D12
# * Analog
# * Digital
# * PololuMotorCurrent
# * PhidgetsVoltage
# * PhidgetsCurrent (20 Amp, DC)
sensors: {
#motor_current_left: {pin: 0, type: PololuMotorCurrent, rate: 5},
#motor_current_right: {pin: 1, type: PololuMotorCurrent, rate: 5},
#ir_front_center: {pin: 2, type: GP2D12, rate: 10},
#sonar_front_center: {pin: 5, type: Ping, rate: 10},
arduino_led: {pin: 13, type: Digital, rate: 5, direction: output}
}
通常我们既然使用了这个功能包,无非改个电机驱动编码器驱动,这个use_base_controller要改为True的,要不然发布twist消息小车也不会有响应的
再检查一下电机转动方向
$ rostopic pub -1 /cmd_vel geometry_msgs/Twist '{ angular: {z: 0.5} }'
这时两个*的转动方向应该是一致的,都是逆时针转动(右轮前进,左轮后退)。如果它们转动方向相反,那么就将motors_reversed 参数改为与之前相反的值,然后用ctrl+c 停止该节点,然后重新启动arduino.launch文件。
现在再发布twist消息小车应该是可以正常运行的了!
查看一下rqt_graph
用键盘控制小车
方法一:
安装键盘控制程序,直接安装在小车的workspace里面就可以
cd ~/catkin_ws/src
git clone https://github.com/ros-teleop/teleop_twist_keyboard.git
catkin_make
然后先把下车运行起来之后,打开新终端,启用键盘控制
rosrun teleop_twist_keyboard teleop_twist_keyboard.py
然后小车就可以用键盘控制了!
方法二:
下载turtlebot的功能包,利用ROS的重映射机制,把本来发布给turtlebot的速度话题让我们的机器人也能接收到
sudo apt-get install ros-kinetic-turtlebot-teleop
文件目录如下
打开keyboard_teleop.launch
<launch>
<!-- turtlebot_teleop_key already has its own built in velocity smoother -->
<node pkg="turtlebot_teleop" type="turtlebot_teleop_key" name="turtlebot_teleop_keyboard" output="screen">
<param name="scale_linear" value="0.5" type="double"/>
<param name="scale_angular" value="1.5" type="double"/>
<remap from="turtlebot_teleop_keyboard/cmd_vel" to="/cmd_vel"/>//这个需要更改
</node>
</launch>
上面的remap改一下,我忘了本来的是什么了,改成这样就对了,我们自己造的机器人通常都会用/cmd_vel来发布速度话题
然后
roslaunch turtlebot_teleop keyboard_teleop.launch
发现也可以控制我们的小车!!
用Xbox one手柄 控制小车
手柄的配置请看我的这篇博客
大家可以用上面博客的方法,也可以用下面这个方法
下载turtlebot的功能包,利用ROS的重映射机制,把本来发布给turtlebot的速度话题让我们的机器人也能接收到
文件目录如下:
打开xbox360_telelop.launch
(这个文件默认为只读文件,我们要修改,可以用这个命令:)
sudo gedit xbox360_telelop.launch
<launch>
<!--
Push the left frontal button labeled as 'LB' to activate cmd_vel publishing.
Move the left stick around to control the velocity.
-->
<!-- smooths inputs from cmd_vel_mux/input/teleop_raw to cmd_vel_mux/input/teleop -->
<include file="$(find turtlebot_teleop)/launch/includes/velocity_smoother.launch.xml"/>
<node pkg="turtlebot_teleop" type="turtlebot_teleop_joy" name="turtlebot_teleop_joystick">
<param name="scale_angular" value="1.5"/>
<param name="scale_linear" value="0.5"/>
<param name="axis_deadman" value="4"/>
<param name="axis_linear" value="1"/>
<param name="axis_angular" value="0"/>
<remap from="turtlebot_teleop_joystick/cmd_vel" to="/cmd_vel"/>//这个是要修改的地方
</node>
<node pkg="joy" type="joy_node" name="joystick"/>
</launch>
上面的remap改一下,我忘了本来的是什么了,改成这样就对了,我们自己造的机器人通常都会用/cmd_vel来发布速度话题
然后,打开新终端运行:
roslaunch turtlebot_teleop xbox360_teleop.launch
然后还有一个需要注意的地方,这里需要按着LB键移动摇杆才可以,刚开始忽略了这个,浪费了很多时间~
下面移动摇杆小车就可以跑起来了!
如果还不行,那就是手柄的权限问题:https://blog.csdn.net/weixin_44827364/article/details/104024261
可以查看我的这篇博客,给手柄赋予一下权限,也可以看下面这个截图