ROS學習筆記2編寫簡易publisher和subscriber


如何寫一個publisher

Publishers需要23個參數:topic typetopic namequeue size.

minimal_publisher代碼如下:

#include <ros/ros.h>

#include <std_msgs/Float64.h>

 

int main(int argc, char **argv) {

    ros::init(argc, argv, "minimal_publisher");

ros::NodeHandle n;

    ros::Publisher my_publisher_object = n.advertise<std_msgs::Float64>("topic1", 1);

 

    std_msgs::Float64 input_float;

 

    input_float.data = 0.0;

 

    while (ros::ok())

    {

        input_float.data = input_float.data + 0.001;

        my_publisher_object.publish(input_float);

    }

}

/*以上為代碼*/

initros里的一個方法,NodeHandlePbulisher是兩種ros類型。

ros::init是創建的一個node的最開始的一步,當這行代碼運行,ROS就意識到這是一段node的代碼

NodeHandle n(“minimal_nodes”)可以給n建立一個namespace.這樣topic的名字前面將加上這一命名空間,編程 minimal_nodes/topic1

但是在運行的時候還是可以改變的

rosrun minimal_nodes minimal_publisher minimal_nodes/topic1:=topic1

代碼中所用的關鍵點:

ROS headers

ros::int master建立聯系,與graph建立聯系,創建node名稱與內存單位

ros::NodeHandle

ros::Publisher-publisher object-advertise

publisher object-publish

 

 

下面是subscriber的代碼:

#include<ros/ros.h>

#include<std_msgs/Float64.h>

void myCallback(const std_msgs::Float64& message_holder)

{

  ROS_INFO("received value is: %f",message_holder.data);

}

 

int main(int argc, char **argv)

{

  ros::init(argc,argv,"minimal_subscriber");  

  ros::NodeHandle n;  

 

  ros::Subscriber my_subscriber_object= n.subscribe("topic1",1,myCallback);

 

  ros::spin();  

  

  return 0;  

}

subscribe需要3個參數:topic typetopic namecallback functions.

ppt1.27的鏈接

In this application all user callbacks will be called from within the ros::spin() call.  ros::spin() will not return until the node has been shutdown, either through a call to ros::shutdown() or a Ctrl-C.

spin()是輪詢函數,自帶while(ros::ok())結構在其內部,一旦運行無限次運行只能強制結束;

對應地,spinOnce()則是單次的函數。

 

 

 

當我們寫了新的代碼后,比如src文件夾下的minimal publisher.cpp,我們需要更新一下CMmakeLists.txt,使編譯的時候將新文件編譯。

此處對每個新cpp文件添加兩個語句

第一個語句是

add_executable(minimal_publisher src/minimal_publisher.cpp) 括號中

第一個參數是所取的名字,第二個參數是cpp文件的位置

第二個語句是

target_link_libraries(minimal_publisher ${catkin_LIBRARIES}) 選擇其它的庫來連接,對應cpp一開頭的include

默認都是連接catkin_LIBRARIES,這個庫包含了所有的dependencies,比如roscpp

 

使用catkin_make編譯的時候要在頂層的ws文件夾

如果想要只編譯一個Package,那么使用以下指令

catkin_make -DCATKIN_WHITELIST_PACKAGES=”minimal_nodes”

whitelist的意思是優良者名單。

 

運行nodes的過程

首先roscore 開啟各種ROS進程:啟動master、啟動parameter server、啟動調試功能

然后rourun + package namadde +node name

    

可以通過調用rqt_graph包中的rqt_graph Node來觀察當前運行的各種Node關系

rosrun rqt_graph rqt_graph

 

 

課程中有一個py寫的新的創建package的工具cs_create_pkg,包含一系列指令,可以簡化創建和編譯一個新package的過程

創建:cs_create_pkg my_minimal_node roscpp std_msgs

修改CMakeLists.txt時 只需要添加儀表

cs_add_executable(minimal_publisher_3 src/minimal_publisher.cpp)

而不用寫兩條

 

debug工具:gdb

 

 

 

自己從零寫一組Node並運行的流程

 創建package 編寫cpp文件 修改CMakeList.txt Catkin_make -DCATKINMAKE  :

  1. catkin_create_pkg my_package roscpp std::msg

創建名稱為my_packagePackage文件在src文件夾中

  1. my_package文件夾下的src文件夾中,新編輯cpp文件。

my_publisher.cpp my_subscriber.cpp

然后修改CMakeLists.txt.

add_executable(my_publisher src/minimal_publisher.cpp)  

add_executable(my_subscriber src/minimal_publisher.cpp)  

target_link_libraries(my_publisher ${catkin_LIBRARIES})

target_link_libraries(my_subscriber ${catkin_LIBRARIES})

  1. ws工程文件夾下進行編譯。

catkin_make -DCATKIN_WHITELIST_PACKAGES=”my_package”

 

可以使用rostopic工具直接發布topic的值:

rostopic  pub  -r  10  vel_cmd   std_msgs/Float64  0.1

其中 -r 為參數,10為頻率(此處10Hz),vel_cmd topic的名字,后面是類型,最后是發布的值。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM