首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用python-can的实时波形

用python-can的实时波形
EN

Stack Overflow用户
提问于 2020-07-31 11:19:04
回答 1查看 134关注 0票数 0

我试图用python和matplotlib库来绘制can-数据。我有一个关于如何用matplotlib绘制实时数据的基本示例:

代码语言:javascript
复制
import numpy as np
import matplotlib.pyplot as plt

plt.axis([0, 10, 0, 1])


for i in range(10):
    y = np.random.random()
    plt.scatter(i, y)
    # plt.pause(0.05)
    plt.draw()

plt.show()

我使用了一个基本的python-can示例并添加了matplotlib:

代码语言:javascript
复制
import sys
import argparse
import socket
from datetime import datetime

import can
from can import Bus, BusState, Logger
import numpy as np
import matplotlib.pyplot as plt



def main():

    plt.axis([0, 10, 0, 1])

    bus = Bus(bustype ='pcan')
    i = 0

    print(f"Connected to {bus.__class__.__name__}: {bus.channel_info}")
    print(f"Can Logger (Started on {datetime.now()})")

    plt.show()

    try:
        while True:
            msg = bus.recv(1)
            if msg is not None:
                y = np.random.random()
                plt.scatter(i, y)
                plt.draw()
                i += 1
                print('Message id {id}'.format(id=msg.arbitration_id))

    except KeyboardInterrupt:
        pass
    finally:
        plt.show()
        bus.shutdown()


if __name__ == "__main__":
    main()

但是,一旦我添加plt命令,脚本就停止工作,它就不再输出print语句了。当我调试到它并手动执行时,它就工作了。我做错什么了吗?有更好的办法解决这个问题吗?我不打算使用matplotlib,这是绘制某些内容的最快方法:)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-08-03 08:53:45

我找到了一个使用blit函数的工作解决方案,它还不完美,但它是一个很好的起点:

代码语言:javascript
复制
from datetime import datetime
import can
from can import Bus, BusState, Logger
import numpy as np
import matplotlib.pyplot as plt
import struct



def main():
    bus = Bus(bustype ='pcan')
    i = 0

    print(f"Connected to {bus.__class__.__name__}: {bus.channel_info}")
    print(f"Can Logger (Started on {datetime.now()})")

    x = np.linspace(0, 1000, num=1000)
    y = np.zeros(1000)

    fig = plt.figure()
    ax1 = fig.add_subplot(1, 1, 1)
    line, = ax1.plot([], lw=3)
    text = ax1.text(0.8, 0.5, "")

    ax1.set_xlim(x.min(), x.max())
    ax1.set_ylim([-10, 10])

    fig.canvas.draw()  # note that the first draw comes before setting data

    ax2background = fig.canvas.copy_from_bbox(ax1.bbox)

    plt.show(block=False)
    k = 0


    try:
        while True:
            msg = bus.recv(1)
            if msg is not None:
                y = np.roll(y, 1)
                value = struct.unpack('f', msg.data)
                y[0] = np.int8(value)
                line.set_data(x, y)
                fig.canvas.restore_region(ax2background)
                ax1.draw_artist(line)
                ax1.draw_artist(text)
                fig.canvas.blit(ax1.bbox)
                fig.canvas.flush_events()
                # print('Message data {data}, value {value}, counter {counter}'.format(data=msg.data, value=value, counter=k))
                k += 1
                if k > 100:
                    k = 0

    except KeyboardInterrupt:
        pass
    finally:
        plt.show()
        bus.shutdown()


if __name__ == "__main__":
    main()

该脚本假设can消息在前四个uint8上携带一个浮点数,并只绘制它。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63190891

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档