玩的几个实例,自己敲了一些,代码没问题的情况下,有些编译成功,生成可执行文件,有些编译成功了,然而没有可执行文件的生成。故总结一下配置文件的具体设置。
1.功能包的创建
安装之后,工作空间的安装与配置我不累述了,如果你的项目较小,可以在一个工作空间里建多个功能包使用即可。估计大家都叫catkin_ws了,我测试的工作空间另取了myros_ws(注意,catkin_init_workspace初始化catkin构建系统目录很重要).
a.cd ~/myros_ws/src 进入src中
b.catkin_create_pkg test_hello std_msgs roscpp
(注意,这里后面使用2个依赖包,代表test_hello功能包要使用到它们,虽然后面可在packagexml,CmakeLists.txt配置,但我按网上配置之后并不成功,对比系统发现仍然少配置了几项,导致可执行文件生成失败。推荐使用我的方法)
c.cd test_hello 进入功能包中
2.配置文件的具体配置
a.2个主要配置文件之package.xml的配置
(
<?xml version="1.0"?>
<package format="2">
<name>frist_ros_pkg</name>
<version>0.0.0</version>
<description>The frist_ros_pkg package</description>
<maintainer email="DragonJJ@yeah.net">jcl</maintainer>
<license>BSD</license>
<buildtool_depend>catkin</buildtool_depend>
<build_depend>roscpp</build_depend>
<build_depend>std_msgs</build_depend>
<build_export_depend>roscpp</build_export_depend>
<build_export_depend>std_msgs</build_export_depend>
<exec_depend>roscpp</exec_depend>
<exec_depend>std_msgs</exec_depend>
<export>
</export>
</package>
如果你的b步骤是按我的方式创建功能包,就没什么好配置的。就是协议,邮箱写下即可。注意:buildtool_depend,build_depend,build_export_depend,exec_depend这些是主要东西)
b.CmakeList.txt配置
(
cmake_minimum_required(VERSION 2.8.3)
project(frist_ros_pkg)
find_package(catkin REQUIRED COMPONENTS roscpp std_msgs)
catkin_package( CATKIN_DEPENDS roscpp std_msgs)
include_directories (${catkin_INCLUDE_DIRS})
add_executable(hello_node src/hello_node.cpp)
target_link_libraries(hello_node ${catkin_LIBRARIES})
标准模板有很多可配置选项,我没使用则删除了。第一个是make的最低版本,注意自己的Cmake编译系统要高于这个。第三个,功能包依赖,还是1中的b步骤执行,这个系统也会配好。第4个一样。注意:add_executable 是构建可执行文件,target_link_libraries是可执行文件与库的链接。这2个重要)
3.源码编写
#include <ros/ros.h> //必用
#include <std_msgs/String.h> //使用到功能包里的Stringd类,故头文件引用进来
#include <sstream>
int main(int argc, char **argv)
{
ros::init(argc,argv,"hello_node"); //初始化,节点名为hello_node
ros::NodeHandle nh; //句柄,节点在master注册使用
ros::Publisher chatter_pub = nh.advertise<std_msgs::String>("say_hello_world",1000); //发布者,话题为say_hello_world,最大缓冲区1000
ros::Rate loop_rate(1); //设置频率1
int count = 0;
while(ros::ok()) //ok()函数3种情况不成立,句柄注销完,signal(Ctral C),外节点关闭
{
std_msgs::String msg;
std::stringstream ss;
ss << "helloworld!" << count;
msg.data = ss.str();
ROS_INFO("%s",msg.data.c_str());
chatter_pub.publish(msg);
ros::spinOnce(); //回环一次
loop_rate.sleep(); //休眠,避免cpu全力工作,统一在规定的频率上
++count;
}
return 0;
}