2020/10/23

ROS初級Tutorialを実施しました[Vol.3]

roscppubuntu

概要

ROSの入門編その3(最後)です。

以前のものはこちらからご覧いただけます

Simple Service & Client in C++

$ roscd beginner_tutorials

# serviceのコードを作成します
$ cat <<EOF > src/add_two_ints_server.cpp
#include "ros/ros.h"
#include "beginner_tutorials/AddTwoInts.h"

bool add(beginner_tutorials::AddTwoInts::Request  &req,
         beginner_tutorials::AddTwoInts::Response &res)
{
  res.sum = req.a + req.b;
  ROS_INFO("request: x=%ld, y=%ld", (long int)req.a, (long int)req.b);
  ROS_INFO("sending back response: [%ld]", (long int)res.sum);
  return true;
}

int main(int argc, char **argv)
{
  ros::init(argc, argv, "add_two_ints_server");
  ros::NodeHandle n;

  ros::ServiceServer service = n.advertiseService("add_two_ints", add);
  ROS_INFO("Ready to add two ints.");
  ros::spin();

  return 0;
}
EOF

# clientのコードを作成します
$ cat <<EOF > src/add_two_ints_client.cpp
#include "ros/ros.h"
#include "beginner_tutorials/AddTwoInts.h"
#include <cstdlib>

int main(int argc, char **argv)
{
  ros::init(argc, argv, "add_two_ints_client");
  if (argc != 3)
  {
    ROS_INFO("usage: add_two_ints_client X Y");
    return 1;
  }

  ros::NodeHandle n;
  ros::ServiceClient client = n.serviceClient<beginner_tutorials::AddTwoInts>("add_two_ints");
  beginner_tutorials::AddTwoInts srv;
  srv.request.a = atoll(argv[1]);
  srv.request.b = atoll(argv[2]);
  if (client.call(srv))
  {
    ROS_INFO("Sum: %ld", (long int)srv.response.sum);
  }
  else
  {
    ROS_ERROR("Failed to call service add_two_ints");
    return 1;
  }

  return 0;
}
EOF
  • CMakeLists.txtを編集します
$ rosed beginner_tutorials CMakeLists.txt

以下を追加します。

add_executable(add_two_ints_server src/add_two_ints_server.cpp)
target_link_libraries(add_two_ints_server ${catkin_LIBRARIES})
add_dependencies(add_two_ints_server beginner_tutorials_gencpp)

add_executable(add_two_ints_client src/add_two_ints_client.cpp)
target_link_libraries(add_two_ints_client ${catkin_LIBRARIES})
add_dependencies(add_two_ints_client beginner_tutorials_gencpp)
  • buildします
cd ~/catkin_ws
catkin_make
  • 実行してみます
# serviceを起動
$ rosrun beginner_tutorials add_two_ints_server
[ INFO] [1603460491.006107478]: Ready to add two ints.

# 起動を確認
$ rossrv list
beginner_tutorials/AddTwoInts  # この行を確認

# interfaceを確認
$ rossrv show beginner_tutorials/AddTwoInts
int64 a
int64 b
---
int64 sum

# clientを起動
$ rosrun beginner_tutorials add_two_ints_client 1 3
[ INFO] [1603460705.374866632]: Sum: 4

# service側もrequestログが出ているのを確認
[ INFO] [1603460705.374648399]: request: x=1, y=3
[ INFO] [1603460705.374684267]: sending back response: [4]
  • 無事確認できたので、serviceをCtrl+Cでストップします

rosbag

roscoreに追加で、以下を起動します

$ rosrun turtlesim turtlesim_node
$ rosrun turtlesim turtle_teleop_key
$ bagfiles && cd bagfiles
$ rosbag record -a
# rosbag record -O subset /turtle1/cmd_vel /turtle1/pose というような形で特定のtopicのみログに保存することもできるようでした

この状態で、キーを入力し、亀を動作させました。

  • Ctrl+Cでrosbagのコマンド停止させます
$ ls
2020-10-23-22-53-50.bag

$ rosbag info 2020-10-23-22-53-50.bag
path:    	2020-10-23-22-53-50.bag
version: 	2.0
duration:	1:14s (74s)
start:   	Oct 23 2020 22:53:50.07 (1603461230.07)
end:     	Oct 23 2020 22:55:04.54 (1603461304.54)
size:    	657.8 KB
messages:	9453
compression: none [1/1 chunks]
types:   	geometry_msgs/Twist [9f195f881246fdfa2798d1d3eebca84a]
         	rosgraph_msgs/Log   [acffd30cd6b6de30f120938c17c593fb]
         	turtlesim/Color 	[353891e354491c51aabe32df673fb446]
         	turtlesim/Pose  	[863b248d5016ca62ea2e895ae5265cf9]
topics:  	/rosout                	3 msgs	: rosgraph_msgs/Log  
         	/turtle1/cmd_vel     	167 msgs	: geometry_msgs/Twist
         	/turtle1/color_sensor   4641 msgs	: turtlesim/Color    
         	/turtle1/pose       	4642 msgs	: turtlesim/Pose

# 以下で、亀がまた似たような動きをすることを確認しました
$ rosbag play 2020-10-23-22-53-50.bag
[ INFO] [1603461426.275553226]: Opening 2020-10-23-22-53-50.bag

Waiting 0.2 seconds after advertising topics... done.

Hit space to toggle paused, or 's' to step.

roswtf

  • roswtf はROSに関係する環境周りのエラーのチェックをしてくれるようなツールみたいでした。

「roswtfが見つけ出せる問題の種類は他にもたくさんあります。もしビルドや通信で困ることがあったら、roswtfを実行し問題解決の糸口が得られるか試してみてください。」

とのことでした。

roscoreをとめて試す

  • roscoreをとめておきます
$ roscd
$ roswtf
Loaded plugin tf.tfwtf
No package or stack in the current directory
================================================================================
Static checks summary:

No errors or warnings
================================================================================

ROS Master does not appear to be running.
Online graph checks will not be run.
ROS_MASTER_URI is [http://localhost:11311]
  • roscoreを動作させて再度実行してみます
$ roscd
$ roswtf
Loaded plugin tf.tfwtf
No package or stack in the current directory
================================================================================
Static checks summary:

No errors or warnings
================================================================================
Beginning tests of your ROS graph. These may take a while...
analyzing graph...
... done analyzing graph
running graph rules...
... done running graph rules
running tf checks, this will take a second...
... tf checks complete

Online checks summary:

Found 2 warning(s).
Warnings are things that may be just fine, but are sometimes at fault

WARNING The following node subscriptions are unconnected:
 * /rosout:
   * /rosout

WARNING No tf messages
  • roscoreを再度止め、あえてエラーを出してみます
$ roscd
$ ROS_PACKAGE_PATH=bad:$ROS_PACKAGE_PATH roswtf
Loaded plugin tf.tfwtf
No package or stack in the current directory
================================================================================
Static checks summary:

Found 1 error(s).

ERROR Not all paths in ROS_PACKAGE_PATH [bad:/home/yourname/catkin_ws/src:/opt/ros/noetic/share] point to an existing directory:
 * bad

================================================================================

ROS Master does not appear to be running.
Online graph checks will not be run.
ROS_MASTER_URI is [http://localhost:11311]

最後に

これで初級のROSのチュートリアルは一通り完了になります。
ROSの超基本的な使い方などは習得できたような気がします!

ただ、まだ応用できる気がしないですね・・
3Dのモデルとか動かすのはどうやるんですかね・・😅 気長に奮闘していこうと思います。