ROS教程(三):创建程序包及节点(图文)
ros教程:創建程序包
文章目錄
- 前言
- 一、創建功能包
- 二、創建節點
- 三、修改CMakeList.txt
- 四、配置package.xml文件
- 五、編譯并執行
- 1.編譯
- 2.執行
- 六、rostopic工具
- 總結(最重要的)
前言
ros教程:創建程序包
根據前篇教程已經創建好了工作空間,并已經成功生效了環境變量,接下來創建一個功能包
一、創建功能包
功能包的名字根據我們這個功能包的作用來命名。比如我現在的功能包是用來學習ROS的C++編程,那么我的功能包名稱就叫做learning_cplus。
打開終端,輸入下面指令。
我們通過cd指令切換當前路徑到src文件夾下,在該路徑下使用catkin_create_pkg指令 來創建一個功能包。
格式如下:catkin_create_pkg 功能包名稱 依賴項1 依賴項2 ......
依賴項是你的這個功能包依賴于哪些功能模塊,比如該功能包,就導入了C++、Python和std_msgs(后面會有詳細介紹)。
然后返回到catkin_ws目錄下進行編譯。
我們可以看到learning_cplus功能包在catkin_ws工作空間編譯成功,我們生效一下環 境變量,通過roscd learning_cplus指令即可進入該功能包。
目前我們的learning_cplus下有include(頭文件)和src(源文件)兩個文件夾,還有CMakelist.txt編譯配置文件和package.xml功能包列表文件。
到這里,我們的learning_cplus功能包創建結束。
二、創建節點
先進入learning_cplus功能包內,進入src文件夾內,創建一個發布節點。
roscd learning_cplus cd src touch publisher.cpp發布節點publisher.cpp內容如下。這里建議大家自行修改內容。
#include "ros/ros.h" //導入ROS系統包含核心公共頭文件 #include "std_msgs/String.h" //導入std_msgs/String消息頭文件,這個是由std_m sgs包的string.msg文件自動生成。 #include <sstream> int main(int argc, char **argv) { ros::init(argc, argv, "talker"); //初始化ROS,指定節點名稱為“talker”,節點 名稱要保持唯一性。名稱定義參考 ros::NodeHandle n; //實例化節點 ros::Publisher chatter_pub = n.advertise<std_msgs::String>("chatter", 1000); //發布一個消息類型為std_msgs/String,命名為chatter的話題。 //定義消息隊列大小為1000,即超過1000條消息之后,舊的消息就會丟棄。ros::Rate loop_rate(10); //指定發布消息的頻率,這里指10Hz,也即每秒10次 //通過 Rate::sleep()來處理睡眠的時間來控制對應的發布頻率。 int count = 0; while (ros::ok()) { /* 默認roscpp會植入一個SIGINT處理機制,當按下Ctrl‐C,就會讓ros::ok()返回false, 那循環就會結束。 ros::ok() 返回false的幾種情況: SIGINT收到(Ctrl‐C)信號 另一個同名節點啟動,會先中止之前的同名節點 ros::shutdown()被調用所有的ros::NodeHandles被銷毀 */ std_msgs::String msg; std::stringstream ss; ss << "hello world " << count; msg.data = ss.str(); //實例化消息msg, 定義字符串流“hello world”并賦值給ss, 最后轉成為字符串賦值給 msg.data ROS_INFO("%s", msg.data.c_str()); //輸出調試信息 chatter_pub.publish(msg); //發布msg ros::spinOnce(); //不是必需的,但是保持增加這個調用,是好習慣 //如果程序里也有訂閱話題,就必需,否則回調函數不能起作用 loop_rate.sleep(); //根據之前ros::Rate loop_rate(10)的定義來控制發布話題的頻率。定義10即為每秒1 0次++count; } return 0; }發布節點的功能就是發布hello world并跟一個計數。發布節點的名稱叫做talker,發布 的話題名稱叫做chatter,發布的內容是hello world + 計數。邏輯很清晰,就是從main函數,從上往下的執行,只要Master節點管理器不死,就會移植發布。
有了發布節點,那么接下來我們需要做一個訂閱節點來接收這些數據。我們訂閱節點由 listener.cpp實現。
roscd learning_cplus cd src touch listener.cpp訂閱節點publisher.cpp內容如下。這里建議大家自行修改內容。
#include "ros/ros.h" //導入ROS系統包含核心公共頭文件 #include "std_msgs/String.h" //導入std_msgs/String消息頭文件,這個是由std_m sgs包的string.msg文件自動生成。 /* 定義回調函數chatterCallback,當收到chatter話題的消息就會調用這個函數。 消息通過boost shared_ptr(共享指針)來傳遞。 但收到消息,通過ROS_INFO函數顯示到終端 */ void chatterCallback(const std_msgs::String::ConstPtr& msg) { ROS_INFO("I heard: [%s]", msg‐>data.c_str()); } int main(int argc, char **argv) { ros::init(argc, argv, "listener"); //初始化ROS,指定節點名稱為“listener” ros::NodeHandle n; //實例化節點 ros::Subscriber sub = n.subscribe("chatter", 1000, chatterCallback); /* 定義訂閱節點,名稱為chatter,指定回調函數chatterCallback 但收到消息,則調用函數chatterCallback來處理。 參數1000,定義隊列大小,如果處理不夠快,超過1000,則丟棄舊的消息 */ ros::spin(); //調用此函數才真正開始進入循環處理,直到 ros::ok()返回false才停 止。return 0; }訂閱節點是檢測到有chatter內容,需要去打印出來這個內容。由于是監聽的,所以需要使用類似中斷的方式,也就是信號回調來實現。
還是老樣子。初始化、實例化,然后檢測chatter話題,如果有,跳到chatterCallBack 執行,沒有就一直循環。
三、修改CMakeList.txt
我們的發布節點和訂閱節點都已經寫好,那么接下來就需要寫CMakeList.txt。 首先是find_package依賴項,修改如下。:
find_package(catkin REQUIRED COMPONENTS roscpp rospy std_msgs message_generation )調用生成的消息修改如下。
## Generate added messages and services with any dependencies listed here generate_messages( DEPENDENCIES std_msgs )個人編譯輸出配置修改如下。
################################### ## catkin specific configuration ## ################################### ## The catkin_package macro generates cmake config files for your package ## Declare things to be passed to dependent projects ## INCLUDE_DIRS: uncomment this if your package contains header files ## LIBRARIES: libraries you create in this project that dependent project s also need ## CATKIN_DEPENDS: catkin_packages dependent projects also need ## DEPENDS: system dependencies of this project that dependent projects a lso need catkin_package( # INCLUDE_DIRS include # LIBRARIES learning_cplus CATKIN_DEPENDS roscpp rospy std_msgs message_runtime # DEPENDS system_lib )接著,在Build位置添加 如下內容。
include_directories(include ${catkin_INCLUDE_DIRS}) add_executable(publisher src/publisher.cpp) target_link_libraries(publisher ${catkin_LIBRARIES}) add_dependencies(publisher learning_cplus_generate_messages_cpp) add_executable(listener src/listener.cpp) target_link_libraries(listener ${catkin_LIBRARIES}) add_dependencies(listener learning_cplus_generate_messages_cpp)四、配置package.xml文件
配置內容很少,直接貼出package.xml代碼。
<?xml version="1.0"?> <package format="2"> <name>learning_cplus</name> <version>0.0.0</version> <description>這是學習ROS C++編程的功能包</description> <maintainer email="xxxxx@xx.com">Leslie___Cheung_csdn</maintainer> <license>TODO</license> <author email="xxxxx@xx.com">Leslie___Cheung_csdn</author> <buildtool_depend>catkin</buildtool_depend> <build_depend>roscpp</build_depend> <build_depend>rospy</build_depend> <build_depend>std_msgs</build_depend> <build_depend>message_generation</build_depend> <build_export_depend>roscpp</build_export_depend> <build_export_depend>rospy</build_export_depend> <build_export_depend>std_msgs</build_export_depend> <exec_depend>roscpp</exec_depend> <exec_depend>rospy</exec_depend> <exec_depend>std_msgs</exec_depend> <exec_depend>message_runtime</exec_depend> <export> </export> </package>五、編譯并執行
1.編譯
打開一個終端,進入catkin_ws路徑,執行catkin_make進行編譯。如果沒寫錯的話,看到的應該是這樣的。
編譯成功記得重新source一下,不然可能找不到這個功能包。
source 一下工程路徑下devel內的setup.bash文件
source ~/catkin_ws/devel/setup.bash
2.執行
先啟動一個ROS Master節點管理器,然后分別啟動listener訂閱節點和publisher發布節點,在這里需要啟動三個終端。
啟動ROS Master節點管理器。
roscore
啟動listener訂閱節點。
rosrun learning_cplus listener
啟動publisher發布節點。
rosrun learning_cplus publisher
這樣看著不夠直觀,啟動一下節點關系圖,它是這樣的。
可以看到,talker節點給lisrener節點發了一個chatter。但是應該是publisher給,這里怎么成talker了呢?不要急,先去看一下publisher.cpp的代碼,原來是我們初始化的節點叫做talker,并不是BUG~~~
到這里就結束了嗎?并沒有,接下來給大家介紹一些ROS的小工具,比如上面的rqt_graph就是來查看當前各個節點通訊關系的。
六、rostopic工具
拿到了一個別人的ROS功能包只能用卻無法和自己的對接數據?沒關系,運行一下它的功能包,開一個rqt_graph,一目了然。
咳咳,重點來了,接下來我要說的小工具是rostopic。
rostopic list:查看當前話題都有哪些。 rostopic echo 話題名:查看該話題的數據。 rostopic pub 話題名 功能包數據:發布指定內容到指定話題。
總結(最重要的)
總結
以上是生活随笔為你收集整理的ROS教程(三):创建程序包及节点(图文)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 锐起3.1无盘服务器,[迎新春]锐起3.
- 下一篇: 【转载】士兵突击 经典语录