-
Notifications
You must be signed in to change notification settings - Fork 13
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
include/lib の構造(いつかやりたい) #434
Comments
まずは、制御側の冗長コードを外します。 |
冗長コード外しました。 |
制御側の物理依存コードは以下あたりですね。
M_PIは標準ライブラリ cmath をインクルードして解決するように変更します。 |
M_PI は確か、森さんが _osdep.h ファイルを作って切り出したんだと思う。確か、ubuntu でビルド通らなかったのを直してくれたんだと思う。このヘッダーなければないで嬉しい。 |
M_PIですが、Windowsでもハマってます。。 ChatGPTに聞いたところこうしないとダメみたいっす。
|
コンパイル依存は結構小さいのね。 最小リンク依存はどうでしょう。 最小実行形式が、他の関数も含むなら、どちらにしても全体依存なので、今の翻訳単位でライブラリ.aのリンクで良いと思う。 |
そうですね。 依存しているのは、 |
最小実行形式は何になる? |
制御側が依存しているのは、以下のコードだけなので、ここだけを cコードとして切り出して、 /* for generic vectors. use the meaningful aliases below */
VectorType body_vector_from_ground(
const VectorType& ground,
const EulerType& angle)
{
using std::sin; using std::cos;
const auto
c_phi = cos(angle.phi), s_phi = sin(angle.phi),
c_theta = cos(angle.theta), s_theta = sin(angle.theta),
c_psi = cos(angle.psi), s_psi = sin(angle.psi);
const auto [x_e, y_e, z_e] = ground;
/*
* See eq.(1.69), inverse of (1.124) in Nonami's book.
* See also https://mtkbirdman.com/flight-dynamics-body-axes-system
* for the transformation equations.
*/
/*****************************************************************/
double
x = (c_theta * c_psi) * x_e
+ (c_theta * s_psi) * y_e
- (s_theta) * z_e;
double
y = (s_phi * s_theta * c_psi - c_phi * s_psi) * x_e
+ (s_phi * s_theta * s_psi + c_phi * c_psi) * y_e
+ (s_phi * c_theta) * z_e;
double
z = (c_phi * s_theta * c_psi + s_phi * s_psi) * x_e
+ (c_phi * s_theta * s_psi - s_phi * c_psi) * y_e
+ (c_phi * c_theta) * z_e;
/*****************************************************************/
return {x, y, z};
} |
VectoryTypeとEulerTypeは、drone_physics.hppに定義あるのですが、 |
自分の意見をまとめると、こうですかね。
|
最小実行形式( main を含むもの。テスト実行形式も含む)として physics 全体を含まないものがあれば、切り出すのはありかなと思っての質問です。どれだけコンパイル時依存を減らしても、実行時に全体依存してしまうなら、細かくしてもしょうがないかな、、、、と思うのです。 森さんの意見、了解しました。 大きめのコードを(テンプレートでない限り).hpp に置くのは悪手(すべての場所で展開されていまうから)。これをやるとすると、そのヘッダは1つの .cpp にのみにインクルードすることだが、もしそうなら、その cpp に書くのがよい。そして、もしそうするのなら、最小実行形式で libdrone_physics.a/so をリンクしてしまえばいのでは? あるいは、今の変換コードを含む .hpp を .hpp に宣言を残して実装を .cpp に追い出し、変換部分は drone_physics への呼び出しとしては? |
少し考えて、
の3つに階層化して、下が上に依存するようにして、drone_frames のみを制御で使ってもらうことを可能にする。 理由。
note: でも先の議論で、drone_frames は drone_control.so には含めず、main を持つ側がリンクする(ことができれば)それはそうしたい。 |
$(PRJ_ROOT)/include, /lib に各サブモジュールのライブラリとパブリックヘッダを集める件ですが、「何がパブリックヘッダで何がパブリックライブラリか」を集中管理せず、各サブモジュールの MakeList.txt に任せてしまってはどうでしょう?
すると include, lib にコピーします。最上位では、各サブディレクトリを make, make test, make publish を呼び出す。 set(HAKONIWA_PUBLIC_HEADER_DIR ${CMAKE_SOURCE_DIR}/../include)
set(HAKONIWA_PUBLIC_LIB_DIR ${CMAKE_SOURCE_DIR}/../lib)
set(PUBLIC_HEADERS
drone_frames.hpp
drone_physics.hpp
rotor_physics.hpp
body_physics.hpp
drone_physics_c.h
)
add_custom_target(
publish
COMMAND ${CMAKE_COMMAND} -E copy ${PUBLIC_HEADERS} "${HAKONIWA_PUBLIC_HEADER_DIR}"
COMMAND ${CMAKE_COMMAND} -E copy $<TARGET_FILE:drone_physics> $<TARGET_FILE:drone_physics_c> "${HAKONIWA_PUBLIC_LIB_DIR}"
) |
おー、それです! |
複数サブプロジェクトのリポジトリのディレクトリ構成。
この構造は、UNIX の /usr/local/include /usr/local/lib と同じ。
The text was updated successfully, but these errors were encountered: