標籤:include 標頭檔 技術分享 topic while style cat 編寫 publish
ROS用戶端提供一些列庫檔案用於使用者開發。
ROSCPP用戶端(c++用戶端)
首先建立一個包
然後catkin_make一下
在建立的包目錄下,建立一個訊息檔案msg
然後需要產生訊息foo.h以便以後我們可以調用,我們進入package.xml裡面去修改,
然後再回到CMakeLists.txt中
下面編譯一下,
下面來寫一下代碼:
我們以前已經寫過了make檔案,查看一下
有了這個檔案,我們就可以在eclipse中開啟這個工程,先執行一下這個檔案:
下面開啟eclipse
然後file->import,
下面要在src中寫一個源檔案,叫做move_publisher.cpp
再寫一個move_subscriber.cpp
首先要控制turtlesim,他的話題topic是/turtle1/cmd_vel訊息類型為geometry_msgs/Twist。
下面編寫發布程式
/* * move_publisher.cpp *
* Created on: Jan 16, 2017
* Author: gary */
#include<ros/ros.h> //訊息的標頭檔
#include<geometry_msgs/Twist.h>
//一定要加命令列參數,argc指參數個數
//argv為具體的參數
int main(int argc,char **argv)
{
//初始化,move_publisher為節點名稱
ros::init(argc,argv,"move_publisher");
//定義一個控制代碼
ros::NodeHandle n;
//定義一個發行者對象pub,指定需要的類型為geometry_msgs::Twist
//發布的主題為turtle1/cmd_vel,緩衝區大小為1000 ros::Publisher pub=n.advertise<geometry_msgs::Twist>("turtle1/cmd_vel",1000);
//執行個體化一個訊息對象
geometry_msgs::Twist tw;
//並對它進行賦值,分別是角速度賦值
tw.angular.z=2;
tw.angular.x=0;
tw.angular.y=0;
//線速度賦值
tw.linear.x=2;
tw.linear.y=0;
tw.linear.z=0;
//上面訊息結構已經定義了,下面發布這個訊息
//指定發布頻率,允許迴圈頻率當前是10HZ,
ros::Rate rate(10); //ros::ok()如果按下ctrl+c則它會返回一個false值
while(ros::ok())
{ //指定要發布的訊息
pub.publish(tw);
//spin()是指在此處固定等待訊息,進入迴圈
//spin_once()迴圈一次執行回呼函數
ros::spin(); //要改成ros::spinOnce()才能正確運行
}
rate.sleep();
}
下面修改一下CMakeLists.txt,
添加一行
add_executable(move_publisher src/move_publisher.cpp)
以及
target_link_libraries(move_publisher
${catkin_LIBRARIES}
)
儲存一下,下面來編譯,
catkin_make,編譯正確後,運行一下
rosrun turtle_move move_publisher
下面再寫一個訂閱者:
把剛剛的訊息加到訂閱者裡面來,也把發行者和接收者寫到一起,
然後修改CMakeLists.txt
加入以下:
add_executable(move_subscriber src/move_subscriber.cpp)
target_link_libraries(move_publisher
${catkin_LIBRARIES}
)
再進行編譯
catkin_make,沒有問題,之後運行之,正確。
下面再寫一個計時器:
類似於建立一個主題訂閱
然後在CMakeLists.txt裡面再修改,
添加上
add_executable(timer src/timer.cpp)
target_link_libraries(timer
${catkin_LIBRARIES}
)
然後編譯正確,然後運行,結果也是正確的。
第四課4、ROS用戶端