ros实践(一):编写一个自己的功能包

创建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中显示的是节点名字。不要把这两者搞混了。

猜你喜欢

转载自blog.csdn.net/qq_27452279/article/details/90112729