1 launch启动Gamapping建图
创包

写代码


编译运行


保存地图


2 Gmapping建图参数



3 地图的保存和加载
保存
保持运行


查看


加载


4 Navigation导航系统

5 move_base导航
将图像放在


创包

代码



运行


启动rviz 发送目标点


6 全局规划器




navfn默认用dijk算法 后可用A*(有bug)
global则也可都用 没bug

向目标生成路线 有障碍物停止
7 AMCL定位算法
定位机器人的位置
通过分身进行预判机器人位置-应对里程计误差


查看分身


8 代价地图Costmap
全局规划器生成的路线不考虑机器大小

那么生成代价地图-让机器人不靠近
全局的只最开始计算一次 局部的随时进行



路线




9 代价地图的参数
将ns里面的内容加在文件的开头
python
obstacle_range: 6.0
含义:传感器能检测到障碍物的最大距离(米)。
用途:只有距离 ≤ 6.0 米的障碍物才会被加入代价地图。更远的障碍物忽略
(视为不影响当前导航)。
raytrace_range: 6.0
含义:传感器用于清空区域的最大距离。
用途:如果之前某位置标记为障碍物,但当前扫描在此方向上6米内没有检测到物体,
就将该位置"清空"为自由空间。
这是动态更新地图的关键:移除已消失的障碍物。
python
observation_sources: base_lidar
含义:声明一个观测源,命名为 base_lidar。可配置多个传感器(如 laser1 laser2)。
base_lidar: { ... }(子参数)
data_type: LaserScan
数据类型为激光扫描消息(ROS 标准消息类型 sensor_msgs/LaserScan)。
topic: /scan
订阅的激光雷达话题名称。雷达数据通过此话题发布。
marking: true
是否用此传感器数据标记障碍物(即添加新障碍物到地图)。
clearing: true
是否用此传感器数据清空自由区域(即移除不存在的障碍物)。


python
tatic_map: true ⬅️ 红框标注的核心参数
含义:是否从静态地图加载全局代价地图。
作用:
true:从地图服务器(map_server)加载预先构建好的静态地图(如 map.yaml)
作为全局代价地图的基础。
false:初始时为空,完全通过传感器动态构建(适用于无先验地图的场景)。
update_frequency: 1.0
含义:全局代价地图的更新频率为 1.0 Hz(每秒更新1次)。
说明:即使地图是静态的,机器人位置变化或新增障碍物(如新标记的禁区)
也需要更新代价地图中的信息。
publish_frequency: 1.0
含义:将代价地图发布为 ROS 话题(如 /global_costmap/costmap)的频率也是 1.0 Hz。
用途:供 RViz 等可视化工具订阅显示,或供其他模块使用。
transform_tolerance: 1.0
含义:坐标变换的最大容忍延迟为 1.0 秒。

用odom 因为map会跳变
python
static_map: false
含义:不加载静态地图作为初始地图。
作用:局部代价地图完全由传感器实时构建,只包含机器人周围当前检测到的障碍物
rolling_window: true ⬅️ 红框标注的核心机制
含义:启用滚动窗口模式。
工作原理:
代价地图是一个固定大小(图中 width: 3.0, height: 3.0)的窗口。
窗口中心始终跟随机器人移动(锁定在 robot_base_frame)。
当机器人移动时,窗口"滚动"------旧区域移出窗口,新区域进入窗口。
width: 3.0和 height: 3.0
含义:滚动窗口的宽度和高度都是3.0米。
python
update_frequency: 10.0
含义:局部代价地图更新频率为10 Hz(每秒10次)。
对比:全局地图更新频率1.0 Hz,局部地图更新频率高10倍。
原因:局部避障需要快速响应环境变化。
publish_frequency: 10.0
含义:发布到ROS话题的频率也是10 Hz,供实时显示和监控。
4. 容错参数
transform_tolerance: 1.0
含义:坐标变换最大容忍延迟1.0秒(与全局配置相同)。

10导航系统|恢复行为|Recovery Behaviors
当有障碍物的时候重新绘画路线


11 恢复行为的参数设置










清楚1.84以外的障碍物内容

12 局部规划器


DWA规划器





调节参数



TEB规划器





调节参数



13 action编程接口

导航会给client返回完成的情况
编写节点文件
python
主程序入口,初始化ROS节点,节点名为nav_client。
创建一个动作客户端(SimpleActionClient),连接到名为move_base
的动作服务器(负责路径规划与执行),并指定动作类型为MoveBaseAction。
ac.wait_for_server()阻塞直到move_base服务器就绪,确保连接成功后再发送目标。
创建一个MoveBaseGoal对象(目标点消息),后续需要为其设置目标位姿
(如坐标和朝向),再通过ac.send_goal(goal)发送给服务器。
图中代码仅展示了初始化,未包含完整的位姿设置和发送逻辑。


-
设置了机器人的目标位置在(-3.0, 2.0, 0.0)
-
朝向使用四元数表示,(0,0,0,1)表示无旋转(默认朝向)
python
ac.send_goal(goal) # 发送导航目标到move_base服务器
日志提示(第25行):
rospy.loginfo("开始导航...") # 输出开始导航信息
等待结果(第26行):
ac.wait_for_result() # 阻塞等待导航完成(成功或失败)

添加可执行权限

14 ros航点导航插件
将建完的地图放到文件夹里面


加载导航的位置

进行导航的保存

进行运行



在导航系统里面启动插件


粘贴文件


启动
仿真环境
导航系统
进行导航

python



15 ros的相机

彩色图像


ros相机图像的获取

创建包



python
bridge = CvBridge()
创建一个CvBridge类的实例。CvBridge是ROS与OpenCV之间的"桥梁",
专门用于实现ROS图像消息(sensor_msgs/Image)与OpenCV图像格式
(numpy数组)之间的相互转换
cv_image = bridge.imgmsg_to_cv2(msg, "bgr8")
在try块中,使用bridge.imgmsg_to_cv2()方法将ROS图像消息转换为OpenCV图像。
msg:待转换的ROS图像消息。
"bgr8":指定转换后的图像编码格式为BGR三通道8位,
这是OpenCV处理彩色图像的常用格式。
python
except CvBridgeError as e:
当try代码块中的代码(即bridge.imgmsg_to_cv2(msg, "bgr8"))执行失败,
并抛出CvBridgeError类型的异常时,程序会跳转到这里执行。
CvBridgeError是cv_bridge模块专门定义的错误类型,通常发生在ROS图像消息
与OpenCV格式不匹配、编码不支持或数据损坏时。
as e表示将捕获到的异常对象赋值给变量e,以便后续使用(例如打印错误信息)。
rospy.logerr("格式转换错误:%s", e)
这是ROS提供的日志记录函数,用于输出错误级别的日志。
它会将错误信息输出到ROS的日志系统(可以通过rosout查看),并在终端显示为红色错误信息。
"格式转换错误:%s"是格式化字符串,%s会被变量e(即具体的错误描述)替换。

添加可执行权限

编译

启动




颜色目标识别与定位


防止RBG受光照对饱和度和亮度的影响

设置阈值可以提取特定的颜色 

编写



python
cv2.equalizeHist(v):仅对明度(Value)通道进行直方图均衡化
cv2.merge():将处理后的三个通道重新合并



python
cv2.createTrackbar(..., hue_min, ...)
作用:滑动条创建时的初始位置
类型:整数变量
实际显示:图中显示滑块初始在77的位置
cv2.createTrackbar(..., 179, ...)
作用:滑动条的取值范围上限
范围:0-179(对于HSV色彩空间的Hue通道,最大179°)
实际限制:滑块最右端对应179
cv2.createTrackbar(..., nothing)
作用:滑动条值变化时自动调用的函数
示例:通常定义为def nothing(x): pass
功能:可以在回调函数中实时处理滑动条值的变化
python
v2.createTrackbar("hue_min", "Threshold", hue_min, 179, nothing)
# 最小色相值,范围0-179
cv2.createTrackbar("hue_max", "Threshold", hue_max, 179, nothing)
# 最大色相值,范围0-179


python
hue_min = cv2.getTrackbarPos("hue_min", "Threshold")
hue_max = cv2.getTrackbarPos("hue_max", "Threshold")
satu_min = cv2.getTrackbarPos("satu_min", "Threshold")
satu_max = cv2.getTrackbarPos("satu_max", "Threshold")
val_min = cv2.getTrackbarPos("val_min", "Threshold")
val_max = cv2.getTrackbarPos("val_max", "Threshold")
从名为"Threshold"的窗口中读取6个滑动条的当前位置值
HSV三通道阈值获取:
色调(Hue):hue_min~ hue_max(范围0-179)
饱和度(Saturation):satu_min~ satu_max(范围0-255)
明度(Value):val_min~ val_max(范围0-255)

权限

启动

ros颜色目标跟随





python
假设有 N 个白色像素,每个像素的坐标为 (x₁, y₁), (x₂, y₂), ..., (xₙ, yₙ)。
则质心坐标 (Cx, Cy) 的计算公式为:
Cx = (x₁ + x₂ + ... + xₙ) / N
Cy = (y₁ + y₂ + ... + yₙ) / N
target_x、target_y:目标在图像中的质心坐标(像素单位)。
image_width、image_height:图像的宽度和高度(像素)。




权限

启动


人脸检测







权限





