{"id":22497234,"url":"https://github.com/armgits/windrunner","last_synced_at":"2026-05-02T09:32:25.742Z","repository":{"id":177130805,"uuid":"659339933","full_name":"armgits/windrunner","owner":"armgits","description":"Repository for the Windrunner project.","archived":false,"fork":false,"pushed_at":"2023-07-05T22:56:13.000Z","size":3362,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-02-01T23:45:45.490Z","etag":null,"topics":["car","gazebo","ros","simulation","solidworks","stem"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/armgits.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"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":"2023-06-27T16:07:43.000Z","updated_at":"2023-07-07T05:58:36.000Z","dependencies_parsed_at":null,"dependency_job_id":"ebd577ea-f824-42e7-8b9e-5005f8a401f4","html_url":"https://github.com/armgits/windrunner","commit_stats":null,"previous_names":["armgits/windrunner"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/armgits%2Fwindrunner","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/armgits%2Fwindrunner/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/armgits%2Fwindrunner/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/armgits%2Fwindrunner/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/armgits","download_url":"https://codeload.github.com/armgits/windrunner/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":245925952,"owners_count":20694986,"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":["car","gazebo","ros","simulation","solidworks","stem"],"created_at":"2024-12-06T20:17:41.571Z","updated_at":"2026-05-02T09:32:25.703Z","avatar_url":"https://github.com/armgits.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Windrunner\nWindrunner is a model car with Ackermann steering. This was an exercise on bringing CAD models into a physics simulator like Gazebo and further integrating ROS controllers to operate the vehicle. This was my first project for the [ENPM662 (Introduction to Robot Modeling)](https://app.testudo.umd.edu/soc/search?courseId=ENPM662\u0026sectionId=\u0026termId=202308\u0026_openSectionsOnly=on\u0026creditCompare=\u0026credits=\u0026courseLevelFilter=ALL\u0026instructor=\u0026_facetoface=on\u0026_blended=on\u0026_online=on\u0026courseStartCompare=\u0026courseStartHour=\u0026courseStartMin=\u0026courseStartAM=\u0026courseEndHour=\u0026courseEndMin=\u0026courseEndAM=\u0026teachingCenter=ALL\u0026_classDay1=on\u0026_classDay2=on\u0026_classDay3=on\u0026_classDay4=on\u0026_classDay5=on) course in the Fall 2022 semester.\n\n\u003cp align=\"center\"\u003e\u003cimg src=\"./image/windrunner.gif\"\u003e\u003c/p\u003e\n\nThe above image is run at 2 times the actual simulation speed for demonstration purpose.\n\n## Description of contents\n`cad/` consists of the Solidworks part and assembly files of the robot and tool plus Blender files of the same to export in DAE file format for the meshes.\n\n`dockerfile/` consists of the necessary files to build the Docker image of this project. The image can then be used to run the container as an executable for simulating in Gazebo. Building the Docker image locally is not recommended, an up-to-date image is available on [Docker Hub](https://hub.docker.com/r/armdocks/windrunner).\n\n`image/` just consists of the GIF image used on the README page.\n\n`windrunner/` is the ROS package for the Windrunner model car.\n\n## Running the project\nThis project can only run on Linux at the moment in two ways:\n### In Docker container (Recommended)\nThis is the easiest, most convenient way to run the project demo as an executable. Docker (Linux) installation is required, to install refer the [documentation](https://docs.docker.com/engine/install/).\n\nPull the Docker image of this project from Docker Hub.\n```\ndocker pull armdocks/windrunner\n```\n\nRun the container for running the Gazebo simulation.\n```\ndocker run -it -e DISPLAY=$DISPLAY -v /tmp/.X11-unix:/tmp/.X11-unix armdocks/windrunner\n```\n\u003e**Tip:** The -it argument can be omitted from the above command for a less verbose, clean terminal output.\n\n\u003e**Note:** The simulation might lag when the Gazebo window opens maximized, shrink the window to improve frame rate.\n\n### On local machine\nThis requires Ubuntu Focal (20.04) with ROS Noetic full desktop installation. Additional ROS packages that might be required are [joint state](http://wiki.ros.org/joint_state_controller) and [effort](http://wiki.ros.org/effort_controllers) controller packages and the [PyYAML](https://pypi.org/project/PyYAML/) Python package.\n\nThese additional packages can be installed by:\n\nJoint state controllers package\n```\napt install ros-noetic-joint-state-controller\n```\nEffort controllers package\n```\napt install ros-noetic-effort-controllers\n```\nPyYAML package\n```\npip3 install pyyaml\n```\nAssuming you have the catkin workspace setup, \n\nClone the repository to `src/` folder of the target catkin workpace. Assuming this would be `~/catkin_ws/src/`,\n```\ngit clone https://github.com/armgits/windrunner.git ~/catkin_ws/src/windrunner_project\n```\nMake the Python files `start.py` and `move.py` in the `src/` folder of windrunner package executable.\n```\nsudo chmod +x ~/catkin_ws/src/windrunner_project/windrunner/src/windrunner_publisher.py\nsudo chmod +x ~/catkin_ws/src/windrunner_project/windrunner/src/windrunner_teleop.py\n```\nNow you can build and source the packages.\n\nAfter a successful build, run the simulation in Gazebo. \n\nThis can be done in a single line using the shell script `windrunner_circle.sh` or `windrunner_teleop.sh` from `dockerfile/` folder.\n\n#### Demo for moving in a circular path (As seen in GIF)\n```\n~/catkin_ws/src/windrunner_project/dockerfile/windrunner_circle.sh\n```\n#### Teleoperation using keyboard input\n```\n~/catkin_ws/src/windrunner_project/dockerfile/windrunner_teleop.sh\n```\nOr manually,\n\nIn first terminal initialize the ROS master.\n```\nroscore\n```\n#### Demo for moving in a circular path\nIn a new, second terminal spawn the robot in Gazebo.\n```\nroslaunch windrunner windrunner_empty_world.launch\n```\nIn a new, third terminal run the node to perform the task.\n```\nrosrun windrunner windrunner_publisher.py\n```\n#### For teleoperation using keyboard input\nIn a new, second terminal spawn the robot in Gazebo.\n```\nroslaunch windrunner windrunner.launch\n```\nIn a new, third terminal run the node to perform the task.\n```\nrosrun windrunner windrunner_teleop.py\n```\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Farmgits%2Fwindrunner","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Farmgits%2Fwindrunner","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Farmgits%2Fwindrunner/lists"}