import threading 就是用来开"多线程",让程序能同时干好几件事,互不卡住。
如果不用线程,你的代码根本跑不起来。
- 线程是什么?
你可以把线程理解成 一个人同时长了好几只手:
-
一只手 监听键盘
-
一只手 处理输入命令
-
一只手 跑 ROS2 循环
-
一只手 定时发话题
如果只有一只手(单线程):
你一按键盘,程序就卡住不动了;
一跑 ROS2,键盘就废了。
- 你这段代码里 开了 3 个线程
我给你逐一指出来:
线程1:ROS2 主线程
python
rclpy.spin(ctrl)
负责:
-
接收话题
-
运行定时器(0.1s 发位置)
-
处理回调
不跑这个,ROS2 就等于没启动。
线程2:键盘监听线程
python
keyboard_thread = threading.Thread(target=ctrl.keyboard_control, daemon=True)
keyboard_thread.start()
这只手专门:
-
监听你按 W/S/O/L 键
-
实时发送 CAN 指令
-
不阻塞 ROS2
线程3:控制台输入线程
python
input_thread = threading.Thread(target=input_thread_func, daemon=True)
input_thread.start()
这只手专门:
-
等你输入 0.5,0.3 这种绝对坐标
-
解析、发送 CAN 指令
-
也不阻塞 ROS2 和键盘
- 为什么必须用线程?(核心原因)
因为下面这些函数都是 阻塞(卡住)的:
-
get_key() → 一直等你按键
-
input() → 一直等你输东西
-
rclpy.spin() → 一直跑循环
如果不用线程:
→ 程序一启动就卡在键盘等待,ROS2 跑不起来
→ 或者一跑 ROS2,键盘和输入全部废了
线程 = 让它们同时跑,互不干扰。
- 最简单一句话总结
threading 就是让你的程序:
一边跑 ROS2,
一边监听键盘,
一边接收输入命令,
三件事同时干,谁也不耽误谁。
- 对应你代码里最关键的两句
python
开线程跑键盘
threading.Thread(target=ctrl.keyboard_control).start()
开线程跑输入
threading.Thread(target=input_thread_func).start()
这两个就是多线程的实际用处。