用Jetson Nano和单目摄像头,手把手教你DIY一个能‘认人’的ROS跟随小车

张开发
2026/4/12 6:27:41 15 分钟阅读

分享文章

用Jetson Nano和单目摄像头,手把手教你DIY一个能‘认人’的ROS跟随小车
从零构建基于Jetson Nano的ROS智能跟随小车硬件选型与深度学习实战在创客社区和高校实验室里智能跟随小车一直是入门机器人学的经典项目。不同于市面上成品机器人动辄上万的售价我们今天要实现的是一套成本控制在3000元以内、完全开源的解决方案。这个项目完美结合了嵌入式开发Jetson Nano、机器人操作系统ROS和深度学习PyTorch/TensorFlow三大技术栈特别适合想要跨入AI机器人领域的开发者作为练手项目。我去年在指导大学生创新项目时发现许多团队在硬件选型和软件集成环节浪费了大量时间。本文将分享经过实际验证的硬件配置方案以及避免常见坑点的代码实现技巧。跟随小车看似简单实则涉及目标检测、单目测距、运动控制三个关键技术模块的协同工作是理解现代服务机器人基础架构的绝佳切入点。1. 硬件选型与组装平衡性能与成本1.1 核心计算单元Jetson Nano的配置优化Jetson Nano作为项目的大脑其配置直接影响整个系统的响应速度。推荐选择4GB内存版本而非2GB版本因为深度学习模型运行时容易爆内存。实测数据表明配置项2GB版本表现4GB版本表现YOLOv5s推理速度约8FPS约12FPS多进程稳定性常出现OOM错误可稳定运行ROS深度学习节点长期运行温度常超过75℃需外接散热65℃左右被动散热即可提示购买时选择带有散热风扇的套件或者自行加装散热片。持续高负载运行会导致CPU降频影响跟踪实时性。电源供应是另一个容易忽视的关键点。必须使用5V/4A的电源适配器micro USB接口供电方案无法满足电机启动时的瞬时电流需求。我曾遇到小车在跟随过程中突然重启的问题最终发现是电源功率不足导致。1.2 视觉传感器选型单目摄像头的取舍虽然RGB-D相机能直接获取深度信息但考虑到成本Kinect约2000元 vs 普通摄像头约200元和ROS驱动兼容性我们选择单目方案。经过测试比较推荐以下两款罗技C920支持1080p/30fpsH.264编码Ubuntu免驱奥尼A3170度广角低照度表现优异适合室内环境安装时要注意固定方式——使用可调节角度的万向支架确保摄像头俯仰角可调。这是后续单目测距准确的重要前提。一个实用的技巧是用3D打印件将摄像头抬高5-10cm避免车体遮挡视野。1.3 运动执行机构电机与底盘的选择四轮驱动虽然稳定性好但考虑到算法复杂度建议初学者从两轮差速驱动开始。淘宝上常见的配置方案# 典型电机参数 电机类型JGA25-370直流减速电机 减速比1:34 额定电压12V 空载转速300rpm 编码器分辨率11CPR可选搭配L298N或TB6612电机驱动模块即可满足基本需求。底盘尺寸建议在20x15cm左右太小会影响稳定性太大则增加控制难度。一个容易踩的坑是轮子材质——硅胶轮胎在光滑地砖上容易打滑建议选择带有纹路的橡胶轮胎。2. 软件环境搭建ROS与深度学习的融合2.1 系统镜像与ROS安装Jetson Nano官方推荐使用JetPack 4.6系统镜像其已内置CUDA和cuDNN支持。ROS版本选择MelodicUbuntu 18.04或NoeticUbuntu 20.04安装步骤如下# 设置软件源 sudo sh -c echo deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main /etc/apt/sources.list.d/ros-latest.list sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-key C1CF6E31E6BADE8868B172B4F42ED6FBAB17C654 # 安装完整版ROS sudo apt update sudo apt install ros-noetic-desktop-full # 初始化rosdep sudo rosdep init rosdep update注意在Jetson Nano上编译ROS包耗时较长建议使用-j4参数限制并行编译任务数避免内存耗尽。2.2 深度学习环境配置PyTorch和TensorFlow的ARM版本需要从NVIDIA官网下载预编译包。以下是性能对比测试结果框架推理延迟(ms)内存占用(MB)模型兼容性TensorFlow 2851200优秀PyTorch 1.872950良好ONNX Runtime68800中等对于跟随小车项目推荐使用PyTorch部署轻量级模型。例如使用MobileNetV3作为backbone的SSD模型在保持较高精度的同时可以实现接近实时的检测速度。2.3 ROS工作空间创建与依赖安装建立catkin工作空间并安装必要依赖mkdir -p ~/follow_ws/src cd ~/follow_ws/src git clone https://github.com/ros-teleop/teleop_twist_keyboard git clone https://github.com/ROBOTIS-GIT/turtlebot3.git cd .. rosdep install --from-paths src --ignore-src -r -y catkin_make -j4这里特别说明为什么要引入turtlebot3的包——虽然我们不使用TurtleBot硬件但其turtlebot3_bringup包中包含了许多现成的ROS启动文件和参数配置可以大大节省开发时间。3. 核心算法实现从检测到控制的完整链路3.1 基于深度学习的目标检测我们采用改进版的YOLOv5s模型进行人体检测主要修改包括输入分辨率调整为320x320以提升速度去除对小物体的检测头专注人体检测量化模型为INT8精度模型部署代码关键片段import torch from models.experimental import attempt_load model attempt_load(yolov5s_person.pt, map_locationcuda:0) model.half() # 使用半精度推理 def detect(frame): img preprocess(frame) # 缩放归一化 img torch.from_numpy(img).to(cuda:0) pred model(img, augmentFalse)[0] pred non_max_suppression(pred, 0.5, 0.4) # NMS过滤 return pred[0] # 返回检测结果在实际测试中这套方案在Jetson Nano上能达到15FPS的处理速度足够满足实时跟随需求。3.2 单目视觉测距的工程实现单目测距通常需要知道目标实际尺寸但我们采用更实用的逆透视映射法。具体步骤在距离摄像头50cm、100cm、150cm处放置标定板采集各距离下人体检测框的高度像素值拟合距离与框高的关系曲线distance a/(box_height b) c实测数据示例实际距离(cm)检测框高度(像素)5022010011015073对应的Python实现# 标定参数需根据实际摄像头调整 A, B, C 12000, -10, -5 def estimate_distance(box_height): return A/(box_height B) C这种方法在1.5米范围内误差可以控制在±10cm以内完全满足跟随需求。需要注意的是标定时要保持摄像头俯仰角与使用时一致。3.3 运动控制PID调节实战差速驱动小车的控制需要两个PID控制器一个控制距离一个控制角度。ROS中的实现方式import rospy from pid import PID from geometry_msgs.msg import Twist distance_pid PID(Kp0.5, Ki0.01, Kd0.1) angle_pid PID(Kp0.3, Ki0.0, Kd0.05) def control_loop(distance_error, angle_error): linear distance_pid.update(distance_error) angular angle_pid.update(angle_error) cmd Twist() cmd.linear.x np.clip(linear, -0.5, 0.5) # 限制最大速度 cmd.angular.z np.clip(angular, -1.0, 1.0) pub.publish(cmd)PID参数调节经验先调P项使小车能快速响应但不震荡再调D项抑制超调最后加少量I项消除静差在实验室地砖环境下建议初始参数为Kp0.5, Ki0.01, Kd0.1可根据实际表现微调。4. 系统集成与调试技巧4.1 ROS节点架构设计整个系统包含以下节点及其通信关系[摄像头驱动] -- (图像话题) -- [目标检测节点] -- (位置话题) | [控制节点] -- (距离/角度) -- [测距节点] --对应的launch文件配置launch node pkgusb_cam typeusb_cam_node namecamera param namevideo_device value/dev/video0/ /node node pkgfollow_me typedetection.py namedetector outputscreen/ node pkgfollow_me typetracking.py nametracker param namemax_speed value0.5/ /node /launch4.2 常见问题与解决方案问题1检测框抖动严重原因光照变化导致模型置信度波动解决在检测结果上加入卡尔曼滤波from filterpy.kalman import KalmanFilter kf KalmanFilter(dim_x4, dim_z2) kf.x np.array([x, y, 0, 0]) # 初始位置和速度 # 预测-更新循环 kf.predict() kf.update(measurement)问题2小车运动不平稳检查电机供电电压是否稳定在控制指令中加入加速度限制def smooth_control(target, current, max_accel): delta np.clip(target - current, -max_accel, max_accel) return current delta问题3远距离测距不准重新标定50cm以外的距离参数加入基于运动的速度估计辅助测距4.3 性能优化技巧使用TensorRT加速将PyTorch模型转换为TensorRT引擎python3 export.py --weights yolov5s_person.pt --include engine --device 0降低图像分辨率从1080p降至720p可提升30%处理速度关闭图形界面在无外接显示器时通过sudo systemctl set-default multi-user.target节省系统资源在最终实现中我们的跟随小车可以在室内1.5米范围内稳定跟随平均延迟控制在200ms以内完全满足教学和展示需求。整个项目最耗时的部分其实是机械结构的调试建议在开始编码前先确保硬件平台稳固可靠。

更多文章