ROS(Robot Operating System)是机器人领域最主流的开发框架。在智能小车上运行ROS,相当于给小车装上了标准化的"操作系统",可以轻松复用各种开源算法包。
一、硬件要求
树莓派4B(4GB版本)作为ROS主控
STM32或Arduino作为底层电机控制器
2WD或4WD小车底盘 + 电机驱动
激光雷达(如RPLIDAR A1)或深度相机(如Intel RealSense D435)用于SLAM
IMU模块(MPU6050或ICM20948)用于姿态检测
12V锂电池 + 降压模块
二、安装ROS
推荐使用Ubuntu Mate 20.04 + ROS Noetic。如果树莓派性能有限,也可以使用ROS2 Foxy。
安装步骤:
sudo apt install curl -y
curl -s https://raw.githubusercontent.com/ros/rosdistro/master/ros.asc | sudo apt-key add -
sudo apt-add-repository 'deb http://packages.ros.org/ros/ubuntu focal main'
sudo apt update
sudo apt install ros-noetic-ros-base -y
sudo apt install ros-noetic-slam-gmapping ros-noetic-navigation -y
三、ROS节点架构
我们的智能小车ROS系统包含以下节点:
1. ros_arduino_bridge(或rosserial):树莓派与STM32串口通信节点
2. teleop_twist_keyboard:键盘遥控节点
3. rplidar_ros:激光雷达数据读取节点
4. hector_slam 或 gmapping:SLAM建图节点
5. move_base:自主导航节点
整体数据流:传感器数据 → SLAM建图 → 代价地图 → move_base路径规划 → 速度指令 → 电机控制
四、编写底盘驱动
# 简单的ROS底盘驱动示例(Python)
#!/usr/bin/env python3
import rospy
from geometry_msgs.msg import Twist
import serial
class BaseController:
def __init__(self):
rospy.init_node('base_controller')
self.ser = serial.Serial('/dev/ttyAMA0', 115200)
rospy.Subscriber('/cmd_vel', Twist, self.cmd_callback)
rospy.spin()
def cmd_callback(self, msg):
# 将Twist消息转换为电机PWM值
linear_x = msg.linear.x
angular_z = msg.angular.z
left_speed = int((linear_x - angular_z * 0.5) * 100)
right_speed = int((linear_x + angular_z * 0.5) * 100)
# 通过串口发送给STM32
cmd = f"{left_speed},{right_speed}\n"
self.ser.write(cmd.encode())
if __name__ == '__main__':
BaseController()
五、SLAM建图与导航
1. 启动激光雷达:roslaunch rplidar_ros rplidar.launch
2. 启动SLAM:roslaunch slam_gmapping gmapping.launch
3. 用键盘遥控小车走一圈房间,rviz中可以看到地图实时生成。
4. 地图保存:rosrun map_server map_saver -f my_map
5. 启动导航:roslaunch my_robot navigate.launch
6. 在rviz中点击2D Nav Goal设定目标点,小车就会自动规划路径并导航过去。
六、常见问题
Q:树莓派运行ROS太卡?
A:建议使用树莓派4B 4GB以上版本。SLAM建图时减少激光雷达扫描频率到5Hz。
Q:串口通信丢包?
A:检查树莓派的串口是否被蓝牙占用(需要禁用蓝牙串口),增加通信校验码。

微信联系
淘宝联系