如何寫一個publisher
Publishers需要2到3個參數:topic type、topic name、queue 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);
}
}
/*以上為代碼*/
init是ros里的一個方法,NodeHandle和Pbulisher是兩種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 type、topic name、callback 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 :
- catkin_create_pkg my_package roscpp std::msg
 
創建名稱為my_package的Package文件在src文件夾中
- 在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})
- 在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的名字,后面是類型,最后是發布的值。
