BTR2022の設定 の次の話のメモ
gazeboを使えるようにしてみたいなぁ.
cd ~/git git clone https://github.com/robocup-logistics/gazebo-rcll cd gazebo-rcll # CmakeLists.txt にBoostの情報を追加. echo "find_package(Boost REQUIRED COMPONENTS system program_options filesystem thread)" >> CMakeLists.txt [bash] cmake -B build -DCMAKE_BUILD_TYPE=RelWithDebInfo cmake --build build
うーむ.エラーが出ますねぇ.
/home/ryukoku/git/gazebo-rcll/plugins/src/plugins/mps/mps.cpp:57:97: required from here /usr/include/c++/9/ext/new_allocator.h:146:4: error: invalid new-expression of abstract class type ‘spdlog::sinks::basic_file_sink<std::mutex>’ 146 | { ::new((void *)__p) _Up(std::forward<_Args>(__args)...); } | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Compile error on implementing custom sink #1545を見ると,Missing public keyword とあるので,
spdlog の頭にpublic をつけてみたら,そこのエラーは消えました.
57行目 - std::make_shared<spdlog::sinks::basic_file_sink_mt>(fmt::format("gazebo-{}.log", name_), true)); + std::make_shared<public spdlog::sinks::basic_file_sink_mt>(fmt::format("gazebo-{}.log", name_), true));
次のエラーは,
/home/ryukoku/git/gazebo-rcll/plugins/src/plugins/mps/mps.cpp:370:3: note: in expansion of macro ‘SPDLOG_LOGGER_INFO’ 370 | SPDLOG_LOGGER_INFO(logger, "Workpiece {} no longer in input", wp_in_input_->GetName()); | ^~~~~~~~~~~~~~~~~~ /home/ryukoku/git/gazebo-rcll/_deps/spdlog-src/include/spdlog/spdlog.h:291:137:error: no matching function for call to ‘spdlog::logger::log(spdlog::source_loc, spdlog::level::level_enum, const char [33], std::string)’ 291 | _loc{__FILE__, __LINE__, SPDLOG_FUNCTION}, level, __VA_ARGS__) | ^
対応する関数がないってことだけど,同じような呼び出しはここよりも前(例えば367行目)にもあるんだけどなぁ….
何が違うんだろう.
どうせLogだから,なくてもええかと思ってコメントアウトしたら,今度は367行目もエラーになっていた….えへへ.
頭から見ていくことにしよう.
from /home/ryukoku/git/gazebo-rcll/plugins/src/plugins/mps/mps.cpp:26: /home/ryukoku/git/gazebo-rcll/_deps/spdlog-src/include/spdlog/fmt/bundled/core.h:67: error: "FMT_HAS_FEATURE" redefined [-Werror] 67 | # define FMT_HAS_FEATURE(x) __has_feature(x) |
redefined のエラーは気色悪いので,消しておきましょう.
Makefileにて
36行目 - add_compile_options(-g -Wall -Werror) + add_compile_options(-g -Wall -Wno-macro-redefined)
次は,
from /home/ryukoku/git/gazebo-rcll/plugins/src/plugins/mps/mps.cpp:21: /usr/include/ignition/math6/ignition/math/Plane.hh:133:20: error: ‘optional’ in namespace ‘std’ does not name a template type 133 | public: std::optional<Vector3<T>> Intersection( | ^~~~~~~~ /usr/include/ignition/math6/ignition/math/Plane.hh:133:15: note: ‘std::optional’ is only available from C++17 onwards 133 | public: std::optional<Vector3<T>> Intersection( |
C++17からってことなので,コンパイルオプションに追加しましょうか.
Makefileにて
36行目 - add_compile_options(-g -Wall -Werror) + add_compile_options(-g -Wall -Wno-macro-redefined -std=c++17)
次は,
from /home/ryukoku/git/gazebo-rcll/plugins/src/plugins/mps/mps.cpp:26: /home/ryukoku/git/gazebo-rcll/_deps/spdlog-src/include/spdlog/details/null_mutex.h:12:8: error: redefinition of ‘struct spdlog::details::null_mutex’ 12 | struct null_mutex
再定義しちゃっているそうな.
もう面倒くさいから,警告を全部無視しましょう.
Makefileにて
36行目 - add_compile_options(-g -Wall -Werror) + add_compile_options(-g -Werror=stringop-truncation -fpermissive -std=c++17)
In file included from /home/ryukoku/git/gazebo-rcll/plugins/src/plugins/mps/mps.cpp:21: /home/ryukoku/git/gazebo-rcll/plugins/src/plugins/mps/mps.h:30:10: fatal error:llsf_msgs/MachineCommands.pb.h: No such file or directory 30 | #include <llsf_msgs/MachineCommands.pb.h> | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ compilation terminated.
あ,先にmakeしないといけない奴だ.
cd ~git/gazebo-rcll/plugins/src/libs/llsf_msgs make
gazebo-rcll/.circleci/config.yamlにDockerの情報があったのでそれを参考にしてみます.
まず,gzeboのパッケージを入れていなかったっぽい….
sudo apt-get -y install libgazebo9-dev libgazebo9 gazebo9-common
あと,パッケージの依存関係により使っていない物が増えてきたので削除.
sudo apt-get -y autoremove
エラーの項目が基本的にはspdlogなので,そのパッケージを入れてみる.
sudo apt-get install libspdlog-dev
—-
/usr/local/include/opc/spdlog/logger.h:76:32: note: template argument deduction/substitution failed:
ん.spdlog のヘッダファイルが,opcってところにあるぞ….
root@BabyTgers-NUC7i7BNH:/usr/local/include/opc# ls common spdlog ua
あ,OPC-UAのときに,一緒にインストールしてしまっているっぽい.
およよ.
これが悪さをしているのかも.
opcua のソースのMakefile を見てみたけど,installの項目はあるのにuninstallの項目がない….
およよよよ.
どうやら,ヘッダファイルだけを扱っている(ファイルをコピーしているだけ)模様.
ちょっと強引だけど,それらを削除してみます.
# sudo rm -rf /usr/include/spdlog ← こっちは,libspdlog-dev のファイルっぽい. sudo rm -rf /usr/local/include/opc/spdlog
で,gazebo-rcll ccmakeから順番にしてみたけど,cmake . にて,
-- Fetching spdlog -- Build spdlog: 1.10.0 -- Build type: Release -- Found FreeOpcUa on system
みつけちゃってる….とほほ.
あー.MPS.cppでOPCUAを呼び出すから,そこからopcのspdlogにいっちゃうのか….
とすると,
sudo -l /usr/include/spdlog /usr/local/include/opc
で,ごまかせるかなぁ.
[ 74%] Building CXX object plugins/src/plugins/mps/CMakeFiles/mps.dir/mps.cpp.o /home/ryukoku/git/gazebo-rcll/plugins/src/plugins/mps/mps.cpp: In constructor ‘gazebo::Mps::Mps(gazebo::physics::ModelPtr, sdf::ElementPtr)’: /home/ryukoku/git/gazebo-rcll/plugins/src/plugins/mps/mps.cpp:57:9: error: parse error in template argument list 57 | std::make_shared<public spdlog::sinks::basic_file_sink_mt>(fmt::format("gazebo-{}.log", name_), true)); | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ /home/ryukoku/git/gazebo-rcll/plugins/src/plugins/mps/mps.cpp:57:104: error: no matching function for call to ‘make_shared<<expression error> >(std::__cxx11::basic_string<char>, bool)’ 57 | s::basic_file_sink_mt>(fmt::format("gazebo-{}.log", name_), true)); |
おしい.ごまかせなかった.
仕方が無い.ソースから入れてみるか….
sudo apt-get remove libspdlog-dev cd ~/git git clone https://github.com/gabime/spdlog cd spdlog ccmake . cmake . make sudo make install sudo ldconfig
ん.aptとバージョンが同じような….
ryukoku@BabyTgers-NUC7i7BNH:~/git/spdlog$ cmake . -- Build spdlog: 1.10.0 -- Build type: Release -- Generating example(s) -- Generating install -- Configuring done -- Generating done -- Build files have been written to: /home/ryukoku/git/spdlog
ln -s /usr/local/include/spdlog /usr/local/include/opc/
やっぱり同じ所(mps.cpp)でエラーが出るなぁ….
rpms/spdlogを見ると,Fedora 36-37のspdlogは1.10.0だけど,Fedora 34の時は,spdlog-1.8.5のようだ.
そこまでバージョンを落としてみようかなぁ.
cd ~/git/spdlog git checkout v1.8.5 ccmake . cmake. make
/usr/include/c++/9/bits/shared_ptr.h:714:5: note: candidate: ‘template<class _Tp, class ... _Args> std::shared_ptr<_Tp> std::make_shared(_Args&& ...)’ 714 | make_shared(_Args&&... __args) | ^~~~~~~~~~~ /usr/include/c++/9/bits/shared_ptr.h:714:5: note: template argument deduction/substitution failed:
違うなぁ.spdlog の問題ではなく,make_sharedの問題なのかなぁ.
以前のファイルが邪魔をしているのかも知れないので,spdlogとgazebo-rcllを消して,再度作業.
spdlog は1.8.5に変更.gazebo-rcllはCMakeLists.txtにboostの情報を追加.
単なるmakeだとエラーが出るので,
cmake -B build -DCMAKE_BUILD_TYPE=RelWithDebInfo cmake --build build
でコンパイル.
[ 76%] Building CXX object plugins/src/plugins/mps/CMakeFiles/mps.dir/ring_station.cpp.o /home/ryukoku/git/gazebo-rcll/plugins/src/plugins/mps/ring_station.cpp: In member function ‘virtual void gazebo::RingStation::process_command_in()’: /home/ryukoku/git/gazebo-rcll/plugins/src/plugins/mps/ring_station.cpp:75:12: error: ‘color’ may be used uninitialized in this function [-Werror=maybe-uninitialized] 75 | mount_ring(color); | ~~~~~~~~~~^~~~~~~ cc1plus: all warnings being treated as errors
お,次のエラーに進んだ感じかも.
color が初期化せずに使っている状態?
~/git/gazebo-rcll/plugins/src/libs/gazsim_msgs/WorkpieceCommand.proto を見るとColorは,
// The possible colors of the ring enum Color{ RED = 0; GREEN = 1; BLUE = 2; GREY = 3; BLACK = 4; YELLOW = 5; ORANGE = 6; SILVER = 7; NONE = 8; }
となっているので,初期化時にNONEを代入しとけば良いのでは?
56行目を以下のように修正.
void RingStation::process_command_in() { ... - gazsim_msgs::Color color; + gazsim_msgs::Color color = gazsim_msgs::Color::NONE; ... mount_ring(color);
としてみましょう.
[ 76%] Building CXX object plugins/src/plugins/mps/CMakeFiles/mps.dir/storage_station.cpp.o [ 77%] Linking CXX shared library ../../../libmps.so /usr/bin/ld: /usr/local/lib/libspdlog.a(spdlog.cpp.o): relocation R_X86_64_TPOFF32 against `_ZGVZN6spdlog7details2os9thread_idEvE3tid' can not be used when making a shared object; recompile with -fPIC collect2: error: ld returned 1 exit status
やっぱりエラー….
あ,これって-fPICのオプションは,gazebo-rcllに対してではなく,spdlogに対して付与が必要なのか….
spdlog/CMakeLists.txt にadd_compile_options(-fPIC)を追加.
# --------------------------------------------------------------------------------------- # Set default build to release # --------------------------------------------------------------------------------------- if(NOT CMAKE_BUILD_TYPE) set(CMAKE_BUILD_TYPE "Release" CACHE STRING "Choose Release or Debug" FORCE) endif() # # for fPIC # add_compile_options(-fPIC)
よし.通った.
gazebo-rcllに対しては,やっぱりg++17のオプションが必要だったっぽい.
add_compile_options(-g -Wall -WError -std=c++17)
肝心のgazeboコマンドが入っていなかった….
sudo apt-get install gazebo9
で,gazebo-rosも必要とのこと.
sudo apt-get install ros-noetic-gazebo-ros
そしたら,gazebo/gazebo.hh が見つからないと言われるので,fatal error: gazebo/gazebo.hh: No such file or directoryを参考にCMakeLists.txtに以下を追加.
include_directories(${GAZEBO_INCLUDE_DIRS})
とりあえず,makeは通った.
コメントを残す