ROS编程与导航---ROS 基础 1
1 ROS基础
1.1 节点
node (via python)
STEP1 :创建一个ROS包,包名 node
STEP2:在src文件夹下新建发布端文件 node_sub.py
// node publisher
//
#!/usr/bin/env python
'''node ROS Node via python'''
import rospy
from std_msgs.msg import String
def talker():
'''node Publisher'''
pub = rospy.Publisher('chatter', String, queue_size=10)
rospy.init_node('node', anonymous=True)
rate = rospy.Rate(10) # 10hz
while not rospy.is_shutdown():
hello_str = "hello world %s" % rospy.get_time()
rospy.loginfo(hello_str)
pub.publish(hello_str)
rate.sleep()
if __name__ == '__main__':
try:
talker()
except rospy.ROSInterruptException:
pass
STEP3:在src文件夹下新建订阅端文件 node_sub.py
// node subscriber
#!/usr/bin/env python
'''node ROS Node'''
import rospy
from std_msgs.msg import String
def callback(data):
'''node Callback Function'''
rospy.loginfo(rospy.get_caller_id() + "I heard %s", data.data)
def listener():
'''node Subscriber'''
# In ROS, nodes are uniquely named. If two nodes with the same
# node are launched, the previous one is kicked off. The
# anonymous=True flag means that rospy will choose a unique
# name for our 'listener' node so that multiple listeners can
# run simultaneously.
rospy.init_node('node', anonymous=True)
rospy.Subscriber("chatter", String, callback)
# spin() simply keeps python from exiting until this node is stopped
rospy.spin()
if __name__ == '__main__':
listener()
STEP4: 修改node文件夹下的CMakeLists.txt 文件
// node CMakeLists.txt
cmake_minimum_required(VERSION 3.0.2)
project(node)
find_package(catkin REQUIRED)
catkin_package()
include_directories()
STEP5: 在不同终端分别运行
roscore
rosrun node node_pub.py
rosrun node node_sub.py
发布端截图
订阅端截图
node (via c++)
STEP1:创建一个ROS包,包名 cplus_node
STEP2:在src文件夹下新建发布端文件 cplus_node_pub.cpp
// node publisher
#include "ros/ros.h"
#include "std_msgs/String.h"
#include <sstream>
int main(int argc, char *argv[])
{
ros::init(argc, argv, "cplus_node_publisher");
ros::NodeHandle n;
ros::Publisher chatter_pub = n.advertise<std_msgs::String>("chatter", 1000);
ros::Rate loop_rate(10);
int count = 0;
while (ros::ok())
{
std_msgs::String msg;
std::stringstream ss;
ss << "hello world " << count;
msg.data = ss.str();
ROS_INFO("%s", msg.data.c_str());
chatter_pub.publish(msg);
ros::spinOnce();
loop_rate.sleep();
++count;
}
return 0;
}
STEP 3 在src文件夹下新建订阅端文件 cplus_node_sub.cpp
// node subscriber
#include "ros/ros.h"
#include "std_msgs/String.h"
using namespace std;
void chatterCallback(const std_msgs::String& msg)
{
string subinfo;
subinfo=msg.data;
ROS_INFO("I heard: [%s]", subinfo.c_str());
}
int main(int argc, char *argv[])
{
ros::init(argc, argv, "cplus_node_subscriber");
ros::NodeHandle n;
ros::Subscriber sub = n.subscribe("chatter", 1000, &chatterCallback);
ros::spin();
return 0;
}
STEP 4 修改node文件夹下的CMakeLists.txt 文件
cmake_minimum_required(VERSION 3.0.2)
project(cplus_node)
find_package(catkin REQUIRED )
find_package(catkin REQUIRED COMPONENTS roscpp)
catkin_package()
include_directories( include ${catkin_INCLUDE_DIRS})
add_executable(cplus_node_pub src/cplus_node_pub.cpp)
add_dependencies(cplus_node_pub ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS})
target_link_libraries(cplus_node_pub ${catkin_LIBRARIES} )
add_executable(cplus_node_sub src/cplus_node_sub.cpp )
add_dependencies(cplus_node_sub ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS})
target_link_libraries(cplus_node_sub ${catkin_LIBRARIES})
STEP 5: 编译 cplus_node_pub.cpp 及 cplus_node_sub.cpp
STEEP6: 在不同终端分别运行
roscore
rosrun cplus_node cplus_node_pub
rosrun cplus_node cplus_node_sub
发布端截图
订阅端截图