1/自定义消息类型与编译
(1)在功能包里面创建一个msg文件夹,添加文档,文档名字为生成的头文件名和消息类型名,功能包名为消息类型的作用域.
在msg文件夹下创建一个Person.msg文件,将下列代码复制进去:
string name
uint8 sex
uint8 age
uint8 unknown = 0
uint8 male = 1
uint8 female = 2
生成的头文件在devel文件夹里面添加方式为#include<package_name/Person.h>
注:前三行是ROS提供的基础数据类型;后三行是定义的常量,发布和订阅数据时可直接使用,相当于C++中的宏定义.
(2)
在功能包清单 package.xml 中添加功能包依赖:编译依赖 + 运行依赖
<build_depend>message_generation</build_depend>
<run_depend>message_runtime</run_depend>
(3)在编译规则 CMakeList.txt 中添加编译选项
在 find_package 中添加 消息生成 依赖的功能包 message_generation,如下:
find_package(catkin REQUIRED COMPONENTS
roscpp
rospy
std_msgs
message_generation //添加消息类型时独有的
)
在 catkin_package 中设置 catkin 依赖的功能包,如下:
catkin_package(
CATKIN_DEPENDS roscpp rospy std_msgs message_runtime
)
在 add_message_files 和 generate_messages 中设置需要编译的.msg文件,如下:
add_message_files(
FILES
Person.msg
)
generate_messages(
DEPENDENCIES
std_msgs
)
添加要编译的文件
add_executable(pub_msg src/pub_msg.cpp)
add_dependencies(pub_msg KaTeX parse error: Expected '}', got 'EOF' at end of input: {{PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS})
target_link_libraries(pub_msg ${catkin_LIBRARIES})
add_executable(sub_msg src/sub_msg.cpp)
add_dependencies(sub_msg KaTeX parse error: Expected '}', got 'EOF' at end of input: {{PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS})
target_link_libraries(sub_msg ${catkin_LIBRARIES})
****最后的Cmakelistx.txt****
----------------
```cpp
cmake_minimum_required(VERSION 2.8.3)
project(self_def_msg_pub)
find_package(catkin REQUIRED COMPONENTS
message_generation
roscpp
rospy
std_msgs
)
## Generate messages in the 'msg' folder
add_message_files(
FILES
Score.msg
Person.msg
)
## Generate added messages and services with any dependencies listed here
generate_messages(
DEPENDENCIES
std_msgs
)
catkin_package(
CATKIN_DEPENDS
message_runtime
)
## Specify additional locations of header files
## Your package locations should be listed before other locations
include_directories(
# include
${catkin_INCLUDE_DIRS}
)
add_executable(pub_msg src/pub_msg.cpp)
add_dependencies(pub_msg ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS})
target_link_libraries(pub_msg ${catkin_LIBRARIES})
add_executable(sub_msg src/sub_msg.cpp)
add_dependencies(sub_msg ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS})
target_link_libraries(sub_msg ${catkin_LIBRARIES})
发布消息代码
#include<ros/ros.h>
#include<self_def_msg_pub/Person.h>
int main(int argc ,char **argv)
{
ros::init (argc ,argv,"person_publisher");
ros::NodeHandle n;
ros::Publisher person_info_pub = n.advertise<self_def_msg_pub::Person> ("/person_info",10);
ros::Rate loop_rate(100);
int count= 0;
while(ros::ok())
{
self_def_msg_pub::Person person_msg;
person_msg.name ="Tom";
person_msg.age = 18;
person_msg.sex = self_def_msg_pub::Person::male;
person_info_pub.publish(person_msg);
ROS_INFO("publish person info: name:%s age:%d sex:%d",person_msg.name.c_str(),person_msg.age,person_msg.sex );
loop_rate.sleep();
}
return 0;
}
**订阅消息代码**
```cpp
#include<ros/ros.h>
#include<self_def_msg_pub/Person.h>
void personinfocallback(const self_def_msg_pub::Person::ConstPtr& msg )
{
ROS_INFO("Subcribe Person Info :name:%s age:%d sex:%d", msg->name.c_str() , msg->age ,msg->sex);
}
int main(int argc ,char **argv)
{
//初始化ros结点
ros::init (argc ,argv,"person_subscriber");
//创建结点句柄
ros::NodeHandle n;
//创建一个Subscriber 订阅名为/person_info的topic
ros::Subscriber person_info_sub = n.subscribe ("/person_info",10,personinfocallback);
//循环等待回调函数
ros::spin();
return 0;
}
python发布代码
import rospy
from learning_topic.msg import Person
def velocity_publisher():
rospy.init_node('person_publisher', anonymous=True)
person_info_pub = rospy.Publisher('/person_info', Person, queue_size=10)
rate = rospy.Rate(10)
while not rospy.is_shutdown():
person_msg = Person()
person_msg.name = "Tom";
person_msg.age = 18;
person_msg.sex = Person.male;
person_info_pub.publish(person_msg)
rospy.loginfo("Publsh person message[%s, %d, %d]",
person_msg.name, person_msg.age, person_msg.sex)
rate.sleep()
if __name__ == '__main__':
try:
velocity_publisher()
except rospy.ROSInterruptException:
pass
python订阅代码
import rospy
from learning_topic.msg import Person
def personInfoCallback(msg):
rospy.loginfo("Subcribe Person Info: name:%s age:%d sex:%d",
msg.name, msg.age, msg.sex)
def person_subscriber():
rospy.init_node('person_subscriber', anonymous=True)
rospy.Subscriber("/person_info", Person, personInfoCallback)
rospy.spin()
if __name__ == '__main__':
person_subscriber()```
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)