本文所用代碼為個人獨自編寫僅用於測試的代碼,實現效果為:循環打印某位學生的成績及其評價。
創建工作空間
首先打開終端 ( Ctrl + Alt + T),創建工作文件夾 (catkin_ws
為工作文件夾名稱,可以自定義):mkdir -p ~/catkin_ws/src
輸入后,我們可以在文件管理的主目錄中,找到一個名為 catkin_ws
的文件夾,這個就是我們剛才創建的工作空間:
進入 src 文件夾:cd ~/catkin_ws/src/
使當前文件夾具有 ros 工作空間屬性:catkin_init_workspace
然后返回工作空間主目錄:cd ~/catkin_ws/
進行編譯:catkin_make
編譯完成后,你再打開 catkin_ws
文件夾,你會發現多出了很多的文件:
為了方便后期使用,我們需要添加 source:echo "source ~/catkin_ws/devel/setup.zsh" >> ~/.zshrc
我用的終端是 zsh,如果你的終端是 bash 的話,把
.zsh
改為.bash
,.zshrc
改為.bashrc
即可
創建及配置 msg 文件
首先進入 src 文件夾:cd ~/catkin_ws/src/
創建一個功能包,其中的 ros_topic
可以自定義名稱:catkin_create_pkg ros_topic roscpp rospy std_msgs
進入該功能包:cd ~/catkin_ws/src/ros_topic/
在該功能包下,我們創建一個 msg 文件夾,這個文件夾用來存放 .msg
文件:mkdir msg
進入該 msg 文件夾:cd ~/catkin_ws/src/ros_topic/msg/
創建 .msg 文件,score
可自定義:gedit score.msg
在彈出的框中,粘貼如下測試代碼並保存:
string student_name
float32 score
string evaluation
string good = "good"
string bad = "bad"
好了,到這一步,我們已經把 msg 文件創建好了,代碼也輸入進去了,現在需要修改 package.xml
文件進行相應的配置:gedit ~/catkin_ws/src/ros_topic/package.xml
在 <exec_depend>std_msgs</exec_depend>
代碼下面粘貼如下代碼並保存:
<build_depend>message_generation</build_depend>
<exec_depend>message_runtime</exec_depend>
粘貼完成后效果如圖:
然后我們再對 CMakeLists.txt
文件進行相應的配置:gedit ~/catkin_ws/src/ros_topic/CMakeLists.txt
在彈出的框中,找到 find_package
,添加 message_generation
:
find_package(catkin REQUIRED COMPONENTS
roscpp
rospy
std_msgs
message_generation
)
找到已被注釋的 add_message_files
,刪掉它前面的注釋符號,並修改為如下:
add_message_files(
FILES
score.msg
)
同樣的,找到已被注釋的 generate_messages
,刪掉它前面的注釋符號,並修改為如下:
generate_messages(
DEPENDENCIES
std_msgs
)
找到 catkin_package
並修改為如下:
catkin_package(
CATKIN_DEPENDS
message_runtime
# INCLUDE_DIRS include
# LIBRARIES ros_topic
# CATKIN_DEPENDS roscpp rospy std_msgs
# DEPENDS system_lib
)
創建及配置發布者 Publisher
我們開始新建 cpp 文件:gedit ~/catkin_ws/src/ros_topic/src/publisher_score.cpp
在彈出的框中,粘貼如下測試代碼並保存:
#include "ros/ros.h"
#include "ros_topic/score.h"
int main(int argc, char **argv) {
// 初始化 ROS 節點
ros::init(argc, argv, "publisher_score");
// 創建節點句柄
ros::NodeHandle n;
// 創建一個 Publisher
ros::Publisher score_pub = \
n.advertise<ros_topic::score>("/score", 10);
// 設置一個循環 1Hz
ros::Rate loop_rate(1);
while (ros::ok()) {
// 初始化 learning_topic::score 類型的消息
ros_topic::score score_msg;
// 創建一個人物以及他的成績
score_msg.student_name = "LiHua";
score_msg.score = 90.5;
score_msg.evaluation = ros_topic::score::good;
// 發布消息
score_pub.publish(score_msg);
ROS_INFO("%s got %.1f points in the exam and was rated as %s", \
score_msg.student_name.c_str(),\
score_msg.score, \
score_msg.evaluation.c_str());
// 按照循環頻率延時
loop_rate.sleep();
}
return 0;
}
現在,我們打開文件管理器,打開 /主目錄/catkin_ws/src/ros_topic/src
,就可以看到剛才創建的 cpp 文件了:
接下來,我們再次配置 CMakeLists.txt
文件:gedit ~/catkin_ws/src/ros_topic/CMakeLists.txt
下拉到最后一行,添加如下代碼並保存:
add_executable(publisher_score src/publisher_score.cpp)
add_dependencies(publisher_score ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS})
target_link_libraries(publisher_score ${catkin_LIBRARIES})
到此,我們就全部配置完畢,先返回工作空間主目錄下:cd ~/catkin_ws/
進行編譯:catkin_make
編譯完成后,啟動 roscore
:roscore
然后再打開一個終端 ( Ctrl + Alt + T),輸入:rosrun ros_topic publisher_score
就會看到如下效果,那么我們就完成了: