roscpp/rospy节点编写
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