{"id":22558899,"url":"https://github.com/felixdivo/hackathon-2024","last_synced_at":"2025-08-04T14:31:51.628Z","repository":{"id":266837122,"uuid":"895993756","full_name":"felixdivo/Hackathon-2024","owner":"felixdivo","description":"ARKU + ProKI + KompAKI","archived":false,"fork":false,"pushed_at":"2024-12-06T12:04:14.000Z","size":490,"stargazers_count":2,"open_issues_count":0,"forks_count":1,"subscribers_count":1,"default_branch":"main","last_synced_at":"2024-12-06T13:38:47.021Z","etag":null,"topics":["hackathon","manufacturing","vision"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":false,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/felixdivo.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2024-11-29T10:33:16.000Z","updated_at":"2024-12-06T12:45:22.000Z","dependencies_parsed_at":"2024-12-06T13:38:50.168Z","dependency_job_id":"ef340e11-0242-4d4b-b86d-1fb39a70dc84","html_url":"https://github.com/felixdivo/Hackathon-2024","commit_stats":null,"previous_names":["felixdivo/hackathon-2024"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/felixdivo%2FHackathon-2024","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/felixdivo%2FHackathon-2024/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/felixdivo%2FHackathon-2024/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/felixdivo%2FHackathon-2024/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/felixdivo","download_url":"https://codeload.github.com/felixdivo/Hackathon-2024/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":228652526,"owners_count":17952007,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["hackathon","manufacturing","vision"],"created_at":"2024-12-07T20:18:06.147Z","updated_at":"2025-08-04T14:31:51.612Z","avatar_url":"https://github.com/felixdivo.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Hackathon 2024\n\nWelcome, and thank you for participating! This repository contains a skeleton for your submission to the Hackathon 2024.\n\n## The Challenge\n\nThe challenge was presented during the kick-off meeting.\nIn short, the task is to find a good position and rotation for a robotic arm to grab a piece of cut sheet metal.\n\n\u003cimg src=\"data/dummy/part_1/part_1.png\" alt=\"An example input image\" width=\"200px\" /\u003e \n\u003cimg src=\"data/dummy/part_1/visualisation_1.png\" alt=\"An example solution\" width=\"200px\" /\u003e\n\n### Where is my data?\n\nFirst off: The data is NOT to be made public. In particular, do not publicly upload the data to GitHub.\n\nYou should have received a link to a shared folder with the data in the kick-off.\nPlease add the data from the BWSync into `data/raw/` and `data/evaluate/`.\n\nFor example, `data/raw/part_1` now contains `part_1.png` for the part file and `gripper_2.png` for the gripper mask.\nEach parts folder may contain several parts and gripper files, so you need to be able to compute matches for all of them.\nAdditionally, `evaluate/` also contains solutions for the evaluation.\n\nWe will run the final evaluation on a *different* dataset of a similar format, so make sure your solution is general enough to work on unseen data.\nWe might assess the effctivenss of your method on more challanging data if that helps to more clearly determine winners.\n\n### Conventions in the data\n\nA pixel in the mask and gripper files corresponds to 1mm in the real world. The gripper pngs are also scaled accordingly.\n\nThe coordinates in an image are given in the following way:\n\n\u003cimg src=\"doc/coordinate-system.png\" alt=\"Visual explanation of the coordinate systems\" width=\"400px\" /\u003e\n\nHere, `x` ranges from `0` to `width`, and `y` ranges from `0` to `height`. The coordinates reference the borders between the pixels (edge/corner-based coordinates), so `(x, y) = (1, 0)` would be between the first and second pixels in the first row.\n\nThe angle `α` is given in degrees and ranges from `0` (inclusive) to `360` (exclusive). It is measured clockwise, with `0°` pointing to the right.\n\nThe positioning of the gripper shall always be given as its center point (and rotation around that point). So `(x, y, α) = (width/2, 0, 90)` would position the gripper in the center of the top edge of the image, pointing downwards.\n\n\u003cimg src=\"doc/gripper_definitions.png\" alt=\"The gripper coordinate definitions\" width=\"400px\" /\u003e \n\n## Your solution and the evaluation\n\nYou can either:\n1. Use Python 3.12+ and the provided code skeleton to implement your solution. To get started, place your dependencies in `requirements.txt` and start coding in `solution/`. Your dependencies should be easy to install via pip. If that is not the case, see option 2.\n2. Use your own tools and languages. In this case, provide us with a detailed description of how to run your code AND a `Dockerfile` where everything can run out of the box.\n\n### The interface to your Code\n\nTo check if your code is working and to permit final grading, please make sure you provide the following:\nYour solution must be a program with two strings as the calling arguments.\nFirstly, it receives a CSV file containing the part and gripper image file names.\nWe might split the evaluation into multiple such calls to your program.\nAll paths are relative to the current working directory.\nThe input file will look like this:\n\n```csv\npart,gripper\npart_1.png,gripper_5.png\npart_42.png,gripper_1.png\n```\n\nSecondly, it receives an argument with a path to a folder where the results should be saved.\nThe output must look like this:\n\n```csv\npart,gripper,x,y,angle\npart_1.png,gripper_5.png,100,200,45\npart_42.png,gripper_1.png,300,400,90\n```\n\nYou are more than welcome to add visualization images as well.\nThey might help you and us to understand your solution better.\nYou can simply return them as an additional `visualization` column in the CSV file.\n\nIn summary, your program needs to handle (for instance, with Python) `python solution/main.py path/to/input/tasks.csv output/solutions.csv`.\nit should exit with a status code of `0` if everything went well and `1` in any other case.\nHint: In Python, the return code is always `0` anyway unless you explicitly call `sys.exit(1)` or an exception is raised.\n\n### Runtime requirements\n\nYour code needs to be able to run on a modern consumer desktop.\nIt may use a single GPU you'd typically find in such a machine (i.e., no high-end server GPUs).\nThe code may run for up to 3 seconds per part-gripper pair.\nIf it takes noticeably longer, we will deduct points from your score.\n\n### Evaluation of your Code\n\nTo see if your program is running correctly, we provide a simple evaluation script.\nIt should work as long as your output follows the format described above.\nYou can run it by the following command:\n\n```bash\npython evaluate/eval.py\n```\n\nIf you build something custom, you can also run it like this:\n\n```bash\npython evaluate/eval.py 'python solution/your/super/fancy/tool.py'\n# Or\npython evaluate/eval.py 'super_fast_assembly_solution'\n```\n\n**NOTE: This is currently a placeholder evaluation script. We will provide a complete evaluation on the actual data soon. It will also account for possibly ambigous solutions.**\n\n### Evaluation Metrics\n\n\u003cimg src=\"doc/proki-evaluation-definition.png\" alt=\"The evaluation metric\" width=\"600px\" /\u003e \n\nFirst and foremost: Please document which design decisions you took in solving the problem! The quality of your documentation and your design decisions will be the tie breaker between solutions with similar quality.\n\nThe quantitative evaluation will be as follows:\nWe will use an evaluation set of data, with similar but new parts to assess your solution.\n\n- There must be no intersection between the gripper points and the edges or holes of the part. This is a hard constraint and will lead to 0 points if unfullfilled.\n- Minimize the distance between the center of the gripper and the center of the part (approximated as the center of the image). Closer is better.\n\nThe following equation represents the optimization goal:\n\n$$\\text{Minimize: } \\sqrt{(x_{gripper} - x_{part})^2 + (y_{gripper} - y_{part})^2}$$  \n\nSubject to the constraint:  \n$$\\text{Intersection}(\\text{Gripper Area}, \\text{Part Edges or Holes}) = 0$$\n\nWhere:\n- $\\((x_{gripper}, y_{gripper})\\)$ are the coordinates of the gripper center.\n- $\\((x_{part}, y_{part})\\)$ are the coordinates of the part center.\n- The intersection condition ensures that no part of the gripper overlaps with the edges or holes of the part. This is calculated using a part mask and geometric intersection checks. It is also why we need the angle in your results.\n\n### Submission of Your Solution\n\nPlease submit your final solution by providing a link to a repository.\nIt may be a git repository on GitHub/GitLab/... or provide a ZIP file containing your code.\n\nYou can send us the URL by writing a message in your team channel on Discord.\nMake sure to ping us by including `@Veranstalter`.\n\n**Important:** Make sure your README.md follows this template:\n\n```markdown\n# Hackathon 2024 - Submission of Group *// Group Name //*\n\nTeam members:\n    - // Alice Lastname //\n    - // Bob Secondname //\n    - ...\n\n## Description\n// A very brief description of your solution, e.g., five sentences //\n\n## How to Run\n// How to run your code, e.g., `python solution/main.py path/to/input/tasks.csv output/solutions.csv` //\n\n## ... and other things you want to tell us\n// optional, e.g., design decisions, challenges you faced, etc. //\n```\n\nReplace all `// ... //` placeholders with your information.\n\nIn particular, ensure that the `How to Run` section is up to date with the current state of your code.\nHere are a few hints on that:\n- You should not change any files under `evaluate/` in your submission.\n- If your `solution/main.py` is not the entry point, please adjust the path accordingly, e.g., to `solution_other/fancy_main.py`. Then, you should still be able to run `python evaluate/eval.py --command 'python solution_other/fancy_main.py'`.\n- You can verify that all dependencies are easily installable and everything runs fine by running these Docker commands: `docker build . -t my-group` and `docker run -t my-group python evaluate/eval.py --command 'python solution_other/fancy_main.py'`. This will ensure that we can run your code without any issues.\n- When you use a custom Dockerfile, please provide `docker build` and `docker run` commands that we can use to execute your solution.\n\nGenerally, document your code and make it easy for others to understand.\n\nSee below for information on the license you should use.\n\n## License\n\nAll resources in this repository are licensed under the MIT License. See the [LICENSE](LICENSE) for more information.\nThis explicitly excludes the data you received for the challenge. You may not share the data with others or use it for other purposes than the Hackathon 2024.\n\nWe expect you to also license your code under the MIT License when submitting it.\n\n## Acknowledgments\n\n\u003cimg src=\"doc/logos-all.png\" alt=\"Logos\" width=\"600px\" /\u003e\n\nThis project is partially funded by the German Federal Ministry of Education and Research (BMBF) within the “The Future of Value Creation – Research on Production, Services and Work” program (funding number 02L19C150) managed by the Project Management Agency Karlsruhe (PTKA).\nThe authors are responsible for the content of this publication.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffelixdivo%2Fhackathon-2024","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ffelixdivo%2Fhackathon-2024","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffelixdivo%2Fhackathon-2024/lists"}