ROS学习之话题发布python实现

1.创建工作空间并创建话题通信的功能包

mkdir -p ~/topic_ws/src      #递归创建目录,后面的名字必须是src
cd ~/topic_ws                #进入tocpic_ws目录
catkin_make                  
echo 'source ~/topic_ws/devel/setup.bash'>>~/.bashrc  #这样保障开启终端时自动配置工作区
cd src                       #进入src目录
catkin_create_pkg test_topic rospy std_msgs #创建包并添加相关依赖项

 2.新建发布节点(publisher)

在test_topic目录下的src中实现publisher.py

cd ~/topic_ws/src/test_topic/src
touch publisher.py
gedit publisher.py

在publisher.py输入代码

#!/usr/bin/env python
# BEGIN ALL
# BEGIN SHEBANG
#!/usr/bin/env python
# END SHEBANG

# BEGIN IMPORT
import rospy
# END IMPORT

# BEGIN STD_MSGS
from std_msgs.msg import Int32
# END STD_MSGS


rospy.init_node('topic_publisher')

# BEGIN PUB
pub = rospy.Publisher('counter', Int32)
# END PUB

# BEGIN LOOP
rate = rospy.Rate(2)

count = 0
while not rospy.is_shutdown():
    pub.publish(count)
    count += 1
    rate.sleep()
# END LOOP
# END ALL

3.新建接收节点(subscriber) 

在test_topic目录下的src中实现subscriber.py

cd ~/topic_ws/src/test_topic/src
touch subscriber.py
gedit subscriber.py

在subscriber.py输入代码

#!/usr/bin/env python
# BEGIN ALL
#!/usr/bin/env python


import rospy
from std_msgs.msg import Int32


# BEGIN CALLBACK
def callback(msg):
    print msg.data
# END CALLBACK


rospy.init_node('topic_subscriber')

# BEGIN SUBSCRIBER
sub = rospy.Subscriber('counter', Int32, callback)
# END SUBSCRIBER

rospy.spin()
# END ALL

4.运行节点

cd ~/ws_name
catkin_make

最后在不同的terminal中运行roscore和两个节点即可完成通讯。

roscore
rosrun test_topic publisher.py
rosrun test_topic subscriber.py

 

  • 2
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个示例代码,可以实现ROS节点的初始化,发布话题和接收话题: C++代码: ```cpp #include <ros/ros.h> #include <std_msgs/Int32.h> int main(int argc, char **argv) { // 初始化ROS节点 ros::init(argc, argv, "dispense_window_publisher"); // 创建ROS节点句柄 ros::NodeHandle nh; // 创建一个发布者,发布名称为dispense_window的话题,消息类型为std_msgs::Int32 ros::Publisher dispense_window_pub = nh.advertise<std_msgs::Int32>("dispense_window", 10); // 设置发布频率为10Hz ros::Rate loop_rate(10); int count = 0; while (ros::ok()) { // 创建一个std_msgs::Int32类型的消息 std_msgs::Int32 msg; msg.data = 1; // 发布消息 dispense_window_pub.publish(msg); // 打印发布的消息 ROS_INFO("Published: %d", msg.data); // 等待一段时间 loop_rate.sleep(); ++count; } return 0; } ``` Python代码: ```python #!/usr/bin/env python import rospy from std_msgs.msg import Int32 def callback(data): rospy.loginfo(rospy.get_caller_id() + "I heard %s", data.data) def listener(): rospy.init_node('dispense_window_subscriber', anonymous=True) rospy.Subscriber("dispense_window", Int32, callback) # spin() simply keeps python from exiting until this node is stopped rospy.spin() if __name__ == '__main__': listener() ``` 在运行C++程序之前,需要先运行roscore命令启动ROS核心。然后,运行C++程序: ``` $ rosrun <package_name> dispense_window_publisher ``` 接着,在另一个终端中运行Python程序: ``` $ rosrun <package_name> dispense_window_subscriber ``` 这样,当C++程序发布话题时,Python程序就会接收到消息并显示在终端上。你可以在Python程序中添加逻辑,根据接收到的消息来控制小车移动的目标路径。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值