您的位置:首页 > 其它

ROS-消息发布与接收

2017-07-09 17:24 309 查看
节点(Node) 是指 ROS 网络中可执行文件。接下来,我们将会创建一个发布器节点,它将不断的在 ROS 网络中广播消息。

1. 创建软件包

新建包:

catkin_create_pkg turtle_move roscpp rospy


新建msg文件:

cd src/turtle_move/
mkdir msg


新建foo.msg

int16 foo


更改package.xml文件,添加编译和运行依赖:

<build_depend>message_generation</build_depend>

<run_depend>message_runtime</run_depend>
<run_depend>message_generation</run_depend>


修改CmakeLists.txt文件:

find_package(catkin REQUIRED COMPONENTS
roscpp
rospy
message_generation  ##添加
)

## Generate messages in the 'msg' folder
add_message_files(    ##取消注释; 生成消息;
FILES
#   Message1.msg
#   Message2.msg
foo.msg   ##添加
)
## Generate added messages and services with any dependencies listed here
generate_messages(    #取消注释;
DEPENDENCIES
std_msgs  # Or other packages containing msgs
)


编译:

catkin_make


编译结果:生成C++代码, 如图:



2.编写消息发布程序

move_publisher.cpp

/* 该程序主要功能:
* 1. 初始化ROS系统, 
* 2.在turtle1/cmd_vel 话题上发布消息;
* 3.以每秒10次的频率发布消息; */
*

#include<ros/ros.h>
#include<geometry_msgs/Twist.h>

int main(int argc,char **argv)
//int main(int argc, char **argv)   // argc表示参数个数,**argv表示参数;
{
ros::init(argc,argv,"move_publisher");  //参数初始化,节点名称命名为move_publisher,运行过程节点的名称必须唯一;
ros::NodeHandle n;  //为该进程节点创建一个句柄. 第一个创建的NodeHandle会为节点进行初始化,最后一个销毁的NodeHandle则会释放该节点所用的所有资源;

//type,topic;缓冲区大小,即消息池容量为1000,如缓冲区消息大于该容量的时候就会丢弃之前发布的消息;
ros::Publisher pub=n.advertise<geometry_msgs::Twist>("turtle1/cmd_vel",1000);

geometry_msgs::Twist tw; //实例化该消息;
tw.angular.z=2;       //赋值,设置线速度/角速度;
tw.angular.x=0;
tw.angular.y=0;
tw.linear.x=2;
tw.linear.y=0;
tw.linear.z=0;

//发布频率,默认构造函数,在此设为10Hz; 会追踪自上一次调用rate.sleep()后时间的流逝,并休眠直到一个频率周期的时间;
ros::Rate rate(10);

// 发布该消息
while(ros::ok())       
//roscpp会默认生成一个SIGINT句柄,负责处理ctrl+C操作,按下时,该句柄会返回False;
{
pub.publish(tw);   // 制定需要发布的消息;
ros::spin();       // 在此处固定等待消息进入循环,而ros::spinonce()循环一次后,执行回调函数;如果程序中包含其他的回调函数,则用ros::spinonce();
}

rate.sleep();          // 到达指定时间后休眠,使得发布频率为10;
}


修改:CmakeLists.txt ,

将相关行取消注释,

###########
## Build ##
###########
## Declare a C++ executable
## Withcatkin_make all packages are built within a single CMake context
## The recommended prefix ensures that target names across packages don't collide
## add_executable(${PROJECT_NAME}_node src/turtle_move_node.cpp)

## Specify libraries to link a library or executable target against
# target_link_libraries(${PROJECT_NAME}_node
# ${catkin_LIBRARIES}
# )


改为:

###########
## Build ##
###########
## Declare a C++ executable
## Withcatkin_make all packages are built within a single CMake context
## The recommended prefix ensures that target names across packages don't collide
add_executable(move_publisher src/move_publisher.cpp)

## Specify libraries to link a library or executable target against
target_link_libr
4000
aries(move_publisher
${catkin_LIBRARIES}
)


catkin_make 进行编译:

使用指令,只编译该包:

catkin_make -DCATKIN_WHITELIST_PACKAGES="turtle_move"


消息发布编写完成。。。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  ROS