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

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は通った.

コメントを残す

メールアドレスが公開されることはありません。

*