Визуализация траекторий движения инструмента при обработке ЧПУ с помощью динамической точечной 3D-диаграммы

Визуализация траекторий движения инструмента при обработке ЧПУ с помощью динамической точечной 3D-диаграммы

Введение

Процессы обработки с ЧПУ (Числовое программное управление) становятся всё более сложными, требуя передовых методов визуализации данных для получения представления об их производительности. В этой статье я представлю тематическое исследование серии экспериментов по механической обработке, которые проводились на восковых блоках размером 2 “x 2″ x 1,5” на фрезерном станке с ЧПУ на испытательном стенде System-level Manufacturing and Automation Research Testband (SMART) Мичиганского университета. Данные об обработке были собраны со станка с ЧПУ для учёта изменений состояния инструмента, скорости подачи и давления зажима. В каждом эксперименте получалась готовая восковая деталь в форме буквы “S”,вырезанная на верхней грани.

Первоначально на основе собранных данных временных рядов была построена модель классификатора машинного обучения с высокой точностью, чтобы предсказать, произойдёт ли износ инструмента в ходе экспериментов. Однако, когда модель была протестирована на новых данных, она показала себя не так хорошо, как ожидалось. Несмотря на действительно хорошие результаты в наборах тестов и валидации, производительность модели на новых данных указывала на проблему с моделью. Чтобы глубже разобраться в проблеме, я создал 3D-анимацию точечной диаграммы, которая визуализирует фактическое положение обработанных деталей на разных этапах процесса.

В этой статье мы исследуем потенциал этого метода визуализации для получения представления о траектории движения режущего инструмента во время обработки. Мы демонстрируем, как визуализация помогла выявить проблемы с новыми данными, показывая, что проблемы были в самом процессе, а не в модели. Наши результаты подчёркивают важность визуализации данных как инструмента для получения информации о сложных процессах и устранения неполадок в моделях машинного обучения.

Набор данных

Прежде чем мы приступим к созданию 3D-анимации точечной диаграммы, давайте подробнее рассмотрим набор данных, который мы будем использовать. Данные, используемые для обучения модели машинного обучения, состоят из 18 датасетов. Я использовал различные комбинации для обучения модели и сохранил несколько из них, чтобы проверить обобщаемость модели. Набор данных содержит информацию о процессе обработки на фрезерном станке C.N.C., включая положения X, Y и Z-систем и тип выполняемого процесса обработки. Вот разбивка объектов в наборе данных, которые мы собираемся использовать для создания визуализации:

  • X1_ActualPosition: фактическое положение оси X производственной системы
  • Y1_ActualPosition: фактическое положение оси Y производственной системы
  • Z1_ActualPosition: фактическое положение оси Z производственной системы
  • Machining_Process: тип выполняемого процесса обработки

Мы будем использовать этот набор данных для создания 3D-анимации точечной диаграммы, которая визуализирует положение инструмента относительно различных этапов процесса.

Прежде чем мы сможем создать анимацию, нам нужно предварительно обработать данные. В этом случае нам нужно только загрузить данные из CSV-файла и выбрать соответствующие столбцы (‘X1_ActualPosition’, ‘Y1_ActualPosition’, ‘Z1_ActualPosition’, ‘Machining_Process’), используя параметр usecols в функции pd.read_csv(). Вот код для загрузки набора данных:

data = pd.read_csv(dataset_file, usecols=['X1_ActualPosition', 
'Y1_ActualPosition', 'Z1_ActualPosition', 'Machining_Process'])

data.head()

Создание 3D-анимации точечной диаграммы

Теперь, когда мы предварительно обработали данные, мы можем создать 3D-анимацию точечной диаграммы. Мы будем использовать библиотеку plotly для создания анимации, в частности функцию go.Scatter3d() для создания точечной диаграммы и атрибутов go.Frame() и fig.frames для создания анимационных кадров.

Сначала давайте создадим статическую точечную 3D-диаграмму. Мы можем использовать цикл for для перебора уникальных процессов обработки в наборе данных и создания точечной диаграммы для каждого из них. Вот код:

fig = go.Figure()
unique_processes = data['Machining_Process'].unique()
for process in unique_processes:
    process_data = data[data['Machining_Process'] == process]
    fig.add_trace(go.Scatter3d(x=process_data['X1_ActualPosition'], 
                               y=process_data['Y1_ActualPosition'], 
                               z=process_data['Z1_ActualPosition'], 
                               mode='markers', 
                               name=process,
                               marker=dict(size=3)))
fig.update_layout(scene=dict(xaxis_title='X', yaxis_title='Y', zaxis_title='Z'))

Этот код создаёт трёхмерную точечную диаграмму, каждая точка которой окрашена в зависимости от типа выполняемого процесса обработки. Позиции x, y и z берутся из столбцов X1_ActualPosition, Y1_ActualPosition и Z1_ActualPosition в наборе данных. Мы устанавливаем параметру marker значение dict(size=3), что делает точки меньше, чтобы их было легче видеть.

Далее давайте создадим анимационные кадры. Мы можем использовать понимание по словарю для создания словаря индексов для каждого процесса обработки в наборе данных. Вот код:

process_indices = {process: np.where(data['Machining_Process'] == process)[0] for process in unique_processes}

Этот код создаёт словарь, где ключами являются уникальные процессы обработки в наборе данных, а значениями – массивы индексов, в которых этот процесс обработки происходит.

Далее мы можем создать список объектов go.Scatter3d(), где каждый объект содержит данные для одной точки анимации. Вот код:

x = data['X1_ActualPosition']
y = data['Y1_ActualPosition']
z = data['Z1_ActualPosition']
scatter_objs = [go.Scatter3d(x=x[process_indices[process][:1]], 
                             y=y[process_indices[process][:1]], 
                             z=z[process_indices[process][:1]], 
                             mode='markers',
                             marker=dict(size=3),
                             name=process) for process in unique_processes]

Этот код создаёт список объектов go.Scatter3d(), где каждый объект содержит данные о положении x, y и z для первой точки в каждом процессе обработки. Мы устанавливаем параметру mode значение 'markers', чтобы сделать точки видимыми, а параметру marker – значение dict(size=3), чтобы сделать точки маленькими.

Наконец, мы можем создавать анимационные кадры, используя функцию go.Frame(). Вот код:

fig.frames = [go.Frame(data=[scatter_objs[i].update(x=x[process_indices[unique_processes[i]][:frame]],
                                                    y=y[process_indices[unique_processes[i]][:frame]],
                                                    z=z[process_indices[unique_processes[i]][:frame]])
                             for i in range(len(unique_processes))]) for frame in range(1, len(x)) if frame % 2 == 0]

В приведённом выше коде мы перебираем unique_processes и создаём update() для каждого из них. Затем мы завершаем эти обновления с помощью go.Frame(), который добавляется в список fig.frames. Условие if frame % 2 == 0 используется для обновления только кадров с чётными индексами, что уменьшает размер анимации и делает её более плавной.

После того, как мы создали кадры, нам нужно определить элементы управления анимацией. Это делается с помощью параметра updatemenus на fig.update_layout(). Вот код:

fig.update_layout(
    updatemenus=[
        dict(
            type='buttons',
            showactive=False,
            buttons=[
                dict(
                    label='Play',
                    method='animate',
                    args=[
                        None,
                        dict(
                            frame=dict(duration=50, redraw=True),
                            fromcurrent=True,
                            mode='immediate'
                        )
                    ]
                ),
                dict(
                    label='Pause',
                    method='animate',
                    args=[
                        [None],
                        dict(
                            frame=dict(duration=0, redraw=True),
                            mode='immediate'
                        ),
                        dict(
                            mode='immediate',
                            frame=dict(duration=0, redraw=True)
                        )
                    ]
                ),
                dict(
                    label='Restart',
                    method='animate',
                    args=[
                        None,
                        dict(
                            frame=dict(duration=50, redraw=True),
                            fromcurrent=False,
                            transition=dict(duration=0),
                            mode='immediate'
                        )
                    ]
                )
            ]
        )
    ]
)

В приведённом выше коде мы определяем набор кнопок, которые управляют анимацией. Кнопка воспроизведения запускает анимацию, кнопка паузы останавливает её, а кнопка перезапуска возвращает её к началу. Мы используем параметр args, чтобы указать настройки анимации, такие как длительность кадра и то, следует ли перерисовывать сюжет или нет.

Теперь, когда мы определили элементы управления анимацией, мы можем увеличить размер маркеров условных обозначений, чтобы сделать их более заметными. Это делается с помощью функции fig.update_layout():

fig.update_layout(legend=dict(itemsizing='constant', itemwidth=30))

Заключительные строки кода

Последняя строка функции вызывает видео и фактически показывает его:

    fig.show()

А затем вызываем функцию для запуска визуализации в нашем наборе данных:

visualize_3d_scatter_animation('dataset.csv')

Результат

Чтобы дать более полное представление о моих выводах, я включил два скриншота, демонстрирующих результаты моего проекта. Я призываю читателей посмотреть их, чтобы лучше понять результаты моего исследования.

Визуализация траекторий движения инструмента при обработке ЧПУ с помощью динамической точечной 3D-диаграммы

Как видно из этого скриншота, обработка завершена, и по сравнению со скриншотом ниже, траектория движения инструмента намного лучше. Модель может действительно хорошо прогнозировать этот набор данных.

Визуализация траекторий движения инструмента при обработке ЧПУ с помощью динамической точечной 3D-диаграммы

Как видно из этого скриншота, обработка не завершена, и по сравнению с предыдущим изображением, траектория движения инструмента странная, поэтому необходимо провести дальнейший анализ этого набора данных.

Заключение

В этой статье мы рассмотрели, как создать 3D-анимацию точечной диаграммы в Python, используя Plotly для визуализации сложных наборов данных в data science. Мы начали с загрузки данных в фрейм данных pandas и создания 3D-диаграммы данных с помощью функции Plotly go.Scatter3d(). Затем мы определили функцию анимации для обновления точечной диаграммы для каждого кадра и использовали go.Frame() для создания анимационных кадров. Наконец, мы добавили кнопки воспроизведения, паузы и перезапуска, используя параметр обновления меню Plotly.

Мы продемонстрировали, что 3D-анимация точечных диаграмм может быть мощным инструментом для получения информации о сложных процессах обработки с ЧПУ. Визуализируя фактическое положение обработанных деталей на разных этапах процесса, мы смогли выявить проблемы с новыми данными и показать, что проблемы были в самом процессе, а не в модели. Наше тематическое исследование подчёркивает важность визуализации данных как инструмента для получения информации о сложных процессах и устранения неполадок в моделях машинного обучения. Представленная здесь методика может быть применена в других областях, где необходима визуализация данных, например: медицинские исследования, моделирование климата или финансовое прогнозирование. Я надеюсь, что эта статья послужит полезным руководством для тех, кто заинтересован в изучении потенциала 3D-анимации точечных изображений, и побудит их применить её в своих собственных исследованиях и попытках решения проблем.

Источники

McCandless, David. “David McCandless: The Beauty of Data Visualization.” TED. N.p., 1 Aug. 2010. Web. 15 Nov. 2016.

https://plotly.com/python/

https://www.kaggle.com/datasets/shasun/tool-wear-detection-in-cnc-mill

+1
0
+1
0
+1
0
+1
0
+1
0

Ответить

Ваш адрес email не будет опубликован. Обязательные поля помечены *