ROSのパッケージを作成する
先日RaspberryPi Zero WのRaspbianにインストールしたROSだが、この環境で自前のパッケージを作成してPublisherのサンプルプログラムを動かしてみる。
参考書籍は、ROSロボットプログラミングバイブル。
何分にも、自前でビルドした環境のため、いろいろ引っかかってしまったので、そのあたりを中心にメモ。
環境設定
※超重要
最初これをしていなかったせいで、せっかく作ったパッケージが見つからないというエラーで悩んだ。
Bash起動時に、環境設定のスクリプトを実行するように設定する。
$ echo "source ~/ros_catkin_ws/devel_isolated/setup.bash" >> ~/.bashrc
$ echo "source ~/ros_catkin_ws/devel/setup.bash" >> ~/.bashrc
$ echo "source ~/ros_catkin_ws/devel/local_setup.bash" >> ~/.bashrc
パッケージのスキャフォルド
パッケージのひな型をコマンドで作成する。
$ catkin_create_pkg ros_gnss_test message_generation std_msgs roscpp --rosdistro=melodic
パッケージ名をros_gnss_Testに変更。
また、本には記載されていなかった、--rosdistro=melodicオプションが必要だった。
パッケージファイルを書き換える
以下のようにpackage.xmlを書き換えた。コメントは削除してある。
<?xml version="1.0"?>
<package format="2">
<name>ros_gnss_test</name>
<version>0.0.0</version>
<description>The ros_gnss_test package</description>
<maintainer email="pi@todo.todo">pi</maintainer>
<license>TODO</license>
<buildtool_depend>catkin</buildtool_depend>
<build_depend>message_generation</build_depend>
<build_depend>roscpp</build_depend>
<build_depend>std_msgs</build_depend>
<build_export_depend>roscpp</build_export_depend>
<build_export_depend>std_msgs</build_export_depend>
<exec_depend>roscpp</exec_depend>
<exec_depend>std_msgs</exec_depend>
<exec_depend>message_runtime</exec_depend>
<exec_depend>message_generation</exec_depend>
<export>
</export>
</package>
CMakeファイルを書き換える
以下内容にCMakeLists.txtを書き換えた。これもコメント部分は省略。
cmake_minimum_required(VERSION 2.8.3)
project(ros_gnss_test)
find_package(catkin REQUIRED COMPONENTS
message_generation
roscpp
std_msgs
)
add_message_files(
FILES
MsgGNSS.msg
)
generate_messages(
DEPENDENCIES
std_msgs
)
catkin_package(
LIBRARIES ros_gnss_test
CATKIN_DEPENDS message_generation roscpp std_msgs
)
include_directories(
${catkin_INCLUDE_DIRS}
)
add_executable(${PROJECT_NAME}_node src/ros_gnss_test_node.cpp)
add_dependencies(${PROJECT_NAME}_node ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS})
target_link_libraries(${PROJECT_NAME}_node
${catkin_LIBRARIES}
)
メッセージファイルを作成
msgディレクトリを作成して、MsgGNSS.msgを作成し、以下を記載
time stamp
string data
プログラムファイルを作成
src以下にros_gnss_test_node.cppとして、以下を作成。
#include "ros/ros.h"
#include "ros_gnss_test/MsgGNSS.h"
int main(int argc, char **argv)
{
ros::init(argc, argv, "ros_gnss_test");
ros::NodeHandle nh;
ros::Publisher ros_gnss_test_pub = nh.advertise<ros_gnss_test::MsgGNSS>("ros_gnss_msg", 100);
ros::Rate loop_rate(10);
ros_gnss_test::MsgGNSS msg;
while(ros::ok())
{
msg.stamp = ros::Time::now();
msg.data = "test";
ROS_INFO("send msg = %d", msg.stamp.sec);
ros_gnss_test_pub.publish(msg);
loop_rate.sleep();
}
return 0;
}
ビルド
ワークスペースのルートに移動して、ビルド。
$ catkin_make
これでエラーがなければビルドされているはず。
実行
roscoreが動いている状態で、以下を実行。
$ rosrun ros_gnss_test ros_gnss_test_node
コンソールにはログとして、以下のような内容が出力される。
[ INFO] [1576429180.394603124]: send msg = 1576429180
[ INFO] [1576429180.494594427]: send msg = 1576429180
[ INFO] [1576429180.594606730]: send msg = 1576429180
[ INFO] [1576429180.694604033]: send msg = 1576429180
無事、自分でPublisherが動いた。