LoginSignup
1
0

More than 1 year has passed since last update.

ROS導入—Pub&Sub通信—

Posted at

1. はじめに

UbuntuにROSを入れたけど,その次の一手がわからなかったのでその備忘録
環境は以下の通り

項目 内容
OS Ubuntu 18.04 LTS
ROS Melodic

2. Visual Studio Codeのインストール

以下ページから.debをダウンロードしインストール
https://code.visualstudio.com/download

インテリセンスを活用するためVScodeの拡張機能で以下をインストール

  • ROS
  • CMakeLanguage

3. ワークスペース作成

ROSではワークスペースというフォルダ内にsrcというフォルダを作りそこにソースコードを置くのが主流らしい。今回はros_wsという名前を付けた。

mkdir -p ~/ros_ws/src

-pのオプションでは必要に応じて親ディレクトリも作られる

~/ros_ws/src
catkin init
~/ros_ws
catkin build

4. パッケージ作成

catkin_create_pkgでパッケージを作成

~/ros_ws/src
catkin_create_pkg utm_lx_30 roscpp rospy std_msgs tf

1つ目の引数がパッケージ名でなんでもよい。ここでは,utm_lx_30
2つ目以降は依存するパッケージ。この4つはよく使うらしい。

5. publisher.cpp作成

パッケージを作成するとutm_lx_30/srcというディレクトリができている。ここにpublisher.cppを新規追加

~/ros_ws/src/utm_lx_30/src/publisher.cpp
#include <ros/ros.h>
#include <std_msgs/String.h>

int main(int argc, char** argv)
{
  int bufsize = 10;
  int loopHz = 10;
  ros::init(argc, argv, "basic_simple_talker");
  ros::NodeHandle nh;
  ros::Publisher chatter_pub = nh.advertise<std_msgs::String>("chatter", bufsize);
  ros::Rate loop_rate(loopHz);
  while (ros::ok())
  {
    std_msgs::String msg;
    msg.data = "hello world!";
    ROS_INFO("publish: %s", msg.data.c_str());
    chatter_pub.publish(msg);

    ros::spinOnce();
    loop_rate.sleep();
  }
  return 0;
}

bufsizeはなるべく小さくした方がリアルタイム性が担保されるらしい。loopHzは通信周期をHz単位で変更可能。spinOnceは1回コールバック関数にアクセスする処理。

5. subscriber.cpp作成

~/ros_ws/src/utm_lx_30/src/subscriber.cpp
#include <ros/ros.h>
#include <std_msgs/String.h>

void chatterCallback(const std_msgs::String& msg)
{
  ROS_INFO("subscribe: %s", msg.data.c_str());
}

int main(int argc, char** argv)
{
  int bufsize = 10;
  ros::init(argc, argv, "basic_simple_listener");
  ros::NodeHandle nh;
  ros::Subscriber sub = nh.subscribe("chatter", bufsize, chatterCallback);

  ros::spin();
  return 0;
}

spinはメッセージがパブリッシュされるたびにコールバック関数にアクセスする処理。

6. CmakeList編集

CmakeList.txtを開き編集。もともと書いてあったりコメントアウトされていたりする。以下の情報を追加する。

CmakeList.txt
project(utm_lx_30)

find_package(catkin REQUIRED COMPONENTS
  roscpp
  std_msgs
)

include_directories(
  ${catkin_INCLUDE_DIRS}
)

add_executable(publisher src/publisher.cpp)
add_executable(subscriber src/subscriber.cpp)

target_link_libraries(publisher
  ${catkin_LIBRARIES}
)
target_link_libraries(subscriber
  ${catkin_LIBRARIES}
)

7. ビルド

~/ros_ws
catkin build

8. 実行

1つ目のターミナル
roscore
2つ目のターミナル
rosrun utm_lx_30 publisher
3つ目のターミナル
rosrun utm_lx_30 subscriber

hello worldがsubscriberに表示されれば成功

参考文献

https://qiita.com/srs/items/e0e0a9dc3f94c2d3348e
https://qiita.com/srs/items/26ca826802d07a9e3d4e
https://lilaboc.work/archives/16182817.html
https://qiita.com/gupitasoftbank/items/bed437c7d747cb78f9a3

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0