| 
 | 
 
说明:本节默认读者已经按照创建ROS工作空间操作流程创建了一个名为example的工作空间 
一、创建msg文件 
 
在~/example/src/package1路径下创建一个msg文件夹(如果写服务就创建一个srv文件夹),使用touch命令创建一个Person.msg文件(后缀名必须是.msg,消息名称最好首字母大写),相关操作命令如下 
cd ~/example/src/package1 
mkdir msg 
cd msg 
touch Person.msg在Person.msg中输入如下内容完成.msg文件的创建,msg文件是ROS独有的格式 
string name 
uint8 sex 
uint8 age 
 
uint8 unknown = 0 
uint8 male = 1 
uint8 female = 2二、修改package.xml文件 
 
需要加入编译依赖和执行依赖,编译和执行均需要相关依赖功能包,在package.xml文件中添加以下内容 
<build_depend>message_generation</build_depend>     //编译的支持项 
<exec_depend>message_runtime</exec_depend>     //生成可执行文件的支持项三、修改CMakeLists.txt文件 
 
//在功能包的CMakeList.txt文件夹下添加message_generation库,这一块主要是编译会用到的支持包 
find_package(catkin REQUIRED COMPONENTS 
  roscpp 
  rospy 
  std_msgs 
  message_generation 
) 
 
//在声明ROS消息时需要加入以下内容 
add_message_files(FILES Person.msg) 
generate_messages(DEPENDENCIES std_msgs) 
 
//取消对编译选项的注释,在原本的内容下加入message_runtime,此处为生成可执行文件所需依赖包 
catkin_package( 
#  INCLUDE_DIRS include 
#  LIBRARIES package1 
   CATKIN_DEPENDS roscpp rospy std_msgs message_runtime 
#  DEPENDS system_lib 
) 
 
// 添加编译及链接文件,增加add_dependencies表明优先编译消息头文件,避免后续使用时候编译程序报错 
add_executable(example_package1_publisher_exe src/person_publisher.cpp) 
target_link_libraries(example_package1_publisher_exe ${catkin_LIBRARIES}) 
add_dependencies(example_package1_publisher_exe ${PROJECT_NAME}_generate_messages_cpp) 
 
add_executable(example_package1_subsriber_exe src/person_subscriber.cpp) 
target_link_libraries(example_package1_subsriber_exe ${catkin_LIBRARIES}) 
add_dependencies(example_package1_subsriber_exe ${PROJECT_NAME}_generate_messages_cpp) 
 
四、发布者CPP文件 
 
#include &#34;ros/ros.h&#34; 
#include &#34;package1/Person.h&#34; 
 
int main(int argc,char **argv) 
{ 
    //ROS节点初始化 
    ros::init(argc,argv,&#34;person_publisher&#34;);   
 
    //创建句柄 
    ros::NodeHandle n;     
 
    //创建一个Publisher,发布名为/person_info的话题,消息类型为package1::Person,队列长度为10         
    ros::Publisher person_info_pub  =  n.advertise<package1::Person>(&#34;/person_info&#34;,10);  
     
    //设置循环频率(HZ),与loop_rate.sleep()函数关联,如果下一帧信息不满足频率要求则系统延时 
    ros::Rate loop_rate(1);    
 
    while(ros::ok()) 
    {   //初始化package1::Person类型的消息 
        package1::Person person_msg; 
        person_msg.name = &#34;Bob&#34;; 
        person_msg.age = 6; 
        person_msg.sex =  package1::Person::male; 
 
        //发布消息 
        person_info_pub.publish(person_msg); 
 
        ROS_INFO(&#34;Publish Person Info:  name:%s      age:%d      sex:%d &#34;, 
                            person_msg.name.c_str(),person_msg.age,person_msg.sex); 
        //按照循环频率延时 
        loop_rate.sleep(); 
    } 
    return 0; 
} 
五、接收CPP文件 
 
#include  <ros/ros.h> 
#include &#34;package1/Person.h&#34; 
 
 
void personInfoCallback(const package1::Person::ConstPtr& msg) 
{ 
    //将接收到的消息打印出来,注意在这里需要使用->指针,因为传进来的参数也是指针,当前对象还没有.属性 
    ROS_INFO(&#34;Subscribe Person Info:  name:%s      age:%d      sex:%d &#34;, 
    msg->name.c_str(),msg->age,msg->sex); 
} 
 
int main(int argc,char **argv) 
{ 
    //ROS节点初始化 
    ros::init(argc,argv,&#34;person_subscriber&#34;);   
 
    //创建句柄 
    ros::NodeHandle n;     
 
    //创建一个Publisher,发布名为/person_info的话题,消息类型为package1::Person,队列长度为10         
    ros::Subscriber person_info_sub  =  n.subscribe(&#34;/person_info&#34;,10,personInfoCallback);  
    ros::spin(); 
    return 0; 
} 
返回到主工作空间下使用使用catkin_make编译整个项目~ |   
 
 
 
 |