ROS學習--RoboWare Studio的使用和釋出器/訂閱器的編寫與測試
阿新 • • 發佈:2019-01-29
開始ROS學習之前,先按照官網教程和其他老大們寫的部落格安裝好ROS,再安裝一個RoboWare-Studio,雖然用Qt和Eclipse也行,但比較麻煩,這個很方便。
按照大多網路教材的順序,我們先來做一個釋出器和訂閱器。步驟如下:
1.在RoboWare-Studio裡的工作區間下新建一個包beginner_tutorials,依賴項是std_msgs,roscpp.
2.在_tutorials包下的src裡建立兩個cpp原始檔talker和listener。
talker檔案內容如下:
#include"ros/ros.h"//匯入ros核心標頭檔案
#include"std_msgs/String.h" //匯入std_msgs/String訊息標頭檔案,由std_msgs包的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);//釋出一個名為chatter的的話題的訊息,訊息型別為std_msgs/String,訊息佇列大小為1000,超過後舊的訊息丟棄
ros::Rate loop_rate(10);//發訊息的頻率,這裡指每秒10次,通過 Rate::sleep()來處理睡眠的時間來控制對應的釋出頻率。
int count=0;
while(ros::ok())//預設roscpp會植入一個SIGINT處理機制,當按下Ctrl-C,就會讓ros::ok()返回false,那迴圈就會結束
{
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);//實際釋出的函式
ros::spinOnce();//不是必需的,但是保持增加這個呼叫,是好習慣。如果程式裡也有訂閱話題,就必需,否則回撥函式不能起作用。
loop_rate.sleep();
++count;
}
return 0;
}
/*ros::ok() 返回false的幾種情況:
SIGINT收到(Ctrl-C)訊號
另一個同名節點啟動,會先中止之前的同名節點
ros::shutdown()被呼叫
所有的ros::NodeHandles被銷燬
*/
listener裡的內容如下:
#include"ros/ros.h"
#include"std_msgs/String.h"
void chatterCallback(const std_msgs::String::ConstPtr& msg)
{
ROS_INFO("I heared :[%s]",msg->data.c_str());
}//回撥函式,收到chatter話題時會呼叫這個函式,訊息通過boost shared_ptr(共享指標)傳遞,收到訊息通過ROS_INFO顯示到終端
int main(int argc, char **argv)
{
ros::init(argc, argv, "listener");
ros::NodeHandle n;
ros::Subscriber sub=n.subscribe("chatter",1000,chatterCallback);//訂閱節點
ros::spin();//呼叫此函式才能進入迴圈處理,直到ros::ok返回false結束
return 0;
}
通過Roboware-studio編寫,package.xml和CMakeLists.txt不需要修改,會幫我們修改好。
3.點選左上角資源管理器邊上的小錘子進行編譯,有錯誤的話會報。
4.上方選單欄的ROS裡的roscore點一下,也可以<Ctrl>+<Alt>+T
開啟終端執行roscore。
5.在終端裡到工作空間下source一下setup.sh檔案
# In your catkin workspace
$ cd ~/catkin_ws
$ source ./devel/setup.bash
6.在兩個終端裡分別rosrun talker和listener
$ rosrun beginner_tutorials talker (C++)
$ rosrun beginner_tutorials talker.py (Python)
$ rosrun beginner_tutorials listener (C++)
$ rosrun beginner_tutorials listener.py (Python)
7.驗證一下成功後<Ctrl>+c
關閉兩個終端