step 1:创建工作空间:
参见官网 http://wiki.ros.org/catkin/Tutorials/create_a_workspace
$ mkdir -p ~/dev/catkin_ws/src
$ cd ~/dev/catkin_ws/src
$ catkin_init_workspace
$ cd ~/dev/catkin_ws
$ catkin_make
$ source devel/setup.bash
step 2:创建ROS功能包:
$ cd ~/dev/catkin_ws/src
$ catkin_create_pkg chapter2_tutorials std_msgs roscpp
编译:
$ cd ~/dev/catkin_ws
$ catkin_make
step 3:创建节点:
此步需要使用 vim 如果未安装 需自行安装
$ sudo apt-install vim
创建节点
$ roscd chapter2_tutorials/src
$ vim example1_a.cpp
利用 vim 编写 example1_a.cpp 文件 内容如下:
#include "ros/ros.h"
#include "std_msgs/String.h"//
#include <sstream>///包含要使用的文件类型
int main(int argc, char **argv)
{
ros::init(argc, argv, "example1_a");//启动该节点并设置其名称,名称必须唯一
ros::NodeHandle n;//设置节点进程的句柄
ros::Publisher pub = n.advertise<std_msgs::String>("message", 1000);//将节点设置成发布者,并将所发布>主题道类型和名称告知节点管理器。第一个参数是消息的名称:message,第二个是缓冲区道大小。如果主题发布数据速度较快
,那么将缓冲区设置为1000个消息。
ros::Rate loop_rate(10);//设置发送数据道频率为10Hz
while (ros::ok())//当收到Ctrl+C的按键消息或ROS停止当前节点运行时,ros::ok()库会执行停止节点运行道命令
{
//创建一个消息变量,变量类型必须符合发送数据的要求
std_msgs::String msg;
std::stringstream ss;
ss << " I am the example1_a node ";
msg.data = ss.str();
//ROS_INFO("%s", msg.data.c_str());
pub.publish(msg);//消息被发布
ros::spinOnce();//如果一个订阅者出现,ROS就会更新和读取所有主题
loop_rate.sleep();//按照10Hz的频率将程序挂起
}
return 0;
}
再同样编写example1_b.cpp
$ vim example1_b.cpp
#include "ros/ros.h"
#include "std_msgs/String.h"
void messageCallback(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, "example1_b");
ros::NodeHandle n;
/创建一个订阅者,并从主题获取以message为名称的消息数据。设置缓冲区为1000个消息,处理消息句柄的回调函数>为messageCallback
ros::Subscriber sub = n.subscribe("message", 1000, messageCallback);
ros::spin()库是节点读取数据道消息响应循环,当消息到达的时候,回调函数就会被调用。当按下Ctrl+C时,节点会退出消息循环,于是循环结束。
ros::spin();
return 0;
}
vim 的 基础操作可参见:vim操作
step 4:编译节点:
$ rosed chapter2_tutorials CMakeList.txt //如果你这步没有出现错误,恭喜你,但是我在执行这步时出现问题:不能找见chapter2_tutorials这个包
解决方法如下:
之后再运行上一个命令,在CMakeLists.txt后面添加
include_directories(
include
${catkin_INCLUDE_DIRS}
)
add_executable(example1_a src/example1_a.cpp)
add_executable(example1_b src/example1_b.cpp)
add_dependencies(example1_a
chapter2_tutorials_generate_messages_cpp)
add_dependencies(example1_b
chapter2_tutorials_generate_messages_cpp)
target_link_libraries(example1_a ${catkin_LIBRARIES})
target_link_libraries(example1_b ${catkin_LIBRARIES})
step 5: 运行:
$ cd ~/dev/catkin_ws
$ catkin_make --pkg chapter2_tutorials
$ roscore
再打开一个shell
$ rosrun chapter2_tutorials example1_a
再打开一个shell
$ rosrun chapter2_tutorials example1_b
如果运行成功会得到:
参考资料:
Mastering ROS for Robotics Programming(PACKT,2015)