diff --git a/.clang-format b/.clang-format new file mode 100644 index 0000000..9a6ec50 --- /dev/null +++ b/.clang-format @@ -0,0 +1,75 @@ +--- +BasedOnStyle: Google +ColumnLimit: 120 +MaxEmptyLinesToKeep: 1 +SortIncludes: false + +Standard: Auto +IndentWidth: 2 +TabWidth: 2 +UseTab: Never +AccessModifierOffset: -2 +ConstructorInitializerIndentWidth: 2 +NamespaceIndentation: None +ContinuationIndentWidth: 4 +IndentCaseLabels: true +IndentFunctionDeclarationAfterType: false + +AlignEscapedNewlinesLeft: false +AlignTrailingComments: true + +AllowAllParametersOfDeclarationOnNextLine: false +ExperimentalAutoDetectBinPacking: false +ObjCSpaceBeforeProtocolList: true +Cpp11BracedListStyle: false + +AllowShortBlocksOnASingleLine: true +AllowShortIfStatementsOnASingleLine: false +AllowShortLoopsOnASingleLine: false +AllowShortFunctionsOnASingleLine: None +AllowShortCaseLabelsOnASingleLine: false + +AlwaysBreakTemplateDeclarations: true +AlwaysBreakBeforeMultilineStrings: false +BreakBeforeBinaryOperators: false +BreakBeforeTernaryOperators: false +BreakConstructorInitializersBeforeComma: true + +BinPackParameters: true +ConstructorInitializerAllOnOneLineOrOnePerLine: true +DerivePointerBinding: false +PointerBindsToType: true + +PenaltyExcessCharacter: 50 +PenaltyBreakBeforeFirstCallParameter: 30 +PenaltyBreakComment: 1000 +PenaltyBreakFirstLessLess: 10 +PenaltyBreakString: 100 +PenaltyReturnTypeOnItsOwnLine: 50 + +SpacesBeforeTrailingComments: 2 +SpacesInParentheses: false +SpacesInAngles: false +SpaceInEmptyParentheses: false +SpacesInCStyleCastParentheses: false +SpaceAfterCStyleCast: false +SpaceAfterControlStatementKeyword: true +SpaceBeforeAssignmentOperators: true + +# Configure each individual brace in BraceWrapping +BreakBeforeBraces: Custom + +# Control of individual brace wrapping cases +BraceWrapping: + AfterCaseLabel: true + AfterClass: true + AfterControlStatement: true + AfterEnum: true + AfterFunction: true + AfterNamespace: true + AfterStruct: true + AfterUnion: true + BeforeCatch: true + BeforeElse: true + IndentBraces: false +... diff --git a/.clang-tidy b/.clang-tidy new file mode 100644 index 0000000..7fae366 --- /dev/null +++ b/.clang-tidy @@ -0,0 +1,50 @@ +--- +Checks: '-*, + performance-*, + llvm-namespace-comment, + modernize-redundant-void-arg, + modernize-use-nullptr, + modernize-use-default, + modernize-use-override, + modernize-loop-convert, + readability-named-parameter, + readability-redundant-smartptr-get, + readability-redundant-string-cstr, + readability-simplify-boolean-expr, + readability-container-size-empty, + readability-identifier-naming, + ' +HeaderFilterRegex: '' +AnalyzeTemporaryDtors: false +CheckOptions: + - key: llvm-namespace-comment.ShortNamespaceLines + value: '10' + - key: llvm-namespace-comment.SpacesBeforeComments + value: '2' + - key: readability-braces-around-statements.ShortStatementLines + value: '2' + # type names + - key: readability-identifier-naming.ClassCase + value: CamelCase + - key: readability-identifier-naming.EnumCase + value: CamelCase + - key: readability-identifier-naming.UnionCase + value: CamelCase + # method names + - key: readability-identifier-naming.MethodCase + value: camelBack + # variable names + - key: readability-identifier-naming.VariableCase + value: lower_case + - key: readability-identifier-naming.ClassMemberSuffix + value: '_' + # const static or global variables are UPPER_CASE + - key: readability-identifier-naming.EnumConstantCase + value: UPPER_CASE + - key: readability-identifier-naming.StaticConstantCase + value: UPPER_CASE + - key: readability-identifier-naming.ClassConstantCase + value: UPPER_CASE + - key: readability-identifier-naming.GlobalVariableCase + value: UPPER_CASE +... diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md new file mode 100644 index 0000000..b697ce3 --- /dev/null +++ b/.github/pull_request_template.md @@ -0,0 +1,36 @@ +## PR Type + +- [ ] Feature +- [ ] Bug fix +- [ ] Refactor +- [ ] Documentation +- [ ] Other + +## Overview +- + + +## Detail +- + + +## Test +- [ ] + + +## Attention +- + diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 0000000..f8fe03e --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,104 @@ +name: ROS1 Industrial CI +on: + pull_request: + +jobs: + clang_format_check: + runs-on: ubuntu-latest + steps: + - name: checkout + uses: actions/checkout@v2 + with: + ref: ${{ github.head_ref }} + - name: run industrial_ci + uses: 'ros-industrial/industrial_ci@master' + env: + ROS_DISTRO: noetic # Replace noetic for your chosen distro. + CLANG_FORMAT_CHECK: file + CLANG_FORMAT_VERSION: "10" + + clang_tidy_check: + runs-on: ubuntu-latest + steps: + - name: checkout + uses: actions/checkout@v2 + with: + ref: ${{ github.head_ref }} + - name: run industrial_ci + uses: 'ros-industrial/industrial_ci@master' + env: + ROS_DISTRO: noetic # Replace noetic for your chosen distro. + # UPSTREAM_WORKSPACE: dependencies.rosinstall + # BEFORE_BUILD_TARGET_WORKSPACE: 'apt update -q && python3 -m pip install ****' + CLANG_TIDY: pedantic + + black_check: + runs-on: ubuntu-latest + steps: + - name: checkout + uses: actions/checkout@v2 + with: + ref: ${{ github.head_ref }} + - name: run industrial_ci + uses: 'ros-industrial/industrial_ci@master' + env: + ROS_DISTRO: noetic # Replace noetic for your chosen distro. + BLACK_CHECK: true + + pylint_check: + runs-on: ubuntu-latest + steps: + - name: checkout + uses: actions/checkout@v2 + with: + ref: ${{ github.head_ref }} + - name: run industrial_ci + uses: 'ros-industrial/industrial_ci@master' + env: + ROS_DISTRO: noetic # Replace noetic for your chosen distro. + # UPSTREAM_WORKSPACE: dependencies.rosinstall + # BEFORE_BUILD_TARGET_WORKSPACE: 'apt update -q && python3 -m pip install ****' + PYLINT_ARGS: '--errors-only' + PYLINT_CHECK: true + + catkin_lint_check: + runs-on: ubuntu-latest + steps: + - name: checkout + uses: actions/checkout@v2 + with: + ref: ${{ github.head_ref }} + - name: run industrial_ci + uses: 'ros-industrial/industrial_ci@master' + env: + ROS_DISTRO: noetic # Replace noetic for your chosen distro. + # UPSTREAM_WORKSPACE: dependencies.rosinstall + # BEFORE_BUILD_TARGET_WORKSPACE: 'apt update -q && python3 -m pip install ****' + CATKIN_LINT: true + + build_check: + runs-on: ubuntu-latest + continue-on-error: true + strategy: + fail-fast: false + matrix: + env: + - ROS_DISTRO: noetic # Replace noetic for your chosen distro. + ROS_REPO: main + # UPSTREAM_WORKSPACE: dependencies.rosinstall + # BEFORE_BUILD_TARGET_WORKSPACE: 'apt update -q && python3 -m pip install ****' + IMMEDIATE_TEST_OUTPUT: true + - ROS_DISTRO: noetic # Replace noetic for your chosen distro. + ROS_REPO: testing + # UPSTREAM_WORKSPACE: dependencies.rosinstall + # BEFORE_BUILD_TARGET_WORKSPACE: 'apt update -q && python3 -m pip install ****' + IMMEDIATE_TEST_OUTPUT: true + + steps: + - name: checkout + uses: actions/checkout@v2 + with: + ref: ${{ github.head_ref }} + - name: run industrial_ci + uses: 'ros-industrial/industrial_ci@master' + env: ${{matrix.env}} diff --git a/.gitignore b/.gitignore index 35d74bb..f443eff 100644 --- a/.gitignore +++ b/.gitignore @@ -49,3 +49,9 @@ qtcreator-* # Catkin custom files CATKIN_IGNORE + +# vscode +.vscode + +# compiler logs +compile_commands.json diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..e158e1c --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,205 @@ +cmake_minimum_required(VERSION 3.0.2) +project(template) + +## Compile as C++11, supported in ROS Kinetic and newer +# add_compile_options(-std=c++11) + +## Find catkin macros and libraries +## if COMPONENTS list like find_package(catkin REQUIRED COMPONENTS xyz) +## is used, also find other catkin packages +find_package(catkin REQUIRED COMPONENTS + roscpp + rospy +) + +## System dependencies are found with CMake's conventions +# find_package(Boost REQUIRED COMPONENTS system) + + +## Uncomment this if the package has a setup.py. This macro ensures +## modules and global scripts declared therein get installed +## See http://ros.org/doc/api/catkin/html/user_guide/setup_dot_py.html +# catkin_python_setup() + +################################################ +## Declare ROS messages, services and actions ## +################################################ + +## To declare and build messages, services or actions from within this +## package, follow these steps: +## * Let MSG_DEP_SET be the set of packages whose message types you use in +## your messages/services/actions (e.g. std_msgs, actionlib_msgs, ...). +## * In the file package.xml: +## * add a build_depend tag for "message_generation" +## * add a build_depend and a exec_depend tag for each package in MSG_DEP_SET +## * If MSG_DEP_SET isn't empty the following dependency has been pulled in +## but can be declared for certainty nonetheless: +## * add a exec_depend tag for "message_runtime" +## * In this file (CMakeLists.txt): +## * add "message_generation" and every package in MSG_DEP_SET to +## find_package(catkin REQUIRED COMPONENTS ...) +## * add "message_runtime" and every package in MSG_DEP_SET to +## catkin_package(CATKIN_DEPENDS ...) +## * uncomment the add_*_files sections below as needed +## and list every .msg/.srv/.action file to be processed +## * uncomment the generate_messages entry below +## * add every package in MSG_DEP_SET to generate_messages(DEPENDENCIES ...) + +## Generate messages in the 'msg' folder +# add_message_files( +# FILES +# Message1.msg +# Message2.msg +# ) + +## Generate services in the 'srv' folder +# add_service_files( +# FILES +# Service1.srv +# Service2.srv +# ) + +## Generate actions in the 'action' folder +# add_action_files( +# FILES +# Action1.action +# Action2.action +# ) + +## Generate added messages and services with any dependencies listed here +# generate_messages( +# DEPENDENCIES +# std_msgs # Or other packages containing msgs +# ) + +################################################ +## Declare ROS dynamic reconfigure parameters ## +################################################ + +## To declare and build dynamic reconfigure parameters within this +## package, follow these steps: +## * In the file package.xml: +## * add a build_depend and a exec_depend tag for "dynamic_reconfigure" +## * In this file (CMakeLists.txt): +## * add "dynamic_reconfigure" to +## find_package(catkin REQUIRED COMPONENTS ...) +## * uncomment the "generate_dynamic_reconfigure_options" section below +## and list every .cfg file to be processed + +## Generate dynamic reconfigure parameters in the 'cfg' folder +# generate_dynamic_reconfigure_options( +# cfg/DynReconf1.cfg +# cfg/DynReconf2.cfg +# ) + +################################### +## catkin specific configuration ## +################################### +## The catkin_package macro generates cmake config files for your package +## Declare things to be passed to dependent projects +## INCLUDE_DIRS: uncomment this if your package contains header files +## LIBRARIES: libraries you create in this project that dependent projects also need +## CATKIN_DEPENDS: catkin_packages dependent projects also need +## DEPENDS: system dependencies of this project that dependent projects also need +catkin_package( + CATKIN_DEPENDS roscpp rospy +# INCLUDE_DIRS include +# LIBRARIES template +# DEPENDS system_lib +) + +########### +## Build ## +########### + +## Specify additional locations of header files +## Your package locations should be listed before other locations +include_directories( +# include + ${catkin_INCLUDE_DIRS} +) + +## Declare a C++ library +# add_library(${PROJECT_NAME} +# src/${PROJECT_NAME}/template.cpp +# ) + +## Add cmake target dependencies of the library +## as an example, code may need to be generated before libraries +## either from message generation or dynamic reconfigure +# add_dependencies(${PROJECT_NAME} ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS}) + +## Declare a C++ executable +## With catkin_make all packages are built within a single CMake context +## The recommended prefix ensures that target names across packages don't collide +# add_executable(${PROJECT_NAME}_node src/template_node.cpp) + +## Rename C++ executable without prefix +## The above recommended prefix causes long target names, the following renames the +## target back to the shorter version for ease of user use +## e.g. "rosrun someones_pkg node" instead of "rosrun someones_pkg someones_pkg_node" +# set_target_properties(${PROJECT_NAME}_node PROPERTIES OUTPUT_NAME node PREFIX "") + +## Add cmake target dependencies of the executable +## same as for the library above +# add_dependencies(${PROJECT_NAME}_node ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS}) + +## Specify libraries to link a library or executable target against +# target_link_libraries(${PROJECT_NAME}_node +# ${catkin_LIBRARIES} +# ) + +############# +## Install ## +############# + +# all install targets should use catkin DESTINATION variables +# See http://ros.org/doc/api/catkin/html/adv_user_guide/variables.html + +## Mark executable scripts (Python etc.) for installation +## in contrast to setup.py, you can choose the destination +# catkin_install_python(PROGRAMS +# scripts/my_python_script +# DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION} +# ) + +## Mark executables for installation +## See http://docs.ros.org/melodic/api/catkin/html/howto/format1/building_executables.html +# install(TARGETS ${PROJECT_NAME}_node +# RUNTIME DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION} +# ) + +## Mark libraries for installation +## See http://docs.ros.org/melodic/api/catkin/html/howto/format1/building_libraries.html +# install(TARGETS ${PROJECT_NAME} +# ARCHIVE DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION} +# LIBRARY DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION} +# RUNTIME DESTINATION ${CATKIN_GLOBAL_BIN_DESTINATION} +# ) + +## Mark cpp header files for installation +# install(DIRECTORY include/${PROJECT_NAME}/ +# DESTINATION ${CATKIN_PACKAGE_INCLUDE_DESTINATION} +# FILES_MATCHING PATTERN "*.h" +# PATTERN ".svn" EXCLUDE +# ) + +## Mark other files for installation (e.g. launch and bag files, etc.) +# install(FILES +# # myfile1 +# # myfile2 +# DESTINATION ${CATKIN_PACKAGE_SHARE_DESTINATION} +# ) + +############# +## Testing ## +############# + +## Add gtest based cpp test target and link libraries +# catkin_add_gtest(${PROJECT_NAME}-test test/test_template.cpp) +# if(TARGET ${PROJECT_NAME}-test) +# target_link_libraries(${PROJECT_NAME}-test ${PROJECT_NAME}) +# endif() + +## Add folders to be run by python nosetests +# catkin_add_nosetests(test) diff --git a/README.md b/README.md index 93b88e2..5d31452 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,80 @@ # ros1-pkg-template -This is the template repository for the ROS1 package. +This is the template repository for the ROS1 package with [Industrial CI](https://github.com/ros-industrial/industrial_ci). +## Before use +Adjust the `ROS_DISTRO` tag in [ci.yml](https://github.com/Alpaca-zip/ros1-pkg-template/blob/main/.github/workflows/ci.yml) to suit your ROS environment: +```yaml +jobs: + clang_format_check: + runs-on: ubuntu-latest + steps: + - name: checkout + uses: actions/checkout@v2 + with: + ref: ${{ github.head_ref }} + - name: run industrial_ci + uses: 'ros-industrial/industrial_ci@master' + env: + ROS_DISTRO: noetic # Replace noetic for your chosen distro. + CLANG_FORMAT_CHECK: file + CLANG_FORMAT_VERSION: "10" +``` +## Industrial CI +This template provides a comprehensive CI pipeline for ROS project using GitHub Actions and the ros-industrial/industrial_ci action. +- `Clang Format Check` : Ensures code formatting adheres to defined standards using [clang-format](https://clang.llvm.org/docs/ClangFormat.html). +- `Clang Tidy Check` : Validates code for potential issues and adherence to coding standards using [Clang-Tidy](https://clang.llvm.org/extra/clang-tidy/). +- `Black Check` : Ensures code formatting adheres to PEP standards using [Black](https://black.readthedocs.io/en/stable/). +- `Pylint Check` : Runs [Pylint](https://pylint.readthedocs.io/en/stable/) for static code analysis on Python code. +- `Catkin Lint Check` : Validates our ROS package structure and dependencies with [catkin_lint](https://fkie.github.io/catkin_lint/). +- `Build Check` : Performs a build for both main and testing ROS repositories to ensure the codebase builds correctly. +## To pass all checks... +### clang-format +**1. install** +``` +$ sudo apt-get install clang-format +``` +**2. Format with clang-format** +``` +$ roscd +$ find . -type f \( -name "*.cpp" -or -name "*.hpp" -or -name "*.h" \) -exec clang-format -i -style=file {} \; +``` +### Clang-Tidy +**1. install** +``` +$ sudo apt-get install clang clang-tidy +``` +**2. Format with Clang-Tidy** +``` +$ catkin build --cmake-args -DCMAKE_EXPORT_COMPILE_COMMANDS=1 +$ cp ~//build//compile_commands.json / +$ roscd && clang-tidy ./src/.cpp -p=./ -fix +``` + Recommended tool : [catkin_tidy](https://github.com/nyxrobotics/catkin_tidy) +### Black +**1. install** +``` +$ pip install black +``` +**2. Format with Black** +``` +$ roscd +$ find . -type f -name "*.py" -exec black {} \; +``` +### Pylint +**1. install** +``` +$ pip install pylint +``` +**2. Run Pylint** +``` +$ roscd +$ find . -type f -name "*.py" -exec pylint {} \; +``` +### catkin_lint +**1. install** +``` +$ sudo apt-get install catkin-lint +``` +**2. Run catkin_lint** +``` +$ catkin_lint --pkg +``` diff --git a/dependencies.rosinstall b/dependencies.rosinstall new file mode 100644 index 0000000..9841329 --- /dev/null +++ b/dependencies.rosinstall @@ -0,0 +1,4 @@ +#- git: +# local-name: PACKAGE_NAME +# uri: https://github.com/USERNAME/REPOSITORY_NAME.git +# version: BRANCH_NAME diff --git a/package.xml b/package.xml new file mode 100644 index 0000000..2e6bbdd --- /dev/null +++ b/package.xml @@ -0,0 +1,65 @@ + + + template + 0.0.0 + The template package + + + + + template + + + + + + Apache 2.0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + catkin + roscpp + rospy + roscpp + rospy + roscpp + rospy + + + + + + + +