Git,强化学习,ROS2零碎知识点杂糅笔记

解决 rclpy 导入报错与环境配置

  • 现象:终端运行正常,但在 VS Code 中 import rclpy 报黄色波浪线警告。
  • 原因:VS Code 的 Python 插件默认只扫描标准库路径,不知道 ROS 2 的库在哪里。
  • 解决
    1. 从已 source 过 ROS 环境的终端启动 VS Code (code .)。
    2. 或在 .vscode/settings.json 中添加 python.analysis.extraPaths,指向 /opt/ros/humble/lib/python3.10/site-packages

话题 (Topic) 与服务 (Service) 的核心区别

  • 通信模型
    • Topic:单向广播(流式数据)。发布者只管发,不关心有没有人收。适用于雷达、图像等连续数据。
    • Service:双向请求(一问一答)。客户端请求,服务端必须反馈。适用于开关、状态查询等瞬时操作。
  • 误区:服务不是话题的上位替代,两者适用场景完全不同。

参数文件 (.yaml) 与服务定义 (.srv) 的区别

  • YAML (.yaml):用于存储具体数据(配置存档)。例如机器人的颜色阈值、PID 参数。
  • SRV (.srv):用于定义接口结构(通信合同)。定义请求包含什么字段(如 int64 a),响应包含什么字段(如 int64 sum),不存储数值

setup.pydata_filesentry_points 的作用

  • data_files搬运工。负责将非代码资源(Launch 文件、图片、Config)从源码目录复制到安装目录 (install/share/)。如果不写,程序运行时会找不到文件。
  • entry_points入口生成器。负责将 Python 函数注册为终端可执行命令。
    • 格式:'命令名 = 包名.模块名:main函数'

编写 Service 服务端 (create_service) 的易错点

  • APIself.create_service(类型, '名称', 回调函数)
  • 致命细节:回调函数 (def callback(request, response):) 执行完毕后,必须 return response
  • 后果:如果忘记 return,客户端会因为收不到响应而陷入死锁(一直等待)。

Git 提示“干净的工作区”但文件未提交

  • 误解:“干净”不代表没文件,而是代表所有文件都已提交或被忽略。
  • 常见原因 (ROS开发)仓库套仓库 (Nested Git)
    • 如果在 src 下的子文件夹里还有一个 .git 文件夹,外层的 Git 会自动忽略该子文件夹的所有内容。
  • 解决:删除子目录下的 .git 文件夹:rm -rf src/my_pkg/.git

为什么 GitHub 上看不到 README.md

  • 原因:GitHub 默认只渲染仓库根目录下的 README.md。
  • 错误位置:如果把 README 放在 src/ 或其他子文件夹里,首页是不会显示的。
  • 解决:将 README.md 移动到仓库的最外层目录。

如何强制覆盖 GitHub 历史 (清除旧存档)

  • 场景:想要彻底删除所有历史提交,让仓库变成全新的“第一次提交”状态。
  • 步骤
    1. 删除本地历史:rm -rf .git
    2. 重新初始化:git init -> git add . -> git commit -m "Init"
    3. 强制推送:git push -f origin main (注意 -f 参数是强制覆盖的关键)。

Git 中 origin 的含义

  • 定义origin 是远程仓库地址(URL)的别名
  • 作用:代替输入冗长的 https://github.com/user/repo.git
  • 操作
    • 查看:git remote -v
    • 修改:git remote set-url origin <新地址>
    • 删除:git remote remove origin

np.array_equal

比较numpy数组尽量不用==,要用np.array_equal。
两个 numpy 数组用==时,不会像普通变量 / 列表那样返回「单个 True/False」,而是对两个数组中对应位置的元素逐一比较 ,返回一个和原数组形状完全相同的布尔数组。

1
2
3
4
5
6
7
8
9
import numpy as np
# 任务1的位置:[5,6],任务2的位置:[5,7],任务3的位置:[5,6]
loc1 = np.array([5,6])
loc2 = np.array([5,7])
loc3 = np.array([5,6])

# 数组用==,逐元素比较,返回布尔数组
print(loc1 == loc2) # 输出 [ True False] → x相等,y不相等
print(loc1 == loc3) # 输出 [ True True] → x、y都相等

np.array_equal(a, b)是专门判断两个数组是否完全相等的函数,核心特性:

  1. 先判断两个数组的形状是否一致(比如都是 2 维、都是 N×2),形状不同直接返回 False;
  2. 形状一致则逐元素比较,所有元素都相等才返回单个 True,否则返回单个 False;
  3. 返回值是单个布尔值,可以直接用在if判断里,完美解决数组比较的问题。
1
2
np.array_equal(loc1, loc2)  # False(元素不全等)
np.array_equal(loc1, loc3) # True(所有元素相等,形状也一致)

@dataclass、default_factory 与 Lambda

1. @dataclass 装饰器

来源from dataclasses import dataclass (Python 3.7+)
定义:一个用于简化类定义的装饰器,专门用于创建主要存储数据的类(Data Class)。
核心功能:自动生成 __init____repr____eq__ 等样板代码,让代码极度简洁。

写法对比

  • 传统写法(手动挡)
    1
    2
    3
    4
    5
    6
    class Point:
    def __init__(self, x, y):
    self.x = x
    self.y = y
    def __repr__(self):
    return f"Point(x={self.x}, y={self.y})"
  • Dataclass 写法(自动挡)
    1
    2
    3
    4
    @dataclass
    class Point:
    x: int
    y: int

2. field(default_factory=…)

核心痛点:可变默认参数陷阱
在 Python 类中,绝对不能直接使用可变对象(如 list, dict, set)作为类变量的默认值。
错误写法:items: list = []
后果:所有该类的实例会共享同一个列表内存地址。修改 A 对象的列表,B 对象的列表也会随之改变。
为了解决共享问题,我们需要告诉 Python:不要使用现成的对象,而是每次实例化时,调用一个“工厂函数”现场创建一个新对象。
示例:

1
taskTypes: List[str] = field(default_factory=lambda: ["search", "fire", "facility"])