cvl-robot's diary

研究ノート メモメモ https://github.com/dotchang/

Open3Dに寄稿する方法とマナーを調べる

(編集中)
Open3Dのソースコードは、githubで管理されています。普段、仕事ではほとんど必要ないので、githubはgit cloneして便利に人のソースコードを使わせてもらうか、メモ代わりにGistにコードを張り付けるだけで、あまりちゃんと使ったことがありません。c++のTutorialをCotributeしたら?と声をかけてもらったので、ちゃんとその方法とマナーを調べたいと思います。

Open3DのContributeの仕方マニュアル

Contributing to Open3D — Open3D 0.1 dev documentation
まずはこれにざっと目を通します。

issues and pull request system

masterブランチは安定板のOpen3Dのためだけに使われていて、全てのソースコードの変更はissuesとpull requestの仕組みを通して管理されていて、次の4つの手順に寄るのだそうです。よく分かってないので、殆ど全訳になりますが読んでいきましょう。

1. Issueを開いて、リクエストやバグの報告をする。
Issues · IntelVCL/Open3D · GitHub
2. 新しいブランチやリポジトリのフォークを用意して、変更を加えて、pull requestを送信します。
Pull Requests · IntelVCL/Open3D · GitHub
3. Pull Requestでコードの変更が検査され、議論されます。変更は、Issueで提起され、議論を通して育てられます。
4. 管理者の一人がpull requestをmasterブランチにマージします。

pull requestってよく聴くけど使わないのでよく分かってない。あとで良く調べることにして、とりあえず続けましょう。
ざっくりわかることは、プロジェクトに参加したい人はまず1と2をやれば良いということですね。ソースコードの管理は、Adminsがちゃんと面倒みているので、いきなり何か変なことしてしまって壊したりする心配とかは不要で、レベルの低いソースコードを書いても、ちゃんとブラッシュアップしてもらえる仕組みがあって安心だということですね。

Maintain sanity of the project

buildを止めてしまうことが無いように、Windows, Mac, Linuxの3つの環境でテストしなさい、とあります。困ったな、Macの開発環境が無いぞ?

  • c++環境では、c++11を使うようにして、c++14, C++17はまだ一部のコンパイラで安定しないから使わないこと。
  • Pythonは2.7系と3.x系の両方で動作を確認すること

Coding style

コードの可読性を保つために、コーディングスタイルを保つことは重要な要素です。
1. コード自体がドキュメントと思え
2. 既存のコードとの一貫性を保て
3. 常識に従え

基本的には、ちょっとアレンジしたGoogle Coding Styleに従う。
Google C++ Style Guide

  • インデントにはtabを使う。空白4つ分。強制改行にはインデント2つ分。(一行80文字の制限)
  • ヘッダーガードには#pragma onceを使う
  • 全てのOpen3Dメンバーはthreeネームスペースの中に入れること。
  • 裸のポインタを使わずに、std::shared_ptrやstd::unique_ptrを使うこと。
  • c++11の機能を推奨

その他、現代的なC++コーディングスタイルは次の資料を参考にすること。
CppCoreGuidelines/CppCoreGuidelines.md at master · isocpp/CppCoreGuidelines · GitHub

で、分からないところの整理。

そんなに難しくないので、概ね分かったような気になっていますが、根本的にgitの使い方が分かりません。結局pull requestをするまでどう準備してどう操作すればいいものやら?また明日調べましょう。

How to use github

0. Sign up for GIthub and log-in.
1. Go to https://github.com/IntelVCL/Open3D, and push [fork] button.
2. git clone https://github.com/IntelVCL/Open3D
3. git config user.name "Your name"
4. git config user.email "your@email.com"
5. Edit your source code and put it on your cloned directory.
6. git add "your source code"
7. git commit
8. git push

Open3Dをライブラリとして使い、自分の独立したプロジェクトとしてプログラムを書きたいときのCMakeサンプル

CMakeの正しい書き方がわからない・・・
今、公式にmake installやfind cmakeを準備中だそうですので、急がないのであればそれを待つことをお勧めします。
とりあえず、Ubuntu環境でひとつのチュートリアルをビルドするためのCMakeファイルの例。わからないことだらけ。

  • どうすれば、Open3Dのルートを見つけられる?
  • libjsoncppの謎の挙動。nativeインストールしたせい?
  • libpng12じゃなくてlibpng16を自動で見つける方法
  • 様々な環境でのテストの方法
cmake_minimum_required(VERSION 3.0.0)

# Please set a path to Open3D root
set(Open3D_DIR "/home/cvl/workspace/Open3D")
set(Open3D_SOURCE_DIR "${Open3D_DIR}/src")
set(Open3D_LIBRARY_DIR "${Open3D_DIR}/build/lib/")

# Please set a project name
set(PROJECT_NAME "ColoredPointRegistration")
set(EXECUTABLE_OUTPUT_PATH "${Open3D_DIR}/build/bin/Tutorial")

project(${PROJECT_NAME})
add_executable(${PROJECT_NAME} "${PROJECT_NAME}.cpp")
target_compile_features(${PROJECT_NAME} PRIVATE cxx_range_for)
find_package(PkgConfig REQUIRED)

# set include directories
include_directories(${Open3D_SOURCE_DIR})
pkg_check_modules(EIGEN3 eigen3>=3.2.7)
include_directories(${EIGEN3_INCLUDE_DIRS})

# link dynamic libraries
pkg_check_modules(JSONCPP jsoncpp)
find_package(OpenGL)
find_package(GLEW REQUIRED)
find_package(glfw3)
include(FindJPEG)
target_link_libraries(${PROJECT_NAME} ${JSONCPP_LIBRARIES})
target_link_libraries(${PROJECT_NAME} ${OPENGL_gl_LIBRARY})
target_link_libraries(${PROJECT_NAME} ${JSONCPP_LIBRARIES})
target_link_libraries(${PROJECT_NAME} ${GLEW_LIBRARIES})
target_link_libraries(${PROJECT_NAME} ${GLFW3_LIBRARY})
target_link_libraries(${PROJECT_NAME} ${JPEG_LIBRARY})

# link static libraries
find_library(Open3D_CORE NAMES libCore.a PATHS ${Open3D_LIBRARY_DIR})
find_library(Open3D_IO NAMES libIO.a PATHS ${Open3D_LIBRARY_DIR})
find_library(Open3D_VISUALIZATION libVisualization.a PATHS ${Open3D_LIBRARY_DIR})
find_library(LIBPNG NAMES libpng.a PATHS ${Open3D_LIBRARY_DIR})
find_library(LIBZ NAMES libzlib.a PATHS ${Open3D_LIBRARY_DIR})
find_library(LIBTINYFILEDIALOGS NAMES libtinyfiledialogs.a PATHS ${Open3D_LIBRARY_DIR})
find_library(LIBJSONCPP NAMES libjsoncpp.a PATHS ${Open3D_LIBRARY_DIR})
target_link_libraries(${PROJECT_NAME} ${Open3D_CORE})
target_link_libraries(${PROJECT_NAME} ${Open3D_IO})
target_link_libraries(${PROJECT_NAME} ${Open3D_VISUALIZATION})
target_link_libraries(${PROJECT_NAME} "${Open3D_LIBRARY_DIR}/libpng.a") # Force libpng16
target_link_libraries(${PROJECT_NAME} ${LIBZ})
target_link_libraries(${PROJECT_NAME} ${LIBTINYFILEDIALOGS})
target_link_libraries(${PROJECT_NAME} ${LIBJSONCPP})

# OpenMP settings
find_package(OpenMP)
if (OPENMP_FOUND) 
    set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${OpenMP_C_FLAGS}")
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${OpenMP_CXX_FLAGS}")
endif()