質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.61%

一つ前のデータと今取得したデータが異なれば処理を行いたい

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 2,833

py-berry-thon

score 40

これはプログラムの対象部分であり、これを動作させると以降、While True:内部を無限ループするものです。

題目のとおりですが、"gps.latitude[0], gps.longitude[0]"に格納されている小数点のデータが一個前のデータと同じであれば特に何も処理せず再度、ループの先頭に返し無限ループを始める、、ことを実装したいです。
上記の「特に何もせず」の部分ですが無記入だとエラー(頭にインデントを入れろ)が出てしまうので、"print("same")"としました。

どうかよろしくお願いいたします。

def rungps():
        #timeoutを秒で設定(10秒の間に受信したデータを返す)
        s = serial.Serial('/dev/serial0', 9600, timeout=10)
        #ここでGPSデータ取得するが初回はうまく取得できていない
        s.readline()
        #読むの1回目
        c = 1
        while True:
                #GPSデータを'utf-8'に変換
                sentence = s.readline().decode('utf-8')
                if sentence[0] != '$':
                        continue
                #GPSオブジェクトにデータを追加,更新する
                for x in sentence:
                        gps.update(x)

                if gps.clean_sentences > 20:
                        print('%2.8f, %2.8f' % (gps.latitude[0], gps.longitude[0]))
                        df = pd.DataFrame([[gps.latitude[0], gps.longitude[0]]])
                        #読むの1回目なら
                        if c == 1:
                                lat = gps.latitude[0]
                                lon = gps.longitude[0]

                                df.to_csv('r_latlon.csv', mode='a', header=False, index=False)

                                time.sleep(1.0)

                       #読むの2回目以降は
                        elif lat == gps.latitude[0] or lon == gps.longitude[0]:
                                print("same")

補足変更追記

①GPSが”35.0000, 139.0000”の形で35.000はgps.latitude[0]へ、139.0000はgps.longitude[0]へ格納されます。
GPSが繰り返し取得されるので、上記①が繰り返し動作しgps.latitude[0],gps.longitude[0]はその都度更新されます。
そこで一つ前のデータと今取得したデータが異なる場合にのみ動作させたく、プログラムを動作した直後一度目のgps.latitude[0],gps.longitude[0]データをlat及びlonに格納し2回目以降はlatとgps.latitude[0]を,lonとgps.longitude[0]を比較しようと思いました。
しかしこの通りに動作しなかったため、どのように変更すれば良いのかをお聞きした次第でございます。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • shinobu_osaka

    2019/01/06 19:47

    ちょっと何が聞きたいのかわかりません。
    コードも途中までですし…。
    とりあえず「一つ前のデータと次のデータが同じなら処理を行わない」ではなく、
    「一つ前のデータと今取得したデータが異なれば処理を行う」と記述するのが普通ではないでしょうか。

    キャンセル

回答 2

checkベストアンサー

+1

前回取得データと今回取得データを比較し、
前回取得データと今回取得データが異なれば処理を実行し、
前回取得データへ今回取得したデータを入れる。

上記の処理をループするだけで実現可能かと思います、
「同じであるか?」を確認するのではなく、「違うか?」を確認して処理をすれば、
「同じである場合何もしない」という記述そのものが必要なくなります。

また、ループの前に「前回取得データ」を入れる必要もありません。
(初回実行時は前回取得データ(0)と比較され"異なる"と判断されるため)

下記をループ

if lat != gps.latitude[0] or lon != gps.longitude[0]:
    ~新しい位置データの処理~
    lat = gps.latitude[0]
    lon = gps.longitude[0]

あと、元コードの lat == gps.latitude[0] or lon == gps.longitude[0]: は、
or ではなく and が正しのでは?

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/01/09 15:53

    ```Python
    # カーナビ(オンライン)
    # "r_latlon.csv" に保存
    # "r_map.html" で出力
    # 1秒の遅れで11m進む(時速40km)

    import csv, folium, io, micropyGPS, serial, time
    import pandas as pd
    import webbrowser
    from selenium import webdriver

    #(タイムゾーンの時差(日本は9時間), '出力フォーマット(ddは10進=35.6789)')
    gps = micropyGPS.MicropyGPS(9, 'dd')
    driver = webdriver.Chrome("/usr/lib/chromium-browser/chromedriver")
    browser = None

    #---------------------------------------------------------------------------------
    def rungps():
    #timeoutを秒で設定(10秒の間に受信したデータを返す)
    s = serial.Serial('/dev/serial0', 9600, timeout=10)
    #ここでGPSデータ取得するが初回はうまく取得できていない
    s.readline()
    while True:
    sentence = s.readline().decode('utf-8')
    if sentence[0] != '$':
    continue
    for x in sentence:
    gps.update(x)

    if gps.clean_sentences > 20:
    print('%2.8f, %2.8f' % (gps.latitude[0], gps.longitude[0]))
    df = pd.DataFrame([[gps.latitude[0], gps.longitude[0]]])
    df.to_csv('0109.csv', mode='a', header=False, index=False)
    plot_to_map()
    time.sleep(1.0)
    #---------------------------------------------------------------------------------
    def plot_to_map():
    df = pd.read_csv('0109.csv', names=('lat', 'lon'))
    map = folium.Map(location=[df.lat[0], df.lon[0]], zoom_start=18)

    for i, r in df.iterrows():
    folium.Marker(location=[r['lat'], r['lon']], icon=folium.Icon(color='black', icon='circle')).add_to(map)
    map.save("0109.html")

    global browser
    if browser is None: # 初回は開く
    browser = webdriver.Chrome(r'/usr/lib/chromium-browser/chromedriver')
    browser.get('file:///home/pi/Desktop/0109.html')
    else: # 2回目以降は再読込
    browser.refresh()
    time.sleep(1.0)
    #---------------------------------------------------------------------------------

    rungps()
    if browser is not None:
    browser.quit()
    time.sleep(1.0)
    ```

    ご回答ありがとうございます。
    ですがどこにその文を追記、そしてどの文を削除すればよいのでしょうか?
    上に基のプログラム全文を貼ります。

    キャンセル

  • 2019/01/09 16:18

    ええと、このコードはご自分で書かれたのではないのでしょうか?
    処理してるのはココでしょうかね?

    if gps.clean_sentences > 20:
    print('%2.8f, %2.8f' % (gps.latitude[0], gps.longitude[0]))
    df = pd.DataFrame([[gps.latitude[0], gps.longitude[0]]])
    df.to_csv('0109.csv', mode='a', header=False, index=False)
    plot_to_map()
    time.sleep(1.0)

    ここのif文内を私が書いた前と違うなら処理すればいいのではないでしょうか?
    きちんとコードを読み込んではいませんが、
    10秒毎に位置をCSVに保存してる感じでしょうか、
    これ、移動してなければ保存しないですと、時間がわからなくなりますので、
    タイムスタンプも書き出すようにしないとですね~。

    キャンセル

+1

空のブロックを表したい場合はpass文を用います。また、ループ内の残り処理を飛ばして次のループに行きたい場合はcontinueの方が適しているかもしれません。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.61%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る