基于 ROS Noetic 与 TurtleBot3 的室内自主避障巡检小车仿真系统 📅 2026/7/24 6:38:51 一、整体实现路线Ubuntu 20.04.6 ROS Noetic Gazebo 11 Classic TurtleBot3 Burger LaserScan Python rospy /cmd_vel实现虚拟机中的室内自主避障巡检小车仿真。二、安装环境1.安装基础环境sudo apt updatesudo apt upgrade -ysudo apt install -y curl gnupg lsb-release git gedit2.安装 ROS Noeticsudo sh -c echo deb http://packages.ros.org/ros/ubuntu focal main /etc/apt/sources.list.d/ros-latest.listcurl -s https://raw.githubusercontent.com/ros/rosdistro/master/ros.asc | sudo apt-key add -sudo apt updatesudo apt install -y ros-noetic-desktop-full3.配置环境变量echo source /opt/ros/noetic/setup.bash ~/.bashrcsource ~/.bashrc4.配置环境变量echo source /opt/ros/noetic/setup.bash ~/.bashrcsource ~/.bashrc5.安装 catkin 工具sudo apt install -y python3-rosdep python3-catkin-tools python3-rosinstall python3-rosinstall-generator python3-wstool build-essential6.初始化rosdepsudo rosdep initrosdep update如果提示已经初始化过可以忽略。三、安装 TurtleBot3 相关包1.设置小车型号echo export TURTLEBOT3_MODELburger ~/.bashrcsource ~/.bashrc2.检查是否安装成功rospack find turtlebot3_descriptionrospack find turtlebot3_msgsrospack find turtlebot3_gazebo能输出路径就说明没问题。四、创建工作空间1.mkdir -p ~/catkin_ws/src cd ~/catkin_ws catkin_make2.配置工作空间echo source ~/catkin_ws/devel/setup.bash ~/.bashrcsource ~/.bashrc如果你之前已经有catkin_ws不用重复创建直接用cd ~/catkin_wscatkin_makesource devel/setup.bash五、测试TurtleBot3仿真1.第一个终端roscore2.第二个终端source ~/.bashrcexport TURTLEBOT3_MODELburgerroslaunch turtlebot3_gazebo turtlebot3_world.launch如果 Gazebo 出现 TurtleBot3 和障碍物环境就说明仿真正常3.第三个终端键盘控制测试source ~/.bashrcexport TURTLEBOT3_MODELburgerroslaunch turtlebot3_teleop turtlebot3_teleop_key.launch用键盘控制小车w前进 x后退 a左转 d右转 s停止如果小车能动说明 Gazebo、TurtleBot3、/cmd_vel都正常。六、创建自己的自动避障包1.进入源码目录cd ~/catkin_ws/src2.创建功能包catkin_create_pkg mini_car_avoidance rospy sensor_msgs geometry_msgs3.创建脚本目录cd ~/catkin_ws/src/mini_car_avoidancemkdir scriptscd scriptsgedit avoid_node.py4.写入避障程序使用Python实现#!/usr/bin/env python3import mathimport randomimport rospyfrom sensor_msgs.msg import LaserScanfrom geometry_msgs.msg import Twistclass MiniCarAvoidance:def __init__(self):rospy.init_node(mini_car_avoidance_node)self.cmd_pub rospy.Publisher(/cmd_vel, Twist, queue_size10)self.scan_sub rospy.Subscriber(/scan, LaserScan, self.scan_callback)self.safe_distance 0.45self.warning_distance 0.75self.turn_direction 1.0self.blocked_count 0rospy.loginfo(Mini car avoidance node started.)def clean_distance(self, value):if math.isinf(value) or math.isnan(value):return 10.0return valuedef get_sector_min(self, ranges, start_index, end_index):sector ranges[start_index:end_index]sector [self.clean_distance(x) for x in sector]if len(sector) 0:return 10.0return min(sector)def scan_callback(self, msg):ranges list(msg.ranges)total len(ranges)front self.get_sector_min(ranges, int(total * 0.45), int(total * 0.55))left self.get_sector_min(ranges, int(total * 0.65), int(total * 0.85))right self.get_sector_min(ranges, int(total * 0.15), int(total * 0.35))cmd Twist()if front self.safe_distance:cmd.linear.x 0.0if left right:cmd.angular.z 0.7self.turn_direction 1.0else:cmd.angular.z -0.7self.turn_direction -1.0self.blocked_count 1rospy.loginfo(Obstacle ahead. front%.2f left%.2f right%.2f,front, left, right)elif front self.warning_distance:cmd.linear.x 0.10if left right:cmd.angular.z 0.35self.turn_direction 1.0else:cmd.angular.z -0.35self.turn_direction -1.0rospy.loginfo(Warning area. Slowing down.)else:cmd.linear.x 0.22cmd.angular.z 0.0self.blocked_count 0if self.blocked_count 20:cmd.linear.x -0.05cmd.angular.z self.turn_direction * 0.8self.blocked_count 0self.cmd_pub.publish(cmd)if __name__ __main__:try:MiniCarAvoidance()rospy.spin()except rospy.ROSInterruptException:pass5.保存后赋予执行权限chmod x ~/catkin_ws/src/mini_car_avoidance/scripts/avoid_node.py6.编译cd ~/catkin_wscatkin_makesource devel/setup.bash七、运行自动避障程序开三个终端终端 1roscore终端 2source ~/.bashrcexport TURTLEBOT3_MODELburgerroslaunch turtlebot3_gazebo turtlebot3_world.launch终端 3source ~/.bashrcrosrun mini_car_avoidance avoid_node.py不能关闭其他终端运行后小车会根据/scan雷达距离自动判断前方安全直行前方较近减速转向前方太近原地转向避障卡住多次后退并转向八、RViz可视化启动 RVizrviz1.在RViz里设置Fixed FrameodomAdd → LaserScan → Topic 选择 /scanAdd → RobotModelAdd → TFAdd → Odometry → Topic 选择 /odom把 Fixed Frame 改成odom