1

これは、ドリーに沿ってカメラを移動するためのタイムラプス スクリプトです。問題は、コードを実行すると、時々 (たとえば、反復 7 で) ドリーが動いていて、同時にカメラが写真を撮ってしまうことです。次のコマンドが実行される前にコマンドがブロックされていないかのようです。ご覧のとおり、コード内でスリープを分散させようとしましたが、役に立ちませんでした。

ワークフローは次のとおりです。

  1. Raspberry Pi はカメラ (スナップ写真) と Arduino (ドリーの移動) にコマンドを送信します。
  2. Arduino はEasyDriver Stepper Motor Driverと通信します。EasyDriver Stepper Motor Driver はステッパーと通信し、台車を動かします。
  3. 繰り返す。

これが私のPythonスクリプトです。

import os, commands, string, gps
from subprocess import Popen, PIPE
from time import sleep
import serial

ser = serial.Serial('/dev/ttyACM0', 9600)
sleep (5)

for i in range(0, 20):
    #To write information
    steps = 1000*(i+1)
    ser.write('1,'+str( steps )+'/n')
    sleep (4)

    bashCommand = "sudo /home/mh00h/Timelapse/camerareset.sh"
    os.system(bashCommand)
    sleep (2)
    bashCommand = "sudo gphoto2 --capture-image"
    os.system(bashCommand)
    sleep (1)
4

1 に答える 1

3

これが必要に応じてブロックされない理由は (潜在的に) 2 つあります。

  1. シリアル通信はバッファリングされるため、渡されたデータの長さがSerial.write()Arduino スケッチによってデータが読み取られる前にこの呼び出しが返すことができるバッファよりも小さい限り。実際、データの長さとバッファのサイズによってはSerial.write()、Arduino が読み取りを完了する前に、いくつかの呼び出しが完了する可能性があります。
  2. Arduino スケッチは、ステッピング モーターが動きを完了するまでブロックされない場合があります。これが当てはまるかどうかを判断するには、スケッチを確認すると便利です。

通話の合間にスリープすることは役に立ちますが、これを機能させることができたとしても、奇妙で再現性のない動作が発生する可能性があります。

上記の両方の問題の解決策は、コード内のアクションを同期することです。シリアル通信の場合、これは Arduino スケッチから python スクリプトに「終了」メッセージを送信することで実現できます。python スクリプトは、このメッセージを受信するまでシリアル ポートから読み取ります。ステッピング モーターを Arduino スケッチと同期する方法 (必要な場合) は、Arduino からステッピング モーターへの通信がどのようにコーディングされているかによって異なります。

于 2013-05-09T09:03:13.047 に答える