sakusakupannda
@sakusakupannda

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

ROS サービス通信について質問

解決したいこと

ROSをC++でやっていて,サービス通信のところで詰まったので助けてほしいです.
分からない事が3つあって,
1.pythonでいうrospy.wait_for_serviceをc++での書き方.
2.作ったサービスの呼び出し方.
3.CMakeLists.txtでのサービスを使用したノードの登録の仕方.

1. wait_for_service

bool ros::service::waitForService(const std::string& motor_on, int 32_t timeout)
        {
                return waitForService(パッケージ名, ros::Duration(timeout / 1000.0));
        }

上のコードの様にwait_for_serviceを書いているんですが,あってますでしょうか?

2.サービスの呼び出し

サービスサーバー↓

ros::ServiceServer srv_on = nh.advertiseService("motor_on", &Motor::callback_on, this);

callback_onの部分は下のコードです.

bool callback_on(std_srvs::TriggerRequest& req, std_srvs::TriggerResponse& resp)
  {
   resp = onoff_response(true);
   return resp.success;
  }

サービスクライアント↓

ros::ServiceClient client_1 = nh.serviceClient<std_srvs::Trigger>("motor_on");

呼び出し↓

std_srvs::Trigger srv;
client_1.call(srv);

3.CMakeListsでの登録方法

add_executable(motor_freq src/ノード名.cpp)
target_link_libraries(motor_freq ${catkin_LIBRARIES})
add_dependencies(motor_freq ${myros}_generate_messages_cpp)

こんな感じで書いたんですがadd_dependenciesの部分でエラーが発生して,何度か違う書き方で試しても同じエラーが出続けて困ってます.

エラー内容と試したこと

・エラー内容
スクリーンショット 2023-12-04 140956.png

・試したこと

add_dependencies(ノード名 ${PROJECT_NAME}_gencpp)

add_dependencies(ノード名 ${パッケージ}_gencpp)

add_dependencies(ノード名 パッケージ名_gencpp)

特に3つ目のCMakeについて詳しい方がいましたらアドバイ欲しいです.

0

1Answer

参考になるか分かりませんが以下質問をそのままGPT-4に投げた解答です。

ROS (Robot Operating System) のサービス通信に関して、C++での実装についての質問がありますね。それぞれの点について解説します。

  1. ros::service::waitForService の使用
    あなたのコードは基本的に正しいですが、細かい点で修正が必要です。waitForService関数は、指定されたサービスが利用可能になるまで待機します。以下が正しい使用方法です。

cpp
Copy code
ros::service::waitForService("サービス名", ros::Duration(タイムアウト秒));
この関数は指定したサービス名のサービスが利用可能になるまで、指定した時間(秒)待機します。タイムアウトが経過すると、関数は false を返し、利用可能になると true を返します。

  1. サービスの呼び出し
    サービスの定義とクライアントからの呼び出しに関しては、あなたのコードは基本的に正しいです。ただし、サービスのレスポンスを設定する際に、success フィールドとメッセージを適切に設定する必要があります。

サービスサーバーのコールバック:

cpp
Copy code
bool callback_on(std_srvs::TriggerRequest& req, std_srvs::TriggerResponse& resp)
{
resp.success = true; // または false
resp.message = "何らかのメッセージ";
return true;
}
サービスクライアントの呼び出し:

cpp
Copy code
std_srvs::Trigger srv;
if (client_1.call(srv))
{
// 成功時の処理
ROS_INFO("Response: %s", srv.response.message.c_str());
}
else
{
// 失敗時の処理
ROS_ERROR("Failed to call service motor_on");
}
3. CMakeLists.txt での登録方法
CMakeLists.txt の add_dependencies 関連のエラーに関しては、具体的なエラーメッセージを見ることが重要です。ただし、一般的には、以下のように書くことが多いです:

cmake
Copy code
add_dependencies(ノード名 ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS})
これは、ROS メッセージ生成やサービス生成のターゲットに依存することを意味します。PROJECT_NAME はあなたのパッケージの名前に置き換えてください。

もしエラーが解決しない場合、具体的なエラーメッセージをもとにさらに調査する必要があります。また、find_package 部分で必要な依存関係を正しく指定しているかも確認してください。

これらの解説があなたの問題解決の助けになれば幸いです。もし具体的なエラーメッセージや、さらに詳細な情報があれば、それに基づいてより具体的なアドバイスを提供できます。

0Like

Comments

  1. @sakusakupannda

    Questioner

    丁寧な回答ありがとうございます.この回答を参考にして今から実践してみたいと思います.返信が遅くなりすいません.

Your answer might help someone💌