ROS : 话题通信 (Python)

ROS : 话题通信
Creating a workspace for catkin
添加环境变量
Creating a ROS Package
话题编程
话题通信模型
自定义话题消息
话题编程流程
话题编程 Demo(发布者每 100ms 发布实时的时间戳,订阅者实时监听发布者发布的内容)
自定义话题消息
话题编程流程
Creating a workspace for catkin
链接: http://wiki.ros.org/catkin/Tutorials/create_a_workspace

$ mkdir -p ~/catkin_ws/src
$ cd ~/catkin_ws/
$ catkin_make

添加环境变量

链接:

$ echo "source ~/catkin_ws/devel/setup.bash" >> ~/.bashrc  
$ source ~/.bashrc 

Creating a ROS Package

链接: ROS/Tutorials/CreatingPackage - ROS Wiki

# Creating a catkin Package
$ cd ~/catkin_ws/src
$ catkin_create_pkg beginner_tutorials std_msgs rospy roscpp

# Building a catkin workspace and sourcing the setup file(上面已添加环境变量,此处无需重复添加)
$ cd ~/catkin_ws
$ catkin_make

话题编程

话题通信模型

 

自定义话题消息
1)新建 msg 消息目录,定义 msg 消息
2)在 package.xml 中添加功能包依赖
3)在 CMakeLists.txt 添加编译选项

话题编程流程
1)创建发布者

初始化 ROS 节点
向 ROS Master 注册节点信息,包括发布的话题名和话题中的消息类型
按照一定频率循环发布消息
2)创建订阅者

初始化 ROS 节点
订阅需要的话题
循环等待话题消息,接收到消息后进入回调函数
在回调函数中完成消息处理
3)运行可执行程序

打开终端一,启动 ros master
$ roscore

打开终端二,创建发布者
$ rosrun beginner_tutorials talker.py

打开终端三,创建订阅者
$ rosrun beginner_tutorials listener.py

话题编程 Demo(发布者每 100ms 发布实时的时间戳,订阅者实时监听发布者发布的内容)
自定义话题消息

1)新建 msg 消息目录,定义 msg 消息

$ roscd beginner_tutorials/
$ mkdir msg
$ cd msg/
$ touch Num.msg
$ rosed beginner_tutorials Num.msg
$ cat Num.msg
int64 num

链接: vi/vim 使用(Linux)

2)在 package.xml 中添加功能包依赖

$ rosed beginner_tutorials package.xml
$ tail -n +62 ../package.xml | head -n 2
  <build_depend>message_generation</build_depend>
  <exec_depend>message_runtime</exec_depend>

3)在 CMakeLists.txt 添加编译选项

$ rosed beginner_tutorials CMakeLists.txt
  • 在 CMakeLists.txt 文件中增加对 message_generation 的依赖
$ tail -n +10 ../CMakeLists.txt | head -n 6
find_package(catkin REQUIRED COMPONENTS
  roscpp
  rospy
  std_msgs
  message_generation
)
  • 增加消息文件
$ tail -n +50 ../CMakeLists.txt | head -n 7
## Generate messages in the 'msg' folder
add_message_files(
  FILES
  Num.msg
#   Message1.msg
#   Message2.msg
)
  • 增加消息生成包
$ tail -n +107 ../CMakeLists.txt | head -n 6
catkin_package(
#  INCLUDE_DIRS include
#  LIBRARIES beginner_tutorials
  CATKIN_DEPENDS roscpp rospy std_msgs message_runtime
#  DEPENDS system_lib
)
  • 添加包含 msgs 的软件包依赖
$ tail -n +72 ../CMakeLists.txt | head -n 5
## Generate added messages and services with any dependencies listed here
generate_messages(
  DEPENDENCIES
  std_msgs
)

 4)编译代码

$ cd ~/catkin_ws
$ catkin_make

5)检查服务

$ rosmsg show beginner_tutorials/Num
int64 num

话题编程流程

1)创建发布者

$ roscd beginner_tutorials
$ mkdir scripts
$ cd scripts/

$ touch talker.py
$ chmod +x talker.py
$ rosed beginner_tutorials talker.py
$ cat talker.py
#!/usr/bin/env python
#coding=utf-8

#import roslib;roslib.load_manifest('beginner_tutorials')
import rospy
from beginner_tutorials.msg import Num

def talker():
    pub = rospy.Publisher('chatter', Num, queue_size = 10)
    rospy.init_node('talker', anonymous = True)
    rate = rospy.Rate(10)
    while not rospy.is_shutdown():
        mynum = int(rospy.get_time())
        msg = Num()
        msg.num = mynum
        rospy.loginfo(mynum)
        pub.publish(msg)
        rate.sleep()

if __name__ == '__main__':
    try:
        talker()
    except rospy.ROSInterruptException:
        pass

2)创建订阅者

$ touch listener.py
$ chmod +x listener.py
$ rosed beginner_tutorials listener.py
$ cat listener.py
#!/usr/bin/env python
#coding=utf-8


import rospy
from beginner_tutorials.msg import Num

def callback(data):
    rospy.loginfo(rospy.get_caller_id() + 'I heard %d', data.num)

def listener():

    # In ROS, nodes are uniquely named. If two nodes with the same
    # name 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('listener', anonymous=True)

    rospy.Subscriber('chatter', Num, callback)

    # spin() simply keeps python from exiting until this node is stopped
    rospy.spin()

if __name__ == '__main__':
    listener()

3)运行可执行程序

# 打开终端一,启动 ros master
$ roscore


# 打开终端二,创建发布者
$ rosrun beginner_tutorials talker.py
[INFO] [1566976295.506557]: 1566976295
[INFO] [1566976295.606966]: 1566976295
[INFO] [1566976295.706854]: 1566976295
[INFO] [1566976295.806853]: 1566976295
[INFO] [1566976295.906801]: 1566976295
[INFO] [1566976296.006810]: 1566976296
[INFO] [1566976296.106888]: 1566976296
[INFO] [1566976296.206844]: 1566976296
[INFO] [1566976296.306871]: 1566976296
[INFO] [1566976296.406712]: 1566976296
[INFO] [1566976296.506850]: 1566976296
[INFO] [1566976296.606913]: 1566976296
[INFO] [1566976296.706885]: 1566976296
[INFO] [1566976296.806945]: 1566976296
[INFO] [1566976296.906730]: 1566976296
[INFO] [1566976297.006825]: 1566976297
[INFO] [1566976297.106858]: 1566976297
[INFO] [1566976297.206864]: 1566976297


# 打开终端三,创建订阅者
$ rosrun beginner_tutorials listener.py
[INFO] [1566976295.507102]: /listener_20307_1566976294990I heard 1566976295
[INFO] [1566976295.607586]: /listener_20307_1566976294990I heard 1566976295
[INFO] [1566976295.707530]: /listener_20307_1566976294990I heard 1566976295
[INFO] [1566976295.807433]: /listener_20307_1566976294990I heard 1566976295
[INFO] [1566976295.907351]: /listener_20307_1566976294990I heard 1566976295
[INFO] [1566976296.007628]: /listener_20307_1566976294990I heard 1566976296
[INFO] [1566976296.107569]: /listener_20307_1566976294990I heard 1566976296
[INFO] [1566976296.207443]: /listener_20307_1566976294990I heard 1566976296
[INFO] [1566976296.307454]: /listener_20307_1566976294990I heard 1566976296
[INFO] [1566976296.407328]: /listener_20307_1566976294990I heard 1566976296
[INFO] [1566976296.507578]: /listener_20307_1566976294990I heard 1566976296
[INFO] [1566976296.607614]: /listener_20307_1566976294990I heard 1566976296
[INFO] [1566976296.707570]: /listener_20307_1566976294990I heard 1566976296
[INFO] [1566976296.807635]: /listener_20307_1566976294990I heard 1566976296
[INFO] [1566976296.907325]: /listener_20307_1566976294990I heard 1566976296
[INFO] [1566976297.007538]: /listener_20307_1566976294990I heard 1566976297
[INFO] [1566976297.107441]: /listener_20307_1566976294990I heard 1566976297
[INFO] [1566976297.207577]: /listener_20307_1566976294990I heard 1566976297

4)制作 Launch 文件

  • 在 beginner_tutorials 目录下新建 bringup 目录,进入 bringup ,新建 talker-and-listener.launch 并编辑
$ roscd beginner_tutorials
$ mkdir -p bringup
$ cd bringup/
$ touch talker-and-listener.launch
$ rosed beginner_tutorials talker-and-listener.launch
$ cat talker-and-listener.launch
<launch>
    <node name="talker" pkg="beginner_tutorials" type="talker.py" />
    <node name="listener" pkg="beginner_tutorials" type="listener.py" />
</launch>
  • 运行 launch
$ roslaunch beginner_tutorials talker-and-listener.launch
... logging to /home/lan/.ros/log/9aae9364-c982-11e9-b22e-000c29d2e743/roslaunch-lan-virtual-machine-10516.log
Checking log directory for disk usage. This may take awhile.
Press Ctrl-C to interrupt
Done checking log file disk usage. Usage is <1GB.

started roslaunch server http://lan-virtual-machine:44175/

SUMMARY
========

PARAMETERS
 * /rosdistro: kinetic
 * /rosversion: 1.12.14

NODES
  /
    listener (beginner_tutorials/listener.py)
    talker (beginner_tutorials/talker.py)

auto-starting new master
process[master]: started with pid [10527]
ROS_MASTER_URI=http://localhost:11311

setting /run_id to 9aae9364-c982-11e9-b22e-000c29d2e743
process[rosout-1]: started with pid [10540]
started core service [/rosout]
process[talker-2]: started with pid [10543]
process[listener-3]: started with pid [10544]
  • 使用 rqt_console 命令查看日志输出
$ rqt_console

 

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值