一、自定义消息类型
1、msg文件夹下定义消息名称speed_remote.msg,写入代码
#标准格式的头信息
uint32 seq
time stamp
string frame_id
int16 left
int16 right
int16 stop
int16 plat
2、在功能包清单 package.xml 中添加功能包依赖:编译依赖 + 运行依赖
<build_depend>message_generation</build_depend>
<build_export_depend>message_generation</build_export_depend>
<exec_depend>message_runtime</exec_depend>
3、在编译规则 CMakeList.txt 中添加编译选项
find_package(catkin REQUIRED COMPONENTS
roscpp
rospy
std_msgs
message_generation
serial
)
add_message_files(
FILES
speed_remote.msg
)
generate_messages(
DEPENDENCIES
std_msgs
)
catkin_package(
# INCLUDE_DIRS include
# LIBRARIES serial_port
CATKIN_DEPENDS roscpp serial rospy std_msgs message_runtime
# DEPENDS system_lib
)
add_executable(sBus src/sBus.cpp)
add_dependencies(sBus ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS})
target_link_libraries(sBus ${catkin_LIBRARIES})
二、发布消息
//sBus.cpp
#include <ros/ros.h>
#include <iostream>
#include <serial_port/speed_remote.h>
int main(int argc, char** argv)
{
ros::init(argc, argv, "sBus");
//创建句柄(虽然后面没用到这个句柄,但如果不创建,运行时进程会出错)
ros::NodeHandle n;
//创建一个Publisher 发布名为speed_remote的topic 消息类型为 serial_port:: speed_remote,队列的长度为10
//serial_port:: speed_remote 其中sserial_port为功能包名 speed_remote为自定义的消息文件名 在devel里面生成头文件
ros::Publisher speed_remote_pub = n.advertise<serial_port:: speed_remote> ("/speed_remote",10);
//设置循环频率
ros::Rate loop_rate(100); //设置的越大 发布订阅的频率越大
//初始化serial_port:: speed_remote类型的消息
serial_port::speed_remote msg_speed_remote;
msg_speed_remote.left=1;
msg_speed_remote.right=2;
msg_speed_remote.plat=3;
msg_speed_remote.stop=4;
//发布消息
speed_remote_pub.publish(msg_speed_remote);
loop_rate.sleep();
return 0;
}
三、订阅消息
//driving_control.cpp
#include <ros/ros.h>
#include <iostream>
#include <serial_port/speed_remote.h>
void speedRemoteCallback(const serial_port::speed_remote::ConstPtr& msg )
{
//msg为解析的遥控信息msg->left左轮转速, msg->right右轮转速,msg->plat云台转动(正前方为0,左边-1,右边1),msg->stop急停(1)
ROS_INFO("Subcribe Person Info : %d %d %d %d", msg->left, msg->right,msg->plat,msg->stop);
}
int main(int argc, char** argv)
{
ros::init(argc, argv, "driving_control");
//创建句柄(虽然后面没用到这个句柄,但如果不创建,运行时进程会出错)
ros::NodeHandle n;
//创建一个Subscriber 订阅名为/speed_remote的topic
ros::Subscriber speed_remote_sub = n.subscribe ("/speed_remote",10,speedRemoteCallback);
//循环等待回调函数
ros::spin();
return 0;
}