Визуализация траекторий движения инструмента при обработке ЧПУ с помощью динамической точечной 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-анимацию точечной диаграммы в Python, используя Plotly для визуализации сложных наборов данных в data science. Мы начали с загрузки данных в фрейм данных pandas и создания 3D-диаграммы данных с помощью функции Plotly go.Scatter3d(). Затем мы определили функцию анимации для обновления точечной диаграммы для каждого кадра и использовали go.Frame() для создания анимационных кадров. Наконец, мы добавили кнопки воспроизведения, паузы и перезапуска, используя параметр обновления меню Plotly.
Мы продемонстрировали, что 3D-анимация точечных диаграмм может быть мощным инструментом для получения информации о сложных процессах обработки с ЧПУ. Визуализируя фактическое положение обработанных деталей на разных этапах процесса, мы смогли выявить проблемы с новыми данными и показать, что проблемы были в самом процессе, а не в модели. Наше тематическое исследование подчёркивает важность визуализации данных как инструмента для получения информации о сложных процессах и устранения неполадок в моделях машинного обучения. Представленная здесь методика может быть применена в других областях, где необходима визуализация данных, например: медицинские исследования, моделирование климата или финансовое прогнозирование. Я надеюсь, что эта статья послужит полезным руководством для тех, кто заинтересован в изучении потенциала 3D-анимации точечных изображений, и побудит их применить её в своих собственных исследованиях и попытках решения проблем.
Источники
https://www.kaggle.com/datasets/shasun/tool-wear-detection-in-cnc-mill