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

Git,强化学习,ROS2零碎知识点杂糅笔记
坷解决 rclpy 导入报错与环境配置
- 现象:终端运行正常,但在 VS Code 中
import rclpy报黄色波浪线警告。 - 原因:VS Code 的 Python 插件默认只扫描标准库路径,不知道 ROS 2 的库在哪里。
- 解决:
- 从已 source 过 ROS 环境的终端启动 VS Code (
code .)。 - 或在
.vscode/settings.json中添加python.analysis.extraPaths,指向/opt/ros/humble/lib/python3.10/site-packages。
- 从已 source 过 ROS 环境的终端启动 VS Code (
话题 (Topic) 与服务 (Service) 的核心区别
- 通信模型:
- Topic:单向广播(流式数据)。发布者只管发,不关心有没有人收。适用于雷达、图像等连续数据。
- Service:双向请求(一问一答)。客户端请求,服务端必须反馈。适用于开关、状态查询等瞬时操作。
- 误区:服务不是话题的上位替代,两者适用场景完全不同。
参数文件 (.yaml) 与服务定义 (.srv) 的区别
- YAML (.yaml):用于存储具体数据(配置存档)。例如机器人的颜色阈值、PID 参数。
- SRV (.srv):用于定义接口结构(通信合同)。定义请求包含什么字段(如
int64 a),响应包含什么字段(如int64 sum),不存储数值。
setup.py 中 data_files 与 entry_points 的作用
- data_files:搬运工。负责将非代码资源(Launch 文件、图片、Config)从源码目录复制到安装目录 (
install/share/)。如果不写,程序运行时会找不到文件。 - entry_points:入口生成器。负责将 Python 函数注册为终端可执行命令。
- 格式:
'命令名 = 包名.模块名:main函数'。
- 格式:
编写 Service 服务端 (create_service) 的易错点
- API:
self.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 历史 (清除旧存档)
- 场景:想要彻底删除所有历史提交,让仓库变成全新的“第一次提交”状态。
- 步骤:
- 删除本地历史:
rm -rf .git。 - 重新初始化:
git init->git add .->git commit -m "Init"。 - 强制推送:
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 | import numpy as np |
np.array_equal(a, b)是专门判断两个数组是否完全相等的函数,核心特性:
- 先判断两个数组的形状是否一致(比如都是 2 维、都是 N×2),形状不同直接返回 False;
- 形状一致则逐元素比较,所有元素都相等才返回单个 True,否则返回单个 False;
- 返回值是单个布尔值,可以直接用在if判断里,完美解决数组比较的问题。
1 | np.array_equal(loc1, loc2) # False(元素不全等) |
@dataclass、default_factory 与 Lambda
1. @dataclass 装饰器
来源:from dataclasses import dataclass (Python 3.7+)
定义:一个用于简化类定义的装饰器,专门用于创建主要存储数据的类(Data Class)。
核心功能:自动生成 __init__、__repr__、__eq__ 等样板代码,让代码极度简洁。
写法对比
- 传统写法(手动挡):
1
2
3
4
5
6class 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
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"]) |









