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