AGV系统控制位置管理功能

2023-11-11 18:04

本文主要是介绍AGV系统控制位置管理功能,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

# ファイル: agv_locattion.py
# 説明: AGV (Automated Guided Vehicle) の位置情報を管理し、UDPサーバーとして動作するGUIアプリケーションです。

# 必要なライブラリをインポート
import tkinter as tk
import socket
import threading

def AGV_handle_submit(canvas, start_photo, x_entry, y_entry, submit_button):
    """UDPサーバーアプリケーションのGUIを作成します。

    Args:
        canvas:tk.Canvas,
        start_photo (ImageTk.PhotoImage):
        x_entry (tk.Entry):
        y_entry (tk.Entry):
        submit_button (tk.Button): 
    """
    
    
    # 以下の関数内で使う変数を初期化
    HOST = '127.0.0.1'  # ホストIPアドレス
    PORT = 8080  # ポート番号
    server_socket = None  # グローバル変数としてサーバーソケットを定義

    def start_server():
        """UDPサーバーの待機とメッセージの受信を行います。"""
        nonlocal server_socket  # ローカル変数ではなく外側の変数を参照するためのnonlocal宣言

        # ソケットを作成し、ホストとポートにバインド
        server_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
        server_socket.bind((HOST, PORT))

        update_message_label("サーバーを開始しました。")

        while True:
            # データを受信する
            try:
                data, client_address = server_socket.recvfrom(1024)
            except OSError as e:
                print("ソケットの受信エラー:", e)
                break
            data = data.decode()
            update_message_label(f"クライアントからのメッセージ: {data}")

            # ドロップダウンメニューにデータを追加
            add_data_to_drop_menu(data)

            # クライアントにメッセージを送信する
            message = "サーバーからのメッセージ: データが送信できました!"
            server_socket.sendto(message.encode(), client_address)

    def start_server_thread():
        """サーバースレッドを開始します。"""
        threading.Thread(target=start_server).start()

    def close_connection():
        """サーバーソケットを閉じます。"""
        nonlocal server_socket
        if server_socket:
            server_socket.close()
            update_message_label("接続を閉じました。")
            server_socket = None  # サーバーソケットをリセット
            
    def end_window():
        nonlocal server_socket
        if server_socket:
            server_socket.close()
            update_message_label("接続を閉じました。")
            server_socket = None  # サーバーソケットをリセット
        window.destroy()
        
    def add_data_to_drop_menu(data):
        """ドロップダウンメニューにデータを追加します。

        Args:
            data (str): ドロップダウンメニューに追加するデータ
        """
        
        """""""""""""""""""""""""""""""""""""""""""""""
        ここに受信したマイクからのデータを処理して座標を割り出す位置推定プログラム関数を記述し、そのデータをdataに格納する。
        するとドロップボックスに値が追加される。なおdataは[座標,座標]形式の文字列で。
        関数例:
        data = position_estimation(data)
        """""""""""""""""""""""""""""""""""""""""""""""
        drop_menu['menu'].add_command(label=data, command=lambda value=data: selected_data.set(value))
        
    def on_decision_button_click():
        """決定ボタンがクリックされたときの処理を行います。"""
        data = selected_data.get()
        # この例では、選択された項目をラベルに表示するだけ
        data_list = data.split(',')
        num1 = int(data_list[0])
        num2 = int(data_list[1])
        
        # 選択された値に応じて任意の処理を追加することができます
        # x_entryの内容を削除
        x_entry.delete(0, tk.END)

        # y_entryの内容を削除
        y_entry.delete(0, tk.END)
        
        #選択した座標を入力欄に入れる
        x_entry.insert(0, num1)  # ここでx座標の初期値を設定
        y_entry.insert(0, num2)  # ここでy座標の初期値を設定
        
        # ボタンをプログラムからクリック
        submit_button.invoke()
        
    def on_selection_change(*args):
        """ドロップダウンメニューの選択が変更されたときの処理を行います。"""
        selected_value = selected_data.get()
        # 選択された項目の処理を行う
        data = selected_value  # 例として与えられたデータ

        # カンマでデータを分割してint型に変換
        data_list = data.split(',')
        num1 = int(data_list[0])
        num2 = int(data_list[1])
        
        # キャンバス上の選択用オブジェクトを更新
        canvas.delete("select")
        if start_photo:
            canvas.create_image(num1, num2, anchor=tk.CENTER, image=start_photo, tag="select")
            
        # この例では、選択したデータをラベルに表示するだけ
        update_message_label(f"選択したデータ: {selected_value}")
    

    # ウィンドウを作成
    window = tk.Tk()
    window.title("UDPサーバー")

    # 接続待機ボタンを作成
    start_button = tk.Button(window, text="接続待機", command=start_server_thread)
    start_button.pack(pady=10)

    # 接続を閉じるボタンを作成
    close_button = tk.Button(window, text="接続を閉じる", command=close_connection)
    close_button.pack(pady=5)

    # ラベルを作成してウィンドウに配置
    message_label = tk.Label(window, text="サーバーが待機中です。", font=("Helvetica", 12))
    message_label.pack(pady=10)

    def update_message_label(new_message):
        """メッセージ表示ラベルを更新する関数"""
        message_label.config(text=new_message)

    # ドロップダウンメニューに表示される選択肢リストを管理する変数
    selected_data = tk.StringVar(window)
    selected_data.set("選択したデータ")
    
    # 選択されたタイミングで動作する関数を登録
    selected_data.trace("w", on_selection_change)

    # ドロップダウンメニューを作成
    drop_menu = tk.OptionMenu(window, selected_data, "選択したデータ")
    drop_menu.pack(pady=5)
    
    # 決定ボタンを作成
    decision_button = tk.Button(window, text="決定", command=on_decision_button_click)
    decision_button.pack(pady=5)
    
    # protocolメソッドを追加してウィンドウが閉じられた際にclose_connection関数を呼び出す
    window.protocol("WM_DELETE_WINDOW", end_window)

    # ウィンドウを表示してイベントループを開始
    window.mainloop()

这篇关于AGV系统控制位置管理功能的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/391899

相关文章

Java使用Thumbnailator库实现图片处理与压缩功能

《Java使用Thumbnailator库实现图片处理与压缩功能》Thumbnailator是高性能Java图像处理库,支持缩放、旋转、水印添加、裁剪及格式转换,提供易用API和性能优化,适合Web应... 目录1. 图片处理库Thumbnailator介绍2. 基本和指定大小图片缩放功能2.1 图片缩放的

深度解析Spring Security 中的 SecurityFilterChain核心功能

《深度解析SpringSecurity中的SecurityFilterChain核心功能》SecurityFilterChain通过组件化配置、类型安全路径匹配、多链协同三大特性,重构了Spri... 目录Spring Security 中的SecurityFilterChain深度解析一、Security

在macOS上安装jenv管理JDK版本的详细步骤

《在macOS上安装jenv管理JDK版本的详细步骤》jEnv是一个命令行工具,正如它的官网所宣称的那样,它是来让你忘记怎么配置JAVA_HOME环境变量的神队友,:本文主要介绍在macOS上安装... 目录前言安装 jenv添加 JDK 版本到 jenv切换 JDK 版本总结前言China编程在开发 Java

Spring Boot Actuator应用监控与管理的详细步骤

《SpringBootActuator应用监控与管理的详细步骤》SpringBootActuator是SpringBoot的监控工具,提供健康检查、性能指标、日志管理等核心功能,支持自定义和扩展端... 目录一、 Spring Boot Actuator 概述二、 集成 Spring Boot Actuat

MySQL多实例管理如何在一台主机上运行多个mysql

《MySQL多实例管理如何在一台主机上运行多个mysql》文章详解了在Linux主机上通过二进制方式安装MySQL多实例的步骤,涵盖端口配置、数据目录准备、初始化与启动流程,以及排错方法,适用于构建读... 目录一、什么是mysql多实例二、二进制方式安装MySQL1.获取二进制代码包2.安装基础依赖3.清

Java实现预览与打印功能详解

《Java实现预览与打印功能详解》在Java中,打印功能主要依赖java.awt.print包,该包提供了与打印相关的一些关键类,比如PrinterJob和PageFormat,它们构成... 目录Java 打印系统概述打印预览与设置使用 PageFormat 和 PrinterJob 类设置页面格式与纸张

MySQL 8 中的一个强大功能 JSON_TABLE示例详解

《MySQL8中的一个强大功能JSON_TABLE示例详解》JSON_TABLE是MySQL8中引入的一个强大功能,它允许用户将JSON数据转换为关系表格式,从而可以更方便地在SQL查询中处理J... 目录基本语法示例示例查询解释应用场景不适用场景1. ‌jsON 数据结构过于复杂或动态变化‌2. ‌性能要

Spring Boot集成Druid实现数据源管理与监控的详细步骤

《SpringBoot集成Druid实现数据源管理与监控的详细步骤》本文介绍如何在SpringBoot项目中集成Druid数据库连接池,包括环境搭建、Maven依赖配置、SpringBoot配置文件... 目录1. 引言1.1 环境准备1.2 Druid介绍2. 配置Druid连接池3. 查看Druid监控

Qt使用QSqlDatabase连接MySQL实现增删改查功能

《Qt使用QSqlDatabase连接MySQL实现增删改查功能》这篇文章主要为大家详细介绍了Qt如何使用QSqlDatabase连接MySQL实现增删改查功能,文中的示例代码讲解详细,感兴趣的小伙伴... 目录一、创建数据表二、连接mysql数据库三、封装成一个完整的轻量级 ORM 风格类3.1 表结构

Knife4j+Axios+Redis前后端分离架构下的 API 管理与会话方案(最新推荐)

《Knife4j+Axios+Redis前后端分离架构下的API管理与会话方案(最新推荐)》本文主要介绍了Swagger与Knife4j的配置要点、前后端对接方法以及分布式Session实现原理,... 目录一、Swagger 与 Knife4j 的深度理解及配置要点Knife4j 配置关键要点1.Spri