roscd beginner_tutorials
mkdir -p src
cd src
touch talker.cpp
#include "ros/ros.h"
#include "std_msgs/String.h"
#include
int main(int argc, char **argv)
{
ros::init(argc, argv, "talker"); // 初始化ROS
ros::NodeHandle n; // 与ROS系统通信的主要接入点
// 主节点将通知任何想订阅该主题名的人, 与该节点建立点对点连接, 队列大小1000
ros::Publisher chatter_pub = n.advertise("chatter",1000);
ros::Rate loop_rate(10); // 10Hz发布
int count = 0; // 统计已发送消息数量
// 当取消(ctrl+c)/有同名节点/ros::shutdown()在别处调用/NodeHandles崩溃时, 返回false
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); // 广播消息到任意连接节点, 参数为消息, 必须是advertise处理过的
ros::spinOnce(); // 此处无用,因为无回调(有订阅者则需要)
loop_rate.sleep(); // 10Hz
count++;
}
return 0;
}
touch listener.cpp
#include "ros/ros.h"
#include "std_msgs/String.h"
// 新消息到达聊天室主题时调用
void chatterCallback(const std_msgs::String::ConstPtr& msg)
{
ROS_INFO("I heard: [%s]", msg->data.c_str());
}
int main(int argc, char **argv)
{
ros::init(argc, argv, "listener");
ros::NodeHandle n;
// 订阅chatter话题, 队列大小,
ros::Subscriber sub = n.subscribe("chatter", 1000, chatterCallback);
ros::spin(); // 循环, 当取消(ctrl+c)/有同名节点/ros::shutdown()在别处调用/NodeHandles崩溃时打断
return 0;
}
补充
cmake_minimum_required(VERSION 3.0.2)
project(beginner_tutorials)
find_package(catkin REQUIRED COMPONENTS
roscpp
rospy
std_msgs
message_generation
genmsg
)
add_service_files(DIRECTORY srv
FILES
AddTwoInts.srv
)
add_message_files(DIRECTORY msg
FILES
Num.msg
)
generate_messages(
DEPENDENCIES
std_msgs
)
catkin_package(
CATKIN_DEPENDS roscpp std_msgs message_runtime
)
include_directories(
# include
${catkin_INCLUDE_DIRS}
)
add_executable(talker src/talker.cpp)
target_link_libraries(talker ${catkin_LIBRARIES})
add_dependencies(talker beginner_tutorials_generate_messages_cpp)
add_executable(listener src/listener.cpp)
target_link_libraries(listener ${catkin_LIBRARIES})
add_dependencies(listener beginner_tutorials_generate_messages_cpp)
catkin_make
编译好的文件在~/catkin_ws/devel/lib/beginner_tutorials
roscd beginner_tutorials
mkdir scripts
cd scripts
touch talker.py
#!/usr/bin/env python
#coding=utf-8
import rospy
from std_msgs.msg import String
def talker():
pub = rospy.Publisher('chatter',String,queue_size=10) # 使用string类型发布到chatter话题, 队列大小10
rospy.init_node('talker',anonymous=True) # 节点名字, 名字后加随机数确保有独特的节点名
rate = rospy.Rate(10) # 10hz
while not rospy.is_shutdown():
hello_str = "I have sent %s times" % rospy.get_time()
rospy.loginfo(hello_str) # 写入log文件, ->rosout->_console
pub.publish(hello_str)
rate.sleep()
if __name__ == '__main__':
try:
talker()
except rospy.ROSInterruptException:
pass
#!/usr/bin/env python
import rospy
from std_msgs.msg import String
def callback(data):
rospy.loginfo(rospy.get_caller_id() + "I get %s", data.data)
def listener():
rospy.init_node('listener', anonymous=True)
rospy.Subscriber("chatter", String, callback)
rospy.spin()
if __name__ == "__main__":
listener()
补充CMakeList.txt
catkin_install_python(PROGRAMS
scripts/talker.py
scripts/listener.py
DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION}
)
roscore
cd ~/catkin_ws
source ./devel/setup.bash
rosrun beginner_tutorials talker
rosrun beginner_tutorials talker.py
rosrun beginner_tutorials listen
rosrun beginner_tutorials listen.py
#!/usr/bin/env python python2执行环境
#coding=utf-8 有utf8中文注释时添加