{"id":35624086,"url":"https://github.com/greenroom-robotics/launch_ext","last_synced_at":"2026-06-07T12:04:24.535Z","repository":{"id":152985993,"uuid":"623827341","full_name":"Greenroom-Robotics/launch_ext","owner":"Greenroom-Robotics","description":"Some extra functionality for launch. Maybe they'll merge some of these. Who knows.","archived":false,"fork":false,"pushed_at":"2026-01-28T08:46:52.000Z","size":123,"stargazers_count":0,"open_issues_count":0,"forks_count":1,"subscribers_count":3,"default_branch":"main","last_synced_at":"2026-01-28T23:52:37.014Z","etag":null,"topics":["launch","ros2"],"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/Greenroom-Robotics.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,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2023-04-05T07:08:18.000Z","updated_at":"2026-01-28T08:21:20.000Z","dependencies_parsed_at":"2023-11-28T04:29:20.119Z","dependency_job_id":"640ad8fa-e3ce-46ad-9b44-70e62f47f2f3","html_url":"https://github.com/Greenroom-Robotics/launch_ext","commit_stats":null,"previous_names":[],"tags_count":61,"template":false,"template_full_name":null,"purl":"pkg:github/Greenroom-Robotics/launch_ext","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Greenroom-Robotics%2Flaunch_ext","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Greenroom-Robotics%2Flaunch_ext/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Greenroom-Robotics%2Flaunch_ext/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Greenroom-Robotics%2Flaunch_ext/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Greenroom-Robotics","download_url":"https://codeload.github.com/Greenroom-Robotics/launch_ext/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Greenroom-Robotics%2Flaunch_ext/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29641928,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-02-20T03:21:14.183Z","status":"ssl_error","status_checked_at":"2026-02-20T03:18:24.455Z","response_time":59,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"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":["launch","ros2"],"created_at":"2026-01-05T07:24:25.070Z","updated_at":"2026-02-20T05:01:22.971Z","avatar_url":"https://github.com/Greenroom-Robotics.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# launch_ext - Launch Extensions\n\nExtended functionality for ROS 2 launch system providing additional actions, substitutions, and conditions.\n\n## Table of Contents\n\n- [Actions](#actions)\n  - [ExecuteProcessExt](#executeprocessext)\n  - [IncludePackageLaunchFile](#includepackagelaunchfile)\n  - [LogRotate](#logrotate)\n  - [MakeDeviceNode](#makedevicenode)\n  - [SetLaunchConfigurationIfNotNone](#setlaunchconfigurationifnotnone)\n  - [WriteFile](#writefile)\n  - [Git Repository Actions](#git-repository-actions)\n  - [Middleware Configuration](#middleware-configuration)\n- [Conditions](#conditions)\n- [Substitutions](#substitutions)\n\n## Actions\n\n### ExecuteProcessExt\n\nEnhanced process execution action with additional features beyond the standard ExecuteProcess.\n\n```python\nExecuteProcessExt(\n    cmd=['my_command', '--arg'],\n    name='my_process',\n    output='both'\n)\n```\n\n**Features:**\n- Extended process management capabilities\n- Enhanced output handling\n- Additional lifecycle management\n\n### IncludePackageLaunchFile\n\nInclude launch files from packages with enhanced functionality.\n\n```python\nIncludePackageLaunchFile(\n    package='my_package',\n    launch_file='my_launch.py'\n)\n```\n\n**Parameters:**\n- `package`: Name of the package containing the launch file\n- `launch_file`: Path to the launch file within the package\n\n### LogRotate\n\nManage log file rotation to prevent disk space issues.\n\n```python\nLogRotate(\n    log_file='/path/to/logfile.log',\n    max_size='100MB',\n    backup_count=5\n)\n```\n\n**Parameters:**\n- `log_file`: Path to the log file to rotate\n- `max_size`: Maximum size before rotation\n- `backup_count`: Number of backup files to keep\n\n### MakeDeviceNode\n\nCreate Linux device nodes for USB devices that are not automatically created by the kernel or when udev is not permitted.\n\n```python\nMakeDeviceNode(\n    \"/dev/tty-magnetometer\",\n    \"ttyUSB\",\n    \"Prolific Technology Inc.\",\n    \"USB-Serial Controller D\"\n)\n```\n\n**Parameters:**\n- `target_node`: Path where the device node should be created\n- `device_type`: Type of device (e.g., \"ttyUSB\")\n- `manufacturer`: USB device manufacturer name\n- `product`: USB device product name\n\nWill create a device node at `/dev/tty-magnetometer` if it does not already exist. The device node will be created if the USB device with the vendor name `Prolific Technology Inc.` and product name `USB-Serial Controller D` is connected.\n\n### SetLaunchConfigurationIfNotNone\n\nConditionally set launch configurations only if the value is not None.\n\n```python\nSetLaunchConfigurationIfNotNone(\n    name='my_config',\n    value=LaunchConfiguration('optional_param')\n)\n```\n\n**Parameters:**\n- `name`: Configuration parameter name\n- `value`: Value to set (only if not None)\n\n### WriteFile\n\nWrite content to a file during launch execution.\n\n```python\nWriteFile(\n    file_path='/tmp/config.txt',\n    content='configuration data'\n)\n```\n\n**Parameters:**\n- `file_path`: Path where the file should be written\n- `content`: Content to write to the file\n\n### Git Repository Actions\n\n#### LogRepoInfo\n\nLog git repository information including branch, commit, and status.\n\n```python\nLogRepoInfo(\"/path/to/repo\")\n```\n\n**Parameters:**\n- `path`: Path to the git repository\n\n#### VerifyRepoCommit\n\nVerify that a repository is at a specific commit hash.\n\n```python\nVerifyRepoCommit(\n    \"/path/to/repo\",\n    \"abc123...\",\n    pass_on_failure=False\n)\n```\n\n**Parameters:**\n- `path`: Path to the git repository\n- `commit`: Expected commit hash\n- `pass_on_failure`: Whether to continue on verification failure\n\n#### VerifyRepoClean\n\nVerify that a repository has no uncommitted changes.\n\n```python\nVerifyRepoClean(\n    \"/path/to/repo\",\n    pass_on_failure=False\n)\n```\n\n**Parameters:**\n- `path`: Path to the git repository\n- `pass_on_failure`: Whether to continue on verification failure\n\n### Middleware Configuration\n\n#### ConfigureZenoh\n\nConfigure Zenoh middleware for ROS 2 communication.\n\n```python\nConfigureZenoh(\n    with_router=True,\n    router_config={'port': 7447},\n    session_config={'mode': 'peer'}\n)\n```\n\n**Parameters:**\n- `with_router`: Whether to start a Zenoh router\n- `router_config`: Router configuration overrides\n- `session_config`: Session configuration overrides\n\n#### ConfigureFastDDS\n\nConfigure FastDDS middleware settings.\n\n```python\nConfigureFastDDS(\n    config_file='/path/to/fastdds.xml'\n)\n```\n\n## Conditions\n\n### EnumEqual\n\nCheck if a substitution value equals a specific enum value.\n\n```python\nfrom enum import Enum\n\nclass Mode(Enum):\n    DEBUG = \"debug\"\n    RELEASE = \"release\"\n\nEnumEqual(\n    LaunchConfiguration('build_mode'),\n    Mode.DEBUG\n)\n```\n\n**Parameters:**\n- `substitute`: Substitution to evaluate\n- `check_enum_value`: Enum value to compare against\n\n## Substitutions\n\n### Templated\n\nTemplate-based string substitution using Python's string.Template.\n\n```python\nTemplated(\"Hello ${name}, mode is ${mode}\")\n```\n\nUses launch configurations as template variables.\n\n### Unary\n\nUnary operation substitution for mathematical expressions.\n\n```python\nUnary('-', LaunchConfiguration('value'))\n```\n\n### WriteTempFile\n\nCreate a temporary file with specified content and return its path.\n\n```python\nWriteTempFile(\"temporary content\")\n```\n\nReturns the path to the created temporary file.\n\n### YAMLToFile / YamlToJson\n\nConvert YAML content to JSON format.\n\n```python\nYamlToJson(\n    FileContent(file_path),\n    quote_output=True\n)\n```\n\n**Parameters:**\n- `file_content_substitution`: Source of YAML content\n- `quote_output`: Whether to wrap JSON in quotes\n\n### ResolveHost\n\nResolve hostname to IP address.\n\n```python\nResolveHost(\"example.com\")\n```\n\n### Xacro\n\nProcess Xacro files for robot descriptions.\n\n```python\nXacro(\"robot.urdf.xacro\")\n```","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgreenroom-robotics%2Flaunch_ext","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fgreenroom-robotics%2Flaunch_ext","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgreenroom-robotics%2Flaunch_ext/lists"}