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は通った.
コメントを残す