ROS基础四之roscpp/rospy节点编写

本文介绍了ROS中的消息通信机制,包括使用roscpp和rospy创建subscriber/advertiser、server/client以及actionlib的实例。详细讲解了各个组件的代码实现、编译运行过程,展示了如何在ROS中实现C++和Python的交互操作。
摘要由CSDN通过智能技术生成


ROS节点中主要以subscriber/advertiser、service/client、action_server/action_client形式存在,通过上述形式完成节点间的通信与组网。

subscriber/advertiser编写

subscriber与advertiser是消息通信机制中消息的订阅者与发布者,支持采用c++、python进行编写,以下将分别编写C++、python实例。

roscpp实例

  • advertiser
    在tutorial/src/tutorial_advertiser_node.cpp中添加如下代码:
#include <ros/ros.h>
#include <tutorial/RobotState.h>

int main(int argc,char **argv)
{
   
	//ros::init():初始化节点
	ros::init(argc,argv,"tutorial_advertiser_node");
	//ros::NodeHandle:创建句柄
	ros::NodeHandle nh;
	//创建publisher
	ros::Publisher pub = nh.advertise<tutorial::RobotState>("robot_state",1);
	//设置频率,20Hz
	ros::Rate r(20);
	while(ros::ok())
	{
   
		//初始化消息
		tutorial::RobotState msg;
		//设置消息中字段的值
		msg.mode_state = tutorial::RobotState::MANUAL_MODE;
		msg.hardware_state = tutorial::RobotState::NORMAL;
		//发布消息
		pub.publish(msg);
		ROS_INFO("I published a msg");
		ros::spinOnce();
		//节点进入休眠
		r.sleep();
	}
	return 0;
}
  • subscriber
    在tutorial/src/tutorial_subscriber_node.cpp中添加如下代码:
#include <ros/ros.h>
#include <tutorial/RobotState.h>

/*
* @brief: 消息回调函数,处理收到的消息
* @param msg 消息类型为tutorial::RobotState::ConstPtr的消息
* @return void 无
*/
void callback(const tutorial::RobotState::ConstPtr &msg)
{
   
	ROS_INFO("I received a message:mode_state is %d,hardware_state is %d.",msg->mode_state,msg->hardware_state);
}

int main(int argc,char **argv)
{
   
	//初始化节点
	ros::init(argc,argv,"tutorial_subscriber_node");
	//创建句柄
	ros::NodeHandle nh;
	//创建subscriber
	ros::Subscriber sub = nh.subscribe("robot_state",1,callback);
	ros::spin();
	return 0;
}
  • 编译运行节点
    在tutorial包的CMakeLists.txt添加如下代码:
add_executable(tutorial_sub_node src/tutorial_subscriber_node.cpp)
add_executable(tutorial_pub_node src/tutorial_advertiser_node.cpp)
add_dependencies(tutorial_sub_node ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS})
add_dependencies(tutorial_pub_node ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS})
target_link_libraries(tutorial_sub_node ${catkin_LIBRARIES})
target_link_libraries(tutorial_pub_node ${catkin_LIBRARIES})

保存后编译即可。

$ catkin_make

分别打开三个终端,运行如下指令:
运行roscore

roscore

在这里插入图片描述

运行advertiser

$ cd ~/ros_ws/
$ source devel/setup.bash
$ rosrun tutorial tutorial_pub_node

在这里插入图片描述

运行subscriber

$ cd ~/ros_ws/
$ source devel/setup.bash
$ rosrun tutorial tutorial_sub_node

在这里插入图片描述

rospy实例

在tutorial包中新建文件夹命名为script,并打开script文件夹添加tutorial_sub.py和tutorial_pub.py,添加如下代码:

  • advertiser:tutorial_pub.py
#!/usr/bin/env python
import rospy
from tutorial.msg import RobotState

def talker():
	rospy.init_node("tutorial_pub_node",anonymous=True)
	pub = rospy.Publisher("robot_state",RobotState,queue_size=1);
	rate = rospy.Rate(20);
	while not rospy.is_shutdown():
		msg = RobotState()
		msg.mode_state = 0
		msg.hardware_state = 0
		pub.publish(msg)
		rospy.loginfo("I publish a msg")
		rate.sleep()
if __name__ == '__main__':
	try:
		talker()
	except rospy.ROSInterruptException:
		pass
  • subscriber:tutorial_sub.py
#!/usr/bin/env python
import rospy
from tutorial.ms
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值