From 7ac7e8676f356be984f87306f40f1856c6f8f084 Mon Sep 17 00:00:00 2001 From: Alpaca-zip Date: Tue, 5 Dec 2023 14:39:32 +0900 Subject: [PATCH 01/12] refactor launch file and package information --- .clang-format | 75 ----------------------------- .clang-tidy | 50 ------------------- .github/workflows/ci.yml | 25 ---------- CMakeLists.txt | 11 +---- dependencies.rosinstall | 4 -- include/cpp_template/cpp_template.h | 29 ----------- launch/template.launch | 3 +- package.xml | 12 ++--- src/cpp_template.cpp | 35 -------------- 9 files changed, 6 insertions(+), 238 deletions(-) delete mode 100644 .clang-format delete mode 100644 .clang-tidy delete mode 100644 dependencies.rosinstall delete mode 100644 include/cpp_template/cpp_template.h delete mode 100644 src/cpp_template.cpp diff --git a/.clang-format b/.clang-format deleted file mode 100644 index 9a6ec50..0000000 --- a/.clang-format +++ /dev/null @@ -1,75 +0,0 @@ ---- -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 deleted file mode 100644 index 7fae366..0000000 --- a/.clang-tidy +++ /dev/null @@ -1,50 +0,0 @@ ---- -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/workflows/ci.yml b/.github/workflows/ci.yml index 47c1609..c0595ef 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -6,31 +6,6 @@ on: - main jobs: - clang_format_check: - runs-on: ubuntu-latest - steps: - - name: checkout - uses: actions/checkout@v2 - - 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 - - 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: diff --git a/CMakeLists.txt b/CMakeLists.txt index c3d761b..78d6659 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -4,20 +4,13 @@ project(template) set(CMAKE_CXX_STANDARD 14) # find dependencies -find_package(catkin REQUIRED COMPONENTS roscpp rospy) +find_package(catkin REQUIRED COMPONENTS rospy) # Declare a catkin package -catkin_package(CATKIN_DEPENDS roscpp rospy) +catkin_package(CATKIN_DEPENDS rospy) # Specify additional locations of header files include_directories(include ${catkin_INCLUDE_DIRS}) -# Create Cpp executable -add_executable(cpp_template src/cpp_template.cpp) -target_link_libraries(cpp_template ${catkin_LIBRARIES}) - -# Install Cpp executable -install(TARGETS cpp_template RUNTIME DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION}) - # Install Python executables install(PROGRAMS scripts/py_template.py DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION}) diff --git a/dependencies.rosinstall b/dependencies.rosinstall deleted file mode 100644 index 9841329..0000000 --- a/dependencies.rosinstall +++ /dev/null @@ -1,4 +0,0 @@ -#- git: -# local-name: PACKAGE_NAME -# uri: https://github.com/USERNAME/REPOSITORY_NAME.git -# version: BRANCH_NAME diff --git a/include/cpp_template/cpp_template.h b/include/cpp_template/cpp_template.h deleted file mode 100644 index c884beb..0000000 --- a/include/cpp_template/cpp_template.h +++ /dev/null @@ -1,29 +0,0 @@ -/** - * Copyright (C) 2023 template - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#pragma once - -#include - -class TemplateNode -{ -private: - ros::NodeHandle nh_; - -public: - TemplateNode(); - ~TemplateNode(); -}; diff --git a/launch/template.launch b/launch/template.launch index c93e1dc..25b0e79 100644 --- a/launch/template.launch +++ b/launch/template.launch @@ -1,5 +1,4 @@ - - + diff --git a/package.xml b/package.xml index 59d415d..c92ae37 100644 --- a/package.xml +++ b/package.xml @@ -1,22 +1,16 @@ - template + vgraph_planner 0.0.0 - The template package - template + The vgraph_planner package + Alpaca-zip Apache 2.0 catkin - roscpp rospy - roscpp rospy - roscpp rospy - - - diff --git a/src/cpp_template.cpp b/src/cpp_template.cpp deleted file mode 100644 index c80b4d8..0000000 --- a/src/cpp_template.cpp +++ /dev/null @@ -1,35 +0,0 @@ -/** - * Copyright (C) 2023 template - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "cpp_template/cpp_template.h" - -TemplateNode::TemplateNode() -{ - // constructor -} - -TemplateNode::~TemplateNode() -{ - // destructor -} - -int main(int argc, char** argv) -{ - ros::init(argc, argv, "cpp_template"); - TemplateNode node; - ROS_INFO("From C++: Hello, world!!"); - return 0; -} From 10a71f3c90675ece1b028337b1bef49636820770 Mon Sep 17 00:00:00 2001 From: Alpaca-zip Date: Tue, 5 Dec 2023 14:43:28 +0900 Subject: [PATCH 02/12] change project name to vgraph_planner and initialize readme --- CMakeLists.txt | 2 +- README.md | 80 +------------------------------------------------- 2 files changed, 2 insertions(+), 80 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 78d6659..87aa6a9 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,5 +1,5 @@ cmake_minimum_required(VERSION 3.0.2) -project(template) +project(vgraph_planner) set(CMAKE_CXX_STANDARD 14) diff --git a/README.md b/README.md index 439f66b..a137b33 100644 --- a/README.md +++ b/README.md @@ -1,79 +1 @@ -# ros1-pkg-template -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** -``` -$ cd && catkin build --cmake-args -DCMAKE_EXPORT_COMPILE_COMMANDS=1 -$ clang-tidy -p build// /src/ -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 -``` +# vgraph_planner From 8fe0a1085932a61a4f4545d3c2370ad230dd2d41 Mon Sep 17 00:00:00 2001 From: Alpaca-zip Date: Tue, 5 Dec 2023 14:47:53 +0900 Subject: [PATCH 03/12] add map.pgm and map.yaml files --- map/map.pgm | Bin 0 -> 184992 bytes map/map.yaml | 7 +++++++ 2 files changed, 7 insertions(+) create mode 100644 map/map.pgm create mode 100644 map/map.yaml diff --git a/map/map.pgm b/map/map.pgm new file mode 100644 index 0000000000000000000000000000000000000000..e92a7cd221a142594d959df0a4cec4e267c34530 GIT binary patch literal 184992 zcmeI5Tejt>4TkHvN0A|9CFzIEA``DEofTaW7b9%h7>r$Vo!$l+gZMuL>}&t;@4x=@ z_kaKKpMU=QuYdjh_g}w%|Nb@V`27q1Vg2%lS+bzP4^@GmAQ@qyj9N@L{`~s&bLD^$ z@Pqf#->Bj6=hge0cohBS5WtYo35peOLXv@}U`0Um4=*q;EX3R>6`Le;Xq!vmBUZ$Z zkiY}0^85TCwRU&j~-hG|z4nZU|kE zO19FBIo&~T(5wKlgpmCC2|+0D?l zpI}9mRnK99C5rHn!zg_6Ejt_LuA6rN!KBwQ&Ony@UMn)n2pL|Zczq7s~IMDdIf_<5$z{{Mo?1$Qj1Pxp2u^lVrdry-`dYaZxyqTu4`L4f61+_cnHQL= zs@(9b0vwg`<8~WUEu=J>03S8|B zlcd*Rcc)j{_Xzd68n-;JK%fIBj!Hgl{DKLVH?bSLXID}nn_$y!RZaN>yAn6e7m7!m zW;rUGyI9}$XzHzG3u`5~v=?>wg8JU|m3s8Y`jSwR1lzYP(^TtGx%wDEl=z3+n#4^@ zc~maWlD9p$PV!nwP&JZ1!7fgc0H#-a8s73!3B?-M-MoSVyjGGY6q?Ox*4N4vaP9e! zPq4IDDk~#vhj3FK& zIO$IXNk(MOA-s? z7?xNv&|b%V_asvQ=-?lp(B4`recO|%wqi0c#Bf8J`75x=T{e4ECPh|E!L%7LB1)W6 zJt|k^Wblbea!68KHYZqLD-Ci!S%gCpA0;Z~`>|kw7^O!J)DXZ})Q<%f2z+?Sq^FhY z1dB#rD;MO40T>QuNEwwOuAbp=lp@+1XG8}FK1HN|5S8>hFEEvcAAD&N?L&#-zdgbd zO`fbF&uhE@c=YvV{>Uq&agRfKqM8zY`I)-Ln_4P#&*X&k{EKhoqWY|Oq1T=z>G=qXE zkGeBy!ch0cXfZWwZi0Gr#`!zSlA_!0f)Uldc6Q;frP}{T23041?1(Zd zb#S%y11NFdRvj-zsdc65Tf^`Hl$psd{n}Fef2nXl=_e|kCsQKwJ)Ju zX@b?q!dR=;|5rvOzQ|BdFjmVK*2>RJuv1WK178^}&%}Z@l%MgWclH?{mD;dZK++46 zy}dbqKRz9+4oBG#QdO&x4^cKM7-{~_wuj!@P-HckjM}e_@Ho=%cLLpli*-_f+ zyERBZ6qQz;Rk}9mt;?}7$ZsVH@4$a%tyEuwRJkceBT8f7JIc;cYSdW)Y2Bw-1K&}0 zqSTgsjhkj$CMwZ6_&}3LK_B*o41efXtm;{v{T~@rs(Yu59Z`Avw&#@N*9r&RkvgEP z7t42|w9bBNP%aad*Rb+kHA(Br(bMXPdzC?{Vbg5J!D}5Y#_B`_m{BF!asJQ_)~d6H z^1%uA4vIVgw4r=*P<4!?J8xB&eU)2nH1^m!T5Q#U8^il=^W;u9ZmCNfl{GchV(hWC zg~RF+MWA^TP<1FDdUA{Mw^!2fWW?CxJEAgCybU5Nsjro{t30JbYs@HdIRzy?U*rg+ zR2Ga`vPUUx2isHMbN4QUvJwG@56+}KjN;{+7>4>30gPibIGxi# zs%EVpbh+1!8){Q}qUo&JtWl|qd%Zf%3bq@1xl={$9W0+a<=4G517)q22JMO`H|VN3 zcSEgDRB=VX0KzzUtu5@A8>Wpis@@rt+Fo4goN5||l2*mdN+})$r1#CbpNYyD+n)V! z6Gr9c2x&F~F~&?xGz!|xpFue#DiyUNz?6Vd)i}UOm;uU*Hcp08$$^wI+_qp5W5}d# zrj&hxwXg(IscKGPWQOM;^7@?=xlc){F+bl|`^=hZ0rNiXri~~uoObKsix_l8Fz#tq_Jv#+ z8MUkdqiBE;D(RcfYMVFJJ++!iC{1s4Z6;XJIO@R*r(|zJDy`(_+lPzzJoMa!((ak9 z8HHtPf&%j9$rWqQ8A>{}`l6Jgp7iJF40!AvHL=_{lh;npglM@b9;y1Ur7HXCQJG7> zO#`KJe_Dzcav95_0t`kj0_HnOVs-U#cN0Zl#$__~>OSpTP6Va(i}LKvwzs%QhJWPI z_IgKNjY@3meTQk{YY;t!()Nr5gSQru+ebSAy>Y?RNxl&zh%+lH=_jQdV=&=I(B0PnP?xb+Fuq&yiDC zSaQJf-UKzi`%qX?{NLTqjQS>`v@Vy~5Xngn00{zf3pr6V%~1aCHabY2onXOr!}AgR zkW^$DbPho8?mO03v_KhNlt;8RxXvz=QF5!3rq*B{4i$s6LF-|Qmo$(erKo&kT$*%~q{uNJGBkQ#3bN}Jf(zRooM0`3Co3}!BnBSEUl#w6#0HV@z=j7^ zoelr8OUJoO6KolAtwx09piZZ1>!@V9FGMMtwKUzcUqNZx_{dLOCCLY+6p|rU-^cO^ zl$MDAgLe?VtXiB!w}TZKzH)xe_ZQnv9pvTNUnY$uXsQf~5@)ZEa6h_;hj0 zOc%%PCeaf!rglfput-wh!7|JD&9Np)HwY!$gVMBh9*GhsSNczSlg@JG=`cIleh11< zp)JpXM(=zmG!sKfg?K$F<LA4K`+6wA1f zrW^@nh|9G=9eeW}N({?Kr`QmDf>O??SpM}JxYKjfGww=l` zQjv979e83=bKBjJzm8HWG_^j8B?q6lB4?OqQ8K3ZDwZZOrJI}cMU;6hmgWKF#g-0+ zF*6J9$fAj>C$oGNM{wDqWv+dmz9ev70i-SMk3q?#qC1R|qA_e-9pzpqMB!q>f^x(& zlE5iFtxQoVvul`S_xiKcHItN4_%d-eD$Bb=&f>tRDHeH(Q<7jhk@Qlq_MNdPDZSmC z&#hpanS%&qnipn&r`U`i;=q*47ricrZ=5GWk_1<72*YcqQb)r*r#Do~uKAU19?`xJe zMJ0;G_~5aKN+yXP+A_rD?O};nh*j1hbP&ynVM^hJwGWGoWoKi~s4ntjmUJfqjS14m z`U2j~LJFni4W_sexps4tW2+m9QUoD|2q@(R-x4R^`};Si{(W(`Zzgf6vO&*V>y5^g8&t<@}0t^?)arw9-h6AMI9F$zk0 zq^m(miyN?}-Ygh7#~y^>jN^-2+GKBT{^sf|8V0$m)3LHF1uBLqI%B#%ENgJGAhlE2+Bw}UVlx(BH>2$m_0%n zMIe3RZF<7u$PkvLJLoem11~%*3YMKsIXlX9Pcvn4=`8OE|i4^%?yh|m@`odh2UQN znzP}6l3695%oONAiNYg++YSRsY;u`{-_^liSHw6*$5>cAaXO`<(>*V zC~fM$p%l*v=`p16gs%~UP6P{qaf(M2jVyZDj4-+*w}n9{cDyH~X)I9D!xzx@Ks(C8 z}h|Fztkn{=Gtn!qCj&h336B_B6Up*=(06NixN975z)-LKO*XDD=J4bm! ztfhTBhJ zKr3FRPtUPqS<+Fi$O?U`z8rhx=wm4HJJ|Ro?C_;s|8(>osqi7zP$Y{){0Sks@gbD- z?fJ_O;=G@81(rbxpWm|`f7}QCLP$#ZVHODHSt`*(5`LrP^6@K93!w_}?5IZgHNdZY zC_c)EKN}Kd5G-tfXBcuRJICUoP&m=8*B&-CW^ElND-Xeg>ZXS2BPd}Gf-V=&26^Mq z46ph^ZMjCWD=MqWl(>Nvfx-ix8D+>YXe9n2lx^W}gVb&!ze2LJ#AhEXl4lHO8(Xt{ z5s$g7Poz6guBq-+uN>u6xkonUC`YP0wQff_Rqm0EIm(ghPOaNfPL+FPV~%p9x>M_R zlvCv%*_fjosqWOe9pzNHM>ggtN2)uuZbvy)?vaf-%8}|$t=myfm3w4kj&h{BQ|n#{ zsYgjqTF8Nlvc_oy-?dcjBE1~oW_A@9wDnEnLqta1!De#$_eXVqq173su{sar( zET=E(;y29sU-(`!<>FU*P@BYdHB1e1$(e*F8DXTH4)WdS=K+w;Z@ zSty~|0DOOfwfJ2g)$(Tsut)c!~KtJHfm1lQ%(b!#)d+! zGGPtkW~>bd8(2eLF1OC9B-|A1P!f0%E5=LVfrd2>a&!VK;zl@+WyK<8T25H(il&tw z4MXtD(n?iEY4${QtYgEi!c4Mq>xG?u6B3ru$}!zQ<>-eb%O9D7Zg5XvM~gp31a#mr zJn4ZPSusm~@HKWG@5Ed1F1i7_kCu)@(X{MyJJ-{$((JkFP>{B3=?a!3dDsN-Fo6$t zkU?I&OGt*ZWJ8r$bv&|b(UuZ$mH)s5^@j`RG$^s#^hh4$sjhbOia33;x)Ut1%h-k} zh8awkQtafYB$SUN+2d_CSj!VN7ER;_)+C3x#`%*PlrEcwwzONGd)if+JzL!=mYL_G zZK=avj-hAzhuWZ~#3XAWOP1HmoD`E00$0y!Pxg>{@Vt&-iNMs>nhJz7vrt2tgvi4nR;(ZaR?U`p3CIS=+2EH zV8p?4UW2R)N_bcu?P*tO_Cj@6!ZPc-F^RKr49X1#t5%F~?`CSF>)D8+snxv;+DGw} zX0KFdW-0AO2kZ%uBax(xO`r`ojy*PRE@9kromVu7J&``z+$&1;w5v3Gr8*-@dK%6X zW$d^y0X@!Q5_2&?3o&dNBqki=IVRwD$c#bbS=DHi zOZR70Y1PsYx#}dLRWxllRhfI*Rhqq4-Ds96imLvfFeIQ9lMD$QQ3ZYaw}&rRkXaLr2> zHDH>GrY1+BP*1x`vsbD^SB)&Mgr!vprCgI%-1aCpbxGRuiMuP>%WQB9${@x#mYUi_ zY_eGPNcvusNm4t?lS-u~?o0_btYPijmFQwR6s942WE16 zDxp@VxxA1qLy9c;rGpMhAr7whuBY9OX0JQE%$*s=GBCR&?a;KN-8Y8OfPoO#NU6I+ z(x;;GPeQp_4g<9;FnNAO`?b9S-j9bzr9{N=voI}UQH=1$C@HGZl=sS%CX{4 ztld#g6#GI`#g297eh5%Uxueh8m&)nYQLar(yfek-8>3P>=x0zMQGO%Jju)9;OFt27 zcEM3LrFq*0NBK5lO@AF_Q<@iDpv|nKd=asIR~_ZPJ}X|`KA{XgI?5GcUGm9MUXpFX zO^w*2mhqje%7q@3{w7x?=RgC!5xG}?4@&<)$eyy(uQ|%;l88M>TA4Z(DDu$+d+x+20v=GaU!0TTKHryv1Q zM?SKj>?j-HQL-_Kr4c2Tz>ApZIe1JM`dAm~Y`Mp4%e@f_$yK|rTHq#2-Ak7FE=rPH zc;SR*IbKZip|_r=jOqg2_fc9$YavU>EIk!f4u78ICs9@y(O~WA(gSpNHZu-ZO`Rn> ztvO00QZTVD@*INQ}&i~OGPDMY`v5cyoKi(S}$tb zYgyJ^v09cvi5QV%VwqB@GyD=u$~RMva(77{c9Agxy72lYA=OCYD`ejeOJnb}A-qgf z;yBS9tZd(&Vqc0LA!wXI4_LwkYwYhEnQ zO`}n3C6Oa~_+VQFHUAVFzFVT0Ym=iS?eBOXaiyYK>C2WcKO?aXQdPPeqA~^`QG-^5 z9_QgvZMn;6?D6~J(%3OgycK2nfks*bLK5pX zvV2`wPC^+u?G0}z1WH4sW(>1rMBJPBD9eE;)!3_161~jKKnq+q^E9G-+Y~zxWrn9t zZUI7xJQ#)Khk8!HewCspVsjiqmhmn)k;@SM7&#RWpE|d+J#{Ev@h>3X|5vZ9Z6x^Rt z*12k3HR6EI5*?ikwSW$i!ZT)~C0rPGGLGRt1?2^p0xTdSdc$z-RQ$c=a$ZyhSyLeL zoXTOz)6|agw_p0+6gvT>wsIoI09AcDc{{nf!ViXJ-ASt@em#z3YWET9M0ym7S;2Nw z9Ifr^{a3!ma!6Eaaftj*cr8_hae+7xIKj=WwQCR1e#r-*_iHBo9{P%Yl`hd*@THQ!@@|DYK%U&9LuSEscHAG*(6`F-m~x zt~h}bOfbngCNl%xvB{!o++pnh8fvNem!PixOTy`jr3SpTvL@ zjCgv43y>D>=4DKC?3B$Y!1^rjoM4fYaujCd$YpXf>O^^1ydXhvDM_z;LyC_0TPtF? z;ryXb`rL_9!8qN7143pC87w?D=t8)NBL|`ph5`ieSHiLjL=~n9`2{nqsUIsA z3egk;t6W}TjD{-|dsLY3pwYu`S%!gR>m61YM_x)}3fFu5M{$lP{^RL^CyH!-3bRFd z%C28b_C%#k0WXy)KzqW7D(?5Q5+TW>E))P8jG=hjCLtFbWi8_h7Q_|(V0MCRLo#L^ zWfbg*1aZh3&iG|kOtzy^SUSp$WMi`!X(D}!IyA+0nJyS&IZ7PGB=5;%EuL6cf%al4 zkUc7&rN=SY^dXN-L6+O{w4-dwIP!uZkTx(cX*`!XwD?+yDlBj?stvELUswo_+#Z+A zqnPxyGM8=bG`s}Cq??cOTy*VzyxY4X&Y&wH@QBG_&zj`67ksTe)N*QpEuT2u`dT@a zgS9c>#YOofx!v2_C}rODsN5Cs-ir~TREsev>H3UU@!%_MmRyS7wyP^~%UlHl45WsC z8@zN?VlNi05+0RvpecmTHS8$Q={34E#M?IHtWCCGxRdbosI+Q1ww&<5GfuH|$T?&W zPL6UcqMh2AR#gDal@VUJlaIGGfjUY>wy7o^9Rtf8X-}}SiaN?nt|ya9EEe%6zzSoL zagnbd;53;|wJwj54*Y6n^0{8je8vwnx=+yfHFF zO3)lWk}c5TlZToXl^WPuyrOQ*vR-1#T&j&vS#o#_RJNQ;}1 zn9CatMUS71cvR-H%}ghb*eXKg)&n}GN+x`Ava^GgRn$?kfKNOIc)~Euq=hF;80ZQw zCagX>%0jw%nN18z!vqN@Tu6uw&&RK(`&yanH8&k*QfV}i3lx#6%)I_&L}Yr$Ig3L{ zB2GGvH?SU+Yf%Pl(V>)r`PSFUsLT3^NHNZ;w5<(5eXU%dAbBVODCcP8*%h)r!M+4# z=BCWBIaNrPKaR(QH;?{gB$IKCWSVIs&J8p@>nPXYr+E>dTw+w}_;RbG)I@y57Gtnz z9buW4N`Ep^=(a{CGR+dc?OB7(X)k2&gRi60VVGY%Do@LN#|<&u^2$^r7ce}l^iL7w zS}vAOXz72(lJ9WTv~PPB1E{*AqT3oBrK;UjV+uc|S-N=q8mhHPvK+q+#FV zD4*qKY8^QqvviauF~=8@Sd=ri7}J)Zgb6l3@c&E#M>u6Ewm|K04PSe}Je@F07wIu1 zsSsa5kNnsuP<&6P$Y8+;5Y*&6GTCl&lsp#mW2gc&)S(4AOC$g(vEgg1$p=bu>2Qw% z&P|63(D(;gK~Ir4Q#t8t6VWb>K3HjbV$lB+{9Tls$CV3rtjiM#t#({tv&$ BcY*)_ literal 0 HcmV?d00001 diff --git a/map/map.yaml b/map/map.yaml new file mode 100644 index 0000000..807ba0f --- /dev/null +++ b/map/map.yaml @@ -0,0 +1,7 @@ +image: map.pgm +mode: trinary +resolution: 0.05 +origin: [-9.84, -9.23, 0] +negate: 0 +occupied_thresh: 0.65 +free_thresh: 0.25 From 762a0ad2da302612bfb9d5edeec5019faa169de9 Mon Sep 17 00:00:00 2001 From: Alpaca-zip Date: Wed, 6 Dec 2023 16:29:02 +0900 Subject: [PATCH 04/12] add vgraph_planner node --- CMakeLists.txt | 2 +- launch/template.launch | 4 - launch/vgraph_planner.launch | 12 +++ map/vgraph.png | Bin 0 -> 7066 bytes scripts/py_template.py | 38 --------- scripts/vgraph_planner.py | 147 +++++++++++++++++++++++++++++++++++ 6 files changed, 160 insertions(+), 43 deletions(-) delete mode 100644 launch/template.launch create mode 100644 launch/vgraph_planner.launch create mode 100644 map/vgraph.png delete mode 100755 scripts/py_template.py create mode 100755 scripts/vgraph_planner.py diff --git a/CMakeLists.txt b/CMakeLists.txt index 87aa6a9..123c247 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -13,4 +13,4 @@ catkin_package(CATKIN_DEPENDS rospy) include_directories(include ${catkin_INCLUDE_DIRS}) # Install Python executables -install(PROGRAMS scripts/py_template.py DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION}) +install(PROGRAMS scripts/vgraph_planner.py DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION}) diff --git a/launch/template.launch b/launch/template.launch deleted file mode 100644 index 25b0e79..0000000 --- a/launch/template.launch +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/launch/vgraph_planner.launch b/launch/vgraph_planner.launch new file mode 100644 index 0000000..8b4ecb2 --- /dev/null +++ b/launch/vgraph_planner.launch @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/map/vgraph.png b/map/vgraph.png new file mode 100644 index 0000000000000000000000000000000000000000..fd47cfb0f33c20a3604500ea579af397c24e6292 GIT binary patch literal 7066 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 literal 0 HcmV?d00001 diff --git a/scripts/py_template.py b/scripts/py_template.py deleted file mode 100755 index f2aaff4..0000000 --- a/scripts/py_template.py +++ /dev/null @@ -1,38 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8 -*- - -# Copyright (C) 2023 template -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -import rospy - - -class TemplateNode: - def __init__(self): - # constructor - pass - - def __del__(self): - # destructor - pass - - -def main(): - rospy.init_node("py_template") - TemplateNode() - rospy.loginfo("From Python: Hello, world!!") - - -if __name__ == "__main__": - main() diff --git a/scripts/vgraph_planner.py b/scripts/vgraph_planner.py new file mode 100755 index 0000000..c3ad987 --- /dev/null +++ b/scripts/vgraph_planner.py @@ -0,0 +1,147 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- + +# Copyright (C) 2023 Alapaca-zip +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import rospy +from PIL import Image, ImageDraw + + +class VgraphPlannerNode: + def __init__(self): + self.pgm_file_path = rospy.get_param("~pgm_file", "map.pgm") + self.save_graph_file_path = rospy.get_param("~save_graph_file", "vgraph.png") + self.resolution = rospy.get_param("~resolution", 0.1) + self.start_point = rospy.get_param("~start_point", (200, 30)) + self.end_point = rospy.get_param("~end_point", (150, 370)) + up_scaled_image = self.change_image_resolution( + self.pgm_file_path, self.resolution + ) + corners = self.find_black_pixel_corners(up_scaled_image) + corners.append(self.start_point) + corners.append(self.end_point) + line_marked_image = self.draw_lines_between_corners(up_scaled_image, corners) + line_marked_image.save(self.save_graph_file_path) + + def __del__(self): + pass + + def change_image_resolution(self, image, resolution): + original_image = Image.open(image) + width = int(original_image.width * resolution) + height = int(original_image.height * resolution) + black_pixels = self.find_black_pixels(original_image) + down_scaled_image = original_image.resize((width, height), Image.NEAREST) + down_scaled_image = self.apply_black_pixels( + down_scaled_image, black_pixels, resolution + ) + up_scaled_image = down_scaled_image.resize(original_image.size, Image.NEAREST) + return up_scaled_image + + def find_black_pixels(self, image): + black_pixels = [] + for y in range(image.height): + for x in range(image.width): + if image.getpixel((x, y)) == 0: + black_pixels.append((x, y)) + return black_pixels + + def apply_black_pixels(self, image, black_pixels, scale): + for x, y in black_pixels: + scaled_x = int(x * scale) + scaled_y = int(y * scale) + if 0 <= scaled_x < image.width and 0 <= scaled_y < image.height: + image.putpixel((scaled_x, scaled_y), 0) + return image + + def find_black_pixel_corners(self, image): + corners = [] + for y in range(1, image.height - 1): + for x in range(1, image.width - 1): + if image.getpixel((x, y)) == 0: + black_neighbors = sum( + image.getpixel((j, i)) == 0 + for i in range(y - 1, y + 2) + for j in range(x - 1, x + 2) + if (i, j) != (y, x) + ) + if black_neighbors == 3: + corners.append((x, y)) + return corners + + def draw_lines_between_corners(self, image, corners): + rgb_image = image.convert("RGB") + draw = ImageDraw.Draw(rgb_image) + for i in range(len(corners)): + for j in range(i + 1, len(corners)): + if not self.check_line_crossing(image, corners[i], corners[j]): + draw.line([corners[i], corners[j]], fill=(255, 0, 0), width=1) + return rgb_image + + def check_line_crossing(self, image, start, end): + x0, y0 = start + x1, y1 = end + dx = abs(x1 - x0) + dy = abs(y1 - y0) + x, y = x0, y0 + sx = -1 if x0 > x1 else 1 + sy = -1 if y0 > y1 else 1 + err = dx - dy + not_all_black = False + not_all_white = False + is_horizontal_or_vertical = x0 == x1 or y0 == y1 + while True: + if (x, y) != start and (x, y) != end: + pixel = image.getpixel((x, y)) + if pixel != 0: + not_all_black = True + if pixel != 254: + not_all_white = True + if is_horizontal_or_vertical: + if x0 == x1: + left_pixel = image.getpixel((x - 1, y)) if x > 0 else 0 + right_pixel = ( + image.getpixel((x + 1, y)) if x < image.width - 1 else 0 + ) + if left_pixel != 254 and right_pixel != 254: + not_all_black = True + else: + top_pixel = image.getpixel((x, y - 1)) if y > 0 else 0 + bottom_pixel = ( + image.getpixel((x, y + 1)) if y < image.height - 1 else 0 + ) + if top_pixel != 254 and bottom_pixel != 254: + not_all_black = True + if x == x1 and y == y1: + break + e2 = 2 * err + if e2 > -dy: + err -= dy + x += sx + if e2 < dx: + err += dx + y += sy + if not is_horizontal_or_vertical: + not_all_black = True + return not_all_black and not_all_white + + +def main(): + rospy.init_node("vgraph_planner_node") + VgraphPlannerNode() + + +if __name__ == "__main__": + main() From fad821e87d85bbab86c1ab27372f45a9213b6d43 Mon Sep 17 00:00:00 2001 From: Alpaca-zip Date: Tue, 12 Dec 2023 21:36:19 +0900 Subject: [PATCH 05/12] add check for surrounding pixels in line crossing function --- map/vgraph.png | Bin 7066 -> 7794 bytes scripts/vgraph_planner.py | 12 +++++++++++- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/map/vgraph.png b/map/vgraph.png index fd47cfb0f33c20a3604500ea579af397c24e6292..79eca65f2044751aeee91f4fc4d921d81ab24740 100644 GIT binary patch literal 7794 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 diff --git a/scripts/vgraph_planner.py b/scripts/vgraph_planner.py index c3ad987..2078d5e 100755 --- a/scripts/vgraph_planner.py +++ b/scripts/vgraph_planner.py @@ -91,6 +91,8 @@ def draw_lines_between_corners(self, image, corners): return rgb_image def check_line_crossing(self, image, start, end): + start_pixels = self.get_surrounding_pixels(start) + end_pixels = self.get_surrounding_pixels(end) x0, y0 = start x1, y1 = end dx = abs(x1 - x0) @@ -103,7 +105,7 @@ def check_line_crossing(self, image, start, end): not_all_white = False is_horizontal_or_vertical = x0 == x1 or y0 == y1 while True: - if (x, y) != start and (x, y) != end: + if (x, y) not in start_pixels and (x, y) not in end_pixels: pixel = image.getpixel((x, y)) if pixel != 0: not_all_black = True @@ -136,6 +138,14 @@ def check_line_crossing(self, image, start, end): if not is_horizontal_or_vertical: not_all_black = True return not_all_black and not_all_white + + def get_surrounding_pixels(self, point): + x, y = point + pixels = [] + for i in range(-1, 2): + for j in range(-1, 2): + pixels.append((x + i, y + j)) + return pixels def main(): From b3043768c5e18ae25b8e31db2e63440f90e62c48 Mon Sep 17 00:00:00 2001 From: Alpaca-zip Date: Wed, 13 Dec 2023 12:50:01 +0900 Subject: [PATCH 06/12] apply black format --- scripts/vgraph_planner.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/vgraph_planner.py b/scripts/vgraph_planner.py index 2078d5e..fd60dca 100755 --- a/scripts/vgraph_planner.py +++ b/scripts/vgraph_planner.py @@ -138,7 +138,7 @@ def check_line_crossing(self, image, start, end): if not is_horizontal_or_vertical: not_all_black = True return not_all_black and not_all_white - + def get_surrounding_pixels(self, point): x, y = point pixels = [] From bb2d51b6990e04309e41d53f58037497d3cdc74a Mon Sep 17 00:00:00 2001 From: Alpaca-zip Date: Wed, 13 Dec 2023 12:56:02 +0900 Subject: [PATCH 07/12] apply catkin_lint --- CMakeLists.txt | 3 --- 1 file changed, 3 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 123c247..a6edbf1 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -9,8 +9,5 @@ find_package(catkin REQUIRED COMPONENTS rospy) # Declare a catkin package catkin_package(CATKIN_DEPENDS rospy) -# Specify additional locations of header files -include_directories(include ${catkin_INCLUDE_DIRS}) - # Install Python executables install(PROGRAMS scripts/vgraph_planner.py DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION}) From a01b5496d6325002a39e2afab1d92fb74b7474e4 Mon Sep 17 00:00:00 2001 From: Alpaca-zip Date: Wed, 13 Dec 2023 13:02:16 +0900 Subject: [PATCH 08/12] fix dependency for pillow --- .github/workflows/ci.yml | 8 ++++---- requirements.txt | 1 + 2 files changed, 5 insertions(+), 4 deletions(-) create mode 100644 requirements.txt diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index c0595ef..2955137 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -27,7 +27,7 @@ jobs: 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 ****' + BEFORE_BUILD_TARGET_WORKSPACE: 'apt update -q && python3 -m pip install -q -r requirements.txt' PYLINT_ARGS: '--errors-only' PYLINT_CHECK: true @@ -41,7 +41,7 @@ jobs: 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 ****' + BEFORE_BUILD_TARGET_WORKSPACE: 'apt update -q && python3 -m pip install -q -r requirements.txt' CATKIN_LINT: true build_check: @@ -54,12 +54,12 @@ jobs: - 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 ****' + BEFORE_BUILD_TARGET_WORKSPACE: 'apt update -q && python3 -m pip install -q -r requirements.txt' 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 ****' + BEFORE_BUILD_TARGET_WORKSPACE: 'apt update -q && python3 -m pip install -q -r requirements.txt' IMMEDIATE_TEST_OUTPUT: true steps: diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..7e2fba5 --- /dev/null +++ b/requirements.txt @@ -0,0 +1 @@ +Pillow From f025b18a52dbac2a85d7d290490087d3ec770d38 Mon Sep 17 00:00:00 2001 From: Alpaca-zip Date: Wed, 13 Dec 2023 13:32:02 +0900 Subject: [PATCH 09/12] Update Pillow version in requirements.txt --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index 7e2fba5..2fec29c 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1 +1 @@ -Pillow +Pillow == 10.1.0 From f80a9caea4934fc59a38466103780c70f7649c02 Mon Sep 17 00:00:00 2001 From: Alpaca-zip Date: Wed, 13 Dec 2023 13:39:08 +0900 Subject: [PATCH 10/12] fix image resizing method --- scripts/vgraph_planner.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/scripts/vgraph_planner.py b/scripts/vgraph_planner.py index fd60dca..5aff764 100755 --- a/scripts/vgraph_planner.py +++ b/scripts/vgraph_planner.py @@ -43,11 +43,11 @@ def change_image_resolution(self, image, resolution): width = int(original_image.width * resolution) height = int(original_image.height * resolution) black_pixels = self.find_black_pixels(original_image) - down_scaled_image = original_image.resize((width, height), Image.NEAREST) + down_scaled_image = original_image.resize((width, height), Image.Resampling.NEAREST) down_scaled_image = self.apply_black_pixels( down_scaled_image, black_pixels, resolution ) - up_scaled_image = down_scaled_image.resize(original_image.size, Image.NEAREST) + up_scaled_image = down_scaled_image.resize(original_image.size, Image.Resampling.NEAREST) return up_scaled_image def find_black_pixels(self, image): From 8aa19b5e812f8892af30f3495314cea8ae838b4d Mon Sep 17 00:00:00 2001 From: Alpaca-zip Date: Wed, 13 Dec 2023 13:54:55 +0900 Subject: [PATCH 11/12] apply black format --- scripts/vgraph_planner.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/scripts/vgraph_planner.py b/scripts/vgraph_planner.py index 5aff764..86d72a1 100755 --- a/scripts/vgraph_planner.py +++ b/scripts/vgraph_planner.py @@ -43,11 +43,15 @@ def change_image_resolution(self, image, resolution): width = int(original_image.width * resolution) height = int(original_image.height * resolution) black_pixels = self.find_black_pixels(original_image) - down_scaled_image = original_image.resize((width, height), Image.Resampling.NEAREST) + down_scaled_image = original_image.resize( + (width, height), Image.Resampling.NEAREST + ) down_scaled_image = self.apply_black_pixels( down_scaled_image, black_pixels, resolution ) - up_scaled_image = down_scaled_image.resize(original_image.size, Image.Resampling.NEAREST) + up_scaled_image = down_scaled_image.resize( + original_image.size, Image.Resampling.NEAREST + ) return up_scaled_image def find_black_pixels(self, image): From f8f9334023d51f02aaff16218a5cb36f179f2a74 Mon Sep 17 00:00:00 2001 From: Alpaca-zip Date: Wed, 13 Dec 2023 13:56:45 +0900 Subject: [PATCH 12/12] Update Pillow version in requirements.txt --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index 2fec29c..7e2fba5 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1 +1 @@ -Pillow == 10.1.0 +Pillow