|
说明:本节默认读者已经按照创建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编译整个项目~ |
|