====== 0. ROSの基本 ======
# 2018-04-12 YMD\\
正確な情報はhttp://wiki.ros.org/ja/ROS/Tutorialsを参照すること.
===== ワークスペース =====
ROSはcatkinというビルドシステムを使っている.\\
catkinを使うことによって,パッケージの依存関係などの管理が簡単になる.
=== ワークスペースの作成 ===
以下のコマンドでワークスペースを作成する.(一度だけ行う.端末を立ち上げ直しても再び行う必要はない)
mkdir -p ~/catkin_ws/src
cd ~/catkin_ws/src
catkin_init_workspace
~/.bashrcの一番下に下記を追加する。
source ~/catkin_ws/devel/setup.bash
一度端末を閉じて,開き直して,.bashrcの変更を反映する.
cd ~/catkin_ws/
catkin_make
===== 環境変数 =====
ROSは環境変数をパッケージの検索などに使っているので,
環境変数を操作できるとデバッグなどで便利なことがある.
=== 環境変数の表示 ===
env # 全ての環境変数を表示
env | grep ROS # ROS関連の環境変数を表示
echo $PATH # 環境変数PATHを表示
ROS_PACKAGE_PATHの中に/home/USERNAME/catkin_ws/srcと/opt/ros/kinetic/shareが表示されていて,PATHの中に/opt/ros/kinetic/binが含まれていれば,正しくセットアップできている.
===== パッケージ(catkin形式) =====
=== パッケージを作る ===
例として,ros_studyというパッケージを作る.
cd ~/catkin_ws/src
catkin_create_pkg ros_study std_msgs sensor_msgs nav_msgs geometry_msgs roscpp
std_msgs以降の引数は依存パッケージを指定している.
===== roscore =====
==== roscore ====
(ROSを使うときに最初に実行するコマンド,rosout,rosmaster,ros parameter serverが起動する)
roscore
roscoreを行っている間はその端末では他のコマンドが実行できないので,別の端末を起動する.\\
(terminatorを使っている場合にはCtrl+Shift+eやCtrl+Shift+oを使う)
===== ノード =====
rosにおけるプロセスのこと
=== ノードを作る ===
~/catkin_ws/src/ros_study/src/にros_study_node.cppを作成する
/**
* inから読み取った最新のメッセージを1回~/outに出力するノード.
* パラメータ~/nameで指定された名前を最初に付与する.
*/
#include "ros/ros.h"
#include "std_msgs/String.h"
#include
#include
#include
static std_msgs::String::ConstPtr latest_listened_msg_ptr = nullptr;
void listenCallback(const std_msgs::String::ConstPtr& msg)
{
latest_listened_msg_ptr = msg;
}
int main(int argc, char **argv)
{
ros::init(argc, argv, "ros_study_node");
ros::NodeHandle private_nh("~");
ros::NodeHandle nh;
ros::Duration loop_duration(0.1);
std::string name;
ros::Publisher out_pub(private_nh.advertise("out", 1000)); // "~/out"
ros::Subscriber in_sub = nh.subscribe("in", 1000, listenCallback); // "/in"
private_nh.param("name", name, "anonymous"); // "~/name"
while (ros::ok())
{
if (latest_listened_msg_ptr)
{
std_msgs::String out_msg;
std::stringstream out_ss;
out_ss << name << ": "; // set name name
out_ss << latest_listened_msg_ptr->data; // append listened string
latest_listened_msg_ptr = nullptr; // delete message
out_msg.data = out_ss.str(); // set data
out_pub.publish(out_msg); // send message
}
ros::spinOnce(); // check topic
loop_duration.sleep(); // sleep for 0.1 sec
}
return 0;
}
=== ビルド設定を編集する ===
CMakeLists.txtから以下の行を探してコメント(# )を解除する.
# add_compile_options(-std=c++11)
# add_executable(${PROJECT_NAME}_node src/ros_study_node.cpp)
# target_link_libraries(${PROJECT_NAME}_node
# ${catkin_LIBRARIES}
# )
=== ビルド ===
cd ~/catkin_ws
catkin_make
=== rosrun ===
rosrun ros_study ros_study_node # 実行しても何も表示はされない
でros_studyという名前のパッケージにあるros_study_nodeという名前のノードを実行する.\\
後で使うので実行したまま,別の端末を起動する.
=== 実行中のノード一覧表示 ===
rosnode list
===== topic =====
ノード間で非同期的にやり取りされるデータをメッセージと呼ぶ.\\
メッセージの送信先の指定はtopicによって行われる.\\
topicはwebサービスにおけるアドレスに似ている.
=== topic一覧の表示 ===
rostopic list
=== topicに送られたデータの表示 ===
例としてros_study_node/outのデータを表示する
rostopic echo ros_study_node/out # 現時点では何も表示されない
後で使うので実行したまま,別の端末を起動する.
=== topicにメッセージを配信する ===
例としてstd_msgs/String型の"hello"というデータをトピック"in"に配信する
rostopic pub in std_msgs/String "hello"
rostopic echoを行った端末に,data: "anonymous: hello"と表示される.
=== グラフの表示 ===
インストール
sudo apt-get install ros-kinetic-rqt-graph
実行
rosrun rqt_graph rqt_graph
===== パラメータ =====
=== パラメータ一覧を表示する ===
rosparam list
=== パラメータを取得・設定する ===
例としてros_study_node/nameというパラメータを取得・設定する
rosparam get ros_study_node/name # setしていない場合には存在しないのでエラーメッセージが出る
rosparam set ros_study_node/name john
セットした後で
rosrun ros_study ros_study_node
すると,パラメータros_study_node/nameを読み込ませることができる.\\
(ノード内部の値を動的に更新したいときにはdynamic_reconfigureを使う必要がある)\\
このとき
rostopic pub in std_msgs/String "hello"
を実行すると,rostopic echoを行った端末に,data: “john: hello”と表示される.
===== roslaunch =====
ノードをまとめて実行するときに使う
=== launchファイル ===
例えば,以下のようなファイルを作る.\\
~/catkin_ws/src/ros_study/launch/apple.launchに配置する.\\
pkgにはパッケージ名,\\
nameには適当に理解しやすい固有名(ノード名と同じでも可),\\
typeにはノード名を指定する.\\
paramタグを使ってパラメータを指定する.\\
remapタグを使ってトピック名を変更する.\\
=== launchファイルを実行する ===
roslaunch ros_study apple.launch
別の端末で
rostopic echo ringo_node/out
さらに別の端末で
rostopic pub john_node/in std_msgs/String "hello"
すると,data: "ringo: george: paul: john: hello"と表示される.
rosrun rqt_graph rqt_graph
すると,メッセージが受け渡される流れを確認できる.