明确了并不是一个threading快一个threading慢, 就是都慢
并且figured out 计算的trajectory和time interval无关,不论多慢都不会丢包
两个threading同时运行并不会使其共同变慢,对比如下图,都是在main threading里面输出的interval, 理想情况是100Hz
从mean和variance上面来看,差的并不多
有两篇文章讲为什么python里的threading很垃圾,https://www.youtube.com/watch?v=Obt-vMVdM8s and https://www.dabeaz.com/python/UnderstandingGIL.pdf, 码住,有时间看
现在复制一份Hiwonder代码并且尝试改为multiprocessing
——————————————————————————更新————————————————————————
换成了multiprocessing, 数据处理速度确实快了很多,而且也很稳定了
但是现在的问题是multiprocess 接收不到外面传来的信号,like(velocity),所以机器人不动
查阅了一下资料,threading是使用的同一个memory,但是multiprocessing用的是不同memory,所以如何处理不同processing之间的通信很重要
现在继续work on communication
经过一段时间的研究,发现main_threading和主函数数据交流很多而且频繁,使用multiprocessing的技术难度较大,而且不确定是否一定可行
但是另外一个servo_threading中只有一个数据传输,而且是单向输入的,所以比较适合用multiprocessing
现在implement 的code可以实现单向传输,** 但是在循环的时候只有外部有更新时,循环内部的值才会改变,当外部没有更新值时,循环的值还是初始值,这个需要解决一下 **
——————————————————12.3————————————————————————————
查阅资料得知,之前用的multiprocess的manager的namespace, 这个方法只能暂存并且传输数据,所以会导致不传数据的时候回到初始值的问题
后来使用了multiprocessing中的Array把传递setValue的状态,实验代码如下
from multiprocessing import Process, Array
import time
import numpy as np
def modify_shared_array(shared_array, rows, cols):
# Modify the two-dimensional array
while(1):
print((np.array(shared_array).reshape(rows,cols)))
time.sleep(0.01)
if __name__ == '__main__':
# Define the size of the 2D array
rows, cols = 3, 4
set_value = np.array([[1,2,3,4],[5,6,7,8],[9,10,11,12]])
print(set_value)
# Create shared array
shared_array = Array('i', set_value.flatten())
# Create a process and pass shared array and its dimensions
process = Process(target=modify_shared_array, args=(shared_array, rows, cols))
# Start the process
process.start()
for i in range(10):
for i in range(len(shared_array)):
shared_array[i] *=2
time.sleep(0.1)
# Wait for the process to finish
process.join()
结果如下:
[[ 1 2 3 4]
[ 5 6 7 8]
[ 9 10 11 12]]
[[ 2 4 6 8]
[10 12 14 16]
[18 20 22 24]]
[[ 2 4 6 8]
[10 12 14 16]
[18 20 22 24]]
[[ 2 4 6 8]
[10 12 14 16]
[18 20 22 24]]
[[ 2 4 6 8]
[10 12 14 16]
[18 20 22 24]]
[[ 2 4 6 8]
[10 12 14 16]
[18 20 22 24]]
[[ 2 4 6 8]
[10 12 14 16]
[18 20 22 24]]
[[ 4 8 12 16]
[20 24 28 32]
[36 40 44 48]]
[[ 4 8 12 16]
[20 24 28 32]
[36 40 44 48]]
[[ 4 8 12 16]
[20 24 28 32]
[36 40 44 48]]
[[ 4 8 12 16]
[20 24 28 32]
[36 40 44 48]]
[[ 4 8 12 16]
[20 24 28 32]
[36 40 44 48]]
[[ 4 8 12 16]
[20 24 28 32]
[36 40 44 48]]
[[ 8 16 24 32]
[40 48 56 64]
[72 80 88 96]]
[[ 8 16 24 32]
[40 48 56 64]
[72 80 88 96]]
[[ 8 16 24 32]
[40 48 56 64]
[72 80 88 96]]
[[ 8 16 24 32]
[40 48 56 64]
[72 80 88 96]]
[[ 8 16 24 32]
[40 48 56 64]
[72 80 88 96]]
[[ 8 16 24 32]
[40 48 56 64]
[72 80 88 96]]
[[ 8 16 24 32]
[40 48 56 64]
[72 80 88 96]]
[[ 16 32 48 64]
[ 80 96 112 128]
[144 160 176 192]]
[[ 16 32 48 64]
[ 80 96 112 128]
[144 160 176 192]]
[[ 16 32 48 64]
[ 80 96 112 128]
[144 160 176 192]]
[[ 16 32 48 64]
[ 80 96 112 128]
[144 160 176 192]]
[[ 16 32 48 64]
[ 80 96 112 128]
[144 160 176 192]]
[[ 16 32 48 64]
[ 80 96 112 128]
[144 160 176 192]]
[[ 32 64 96 128]
[160 192 224 256]
[288 320 352 384]]
[[ 32 64 96 128]
[160 192 224 256]
[288 320 352 384]]
[[ 32 64 96 128]
[160 192 224 256]
[288 320 352 384]]
[[ 32 64 96 128]
[160 192 224 256]
[288 320 352 384]]
[[ 32 64 96 128]
[160 192 224 256]
[288 320 352 384]]
[[ 32 64 96 128]
[160 192 224 256]
[288 320 352 384]]
[[ 32 64 96 128]
[160 192 224 256]
[288 320 352 384]]
成功在process外永久修改变量的值
最后成功地实施在了Puppy Pi上面,calculating interval (threading)稳定在0.01s,servo interval(process)稳定在0.008s
梦中花前书生 2023-12-12 16.06.53
future work:
- 为什么call puppy.py的时候他会很快倒地
- 有时候会启动失败,height会锁定在-5cm