创建ROS功能包的命令如下:
catkin_create_pkg [功能包名称] [依赖功能包1] [依赖功能包2]
实践:
cd ~/catkin_ws/src
catkin_create_pkg my_first_ros_pkg std_msgs roscpp
于是会在my_first_ros_pkg文件夹下自动生成package.xml和CMakeLists.txt文件,修改CMakeLists.txt文件:
cmake_minimum_required(VERSION 2.8.3)
project(my_first_ros_pkg)
//注意这里的名字应该与package.xml中的功能包名字相同 否则会报错
find_package(catkin REQUIRED COMPONENTS
roscpp
std_msgs
)
catkin_package(CATKIN_DEPENDS roscpp std_msgs)
include_directories(${catkin_INCLUDE_DIRS})
add_executable(lin src/hello_world_node.cpp)
target_link_libraries(lin ${catkin_LIBRARIES})
//注意这里生成的可执行文件为lin 也就是我们rosrun时执行的文件 它并不是节点的名字
下面是hello_world_node.cpp代码:
#include<ros/ros.h>
#include<std_msgs/String.h>
#include<sstream>
int main(int argc,char** argv)
{
ros::init(argc,argv,"hello_world_node1"); //注意:节点名称是在这里定义的
ros::NodeHandle nh;
//这里定义的是话题名称
ros::Publisher chatter_pub=nh.advertise<std_msgs::String>("say_hello_world",1000);
ros::Rate loop_rate(10);
int count=0;
while(ros::ok())
{
std_msgs::String msg;
std::stringstream ss;
ss<<"hello world!"<<count;
msg.data=ss.str();
ROS_INFO("%s",msg.data.c_str());
chatter_pub.publish(msg);
ros::spinOnce();
loop_rate.sleep();
++count;
}
return 0;
}
这里主要是想记录一下,节点名字、话题名字、功能包名字、以及可执行文件的名字是什么关系以及它们是在哪里定义的,我们rosrun执行后面跟的是功能包名字+可执行文件名字,而rqt_graph中显示的是节点名字。不要把这两者搞混了。