版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_28306361/article/details/85553691
ROS中C++编写发布、python编写订阅
因为在做项目的过程中需要用到C++和Python程序,所以想要尝试一下在ROS中能不能用C++编写消息的发布者,Python编写消息的订阅者。
源程序
mytalker.cpp
#include"ros/ros.h"
#include"std_msgs/String.h"
#include<sstream>
#include<string.h>
using namespace std;
int main(int argc, char** argv)
{
ros::init(argc, argv, "mytalker"); // 节点名称
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 "<<count;
msg.data = ss.str();
ROS_INFO("Publish %s\n", msg.data.c_str() );
chatter_pub.publish(msg);
ros::spinOnce();
loop_rate.sleep();
++count;
}
return 0;
}
mylisten2.py
#!/usr/bin/env python
import rospy
from std_msgs.msg import String
def callback(data):
print("Received \n")
def listener():
rospy.init_node('listener', anonymous= True)
rospy.Subscriber("chatter", String, callback)
rospy.spin()
if __name__ == '__main__':
listener()
程序比较简单,就不解读了
运行结果
发布者
订阅者
可以看到,即使我们用C++编写消息的发布者,用python编写消息的订阅者,消息还是能正常传输,并且能够执行相应的回调函数。
相关配置
mylisten2.py文件的位置。应当先在包(比如mytest)下面创建一个scripts文件夹,然后将mylisten2.py文件放在scripts文件夹下就行,在CMakeList中,只需要在add_executable和target_link_libraries中加入mylistener.cpp相应的内容就行,不需要加入python文件的相关编译内容。
include_directories(include ${catkin_INCLUDE_DIRS})
add_executable(mytalker src/mytalker.cpp)
target_link_libraries(mytalker ${catkin_LIBRARIES})
add_dependencies(mytalker ${PROJECT_NAME}_generate_messages_cpp)
#add_executable(mylistener src/mylistener.cpp)
#target_link_libraries(mylistener ${catkin_LIBRARIES})
#add_dependencies(mytalker ${PROJECT_NAME}_generate_messages_cpp)
ROS真的好方便,这样C++和Python就能随便用了