训狗日记
2025.04.26
给狗子充了电。
2025.05.02
开始尝试与 3-1 狗子建立连接,阅读 PPT 没明白 Cyberdog2 APP 是怎么突然出现的,咨询后发现是手机 APP,PPT 讲解顺序有点混乱。经过尝试连接成功,但不能站立。根据人工校准的图示,发现确实是位置没摆好,摆好后遥控动作成功。
Cyberdog2 APP 的 UI 与手机型号不适配,IP 显示只能看到 10.0.0 后的一个数字。利用 Advanced IP scanner 根据此信息扫描拿到了狗子的 IP。在个人电脑和 3-1 上开始安装 tightVNC。
晚,WJ 抵达,开始与 3-2 狗子互动。
发现自身系统直接打开 windows powershell 窗口的配色太怪了,不想调,遂换用 vscode 打开。熟悉了 vim 的操作,并完成了 tightVNC 的配置。
3-2 安装了 tightVNC,但出现灰屏。利用群内文件尝试修改 ~/.vnc/xstartup,图形界面出现,但命令行无法输入。3-2 最终决定换用 mobaxterm 进行操作,顺利开始。
通过两处 manual.py 的 get_namespace 的修改进行改名。3-1 改名为 jiqimao1,3-2 改名为 jiqimao2。尝试直接在命令行里键入 ros2 service call 相关指令使狗子站起,未果。暂时跳过此步骤。
创建了工作空间 workplace/src,创建了 learning 功能包,在 learning/learning 下依照 PPT 编写了 stand.py,增添了 learning/setup.py 有关 stand.py 的配置。尝试在 workplace 下 colcon build,报错,修复未果。直接 python3 stand.py 瞬间执行完成,但没有任何作用。
经咨询发现报错是正常的,能跑就行。明天试试。
2025.05.03
继续 3-1 的站立。source ~/workplace/install/setup.bash 报错 not found:"/opt/ros2/galactic/share/libg2o/local_setup.bash"。忽略。直接执行 ros2 run learning stand,狗子成功站立。WJ 到,3-2 试验亦成功。3-2 还试验了原地踏步、超声波测距、相机开启等,均顺利完成;但 bash 文件配置不成功,不能打开全部相机。
咨询了上位机相关问题,学习了 ROS2 的 callback 相关机制。
(以下内容由 WJ 撰写)
2025.05.04
修改了讲义中的代码,使用 $! 获取后台进程 PID,并在脚本末尾用 wait 维持主进程存活,最终成功使用 .bash 文件打开了 3-2 的相机。
之后将PPT里的追踪部分的代码拷贝到了 3-2 当中,使用 ros2 和 python3 运行了几次都没有反应,遂将 3-2 重启,重新连接后build,终于出现了错误信息,是有几处地方拷贝错误了。修正过后重新运行追踪部分的代码,输出 Connection Refused。
2025.05.05
出现 Connection Refused 的原因是没有正常打开深度相机,除此之外还报了一些和 ip 和 port 相关的错误,用 tightvncserver 连接后好像解决了。
后续仍然不断输出 Not Found (后来发现一直输出 Not Found 是因为上位机的追踪算法没有启用,需要我们自己写一个根据图片识别绿球的算法),就先搓了一个在 Not Found 的条件下狗子原地转圈的函数 rotate。
搞了一下午也没有搞清楚 RGB 相机如何使用,想索性直接用灰度图,搓了一个获取灰度图数据的程序 get_camera_info,却发现用 cv2 不能实时显示订阅的数据。
2025.05.06
cv2 必须配合 cv2.waitKey() 使用才有效,否则无法展示界面,将获取相机数据与展示数据写在一个循环里,将每一帧的展示时间设定为 1ms,最后可以实时显示画面。
发现先打开深度相机,再新开一个命令行运行 export DISPLAY=:0 并打开 RGB 相机就能使 RGB 相机正常工作
使用 cv2 库中的方法实现了绿球的识别功能:inRange 滤除非绿色部分,GuassianBlur 对图像进行平滑化处理,最后用 HoughCircles 检测图像中的圆形,并返回圆心坐标。
下午把之前写好的几类节点直接拷贝到 my_track 里,使用了比较初级的策略完成了识别到球后往前走,当球足够近时停下的功能。同时使用超声波测距实现了避障功能。(由 WJ 与 LX 共同完成)
(以下转回本人撰写)
晚上为 3-1 配备相应功能。编写了前进、左转、右转、坐下、超声结点。与 DC、YC 交流 ROS2 初步以及 cv 内容。
2025.05.07
3-1 cv 最终选用绿色过滤加中点检测的方法,即先把画面滤到只剩绿色,并忽略有色点过少的情形,再将所有有色点的中点视为球的中心,避免了各类噪点干扰问题,识别结果相当稳定。避障仍采用超声测距方法,最终停止结合绿色存在性与超声测距的两结果进行判断。
2025.05.14
WJ 适配了 vrpn 动捕系统。
2025.05.26
熟悉了动捕系统下的操作。
2025.05.27
将狗分配为防御和攻击,并使用 Attack 和 Defend 两个类分别对应,两个类共同继承 Act 基类。防御采用某一纵坐标上的横坐标预测和拦截方法,并针对球较近和较远的情况进行特化。在 rclpy 使用中,subscribe 和 publish 的队列长度现在设为了 $1$(以期望逼近即时处理)。编写了 kick 函数,分为调整朝向、助跑和暂停三个阶段,但有问题。
2025.05.28
WJ、DC、LX 实现了简单的攻击策略。让狗走到球和球门上随机点的延长线上,转向对准这条线,然后推球往前走,预期能实现对静止的球的进攻。
由于动捕系统及网络使用人数过多,在四元数等坐标变换上调试许久。
后续更改:近距离时,角度的误差影响非常大,在近距离计算时不再使用与角度有关的控制;移动不再要求转动到正对点再移动,而可以允许一个 pi / 4 的偏差;射门会在一个接近正对的时候出射,不再使用球门内角度的精确控制。
防御狗的表现很差,可能跟动捕系统的精度及时间延迟、狗的速度等都有关,不知道怎么调。攻击狗方面,在射门时采用了根据离球门距离以及已移动距离判断是否应该停止跑动的方法,避免撞进对方球门或护栏上,但转向的精度使狗并不能很好地从转向切换到跑动,以及在跑动时准确命中。
2025.05.29
一觉睡完,本队与冠军队的对局(也是整场比赛的第一个对局)已经结束,光速下播。实力和运气兼低导致的。听说他们启用了 plan B,但由于在睡觉,我并不知道。
总体来看,后续投入时间不足可能是最重要的问题;以后不能再这么多线程地干活了。(很可惜的是,在写下这几行字的时候,已经在多线程干活了。)