ROS_tutorial03:ROS_Node_Topic_Message
ROS NODE
首先运行 roscore ,同时只能存在同一个 roscore 。如果出现无法连接的情况,在 /opt/ros/kinetic/setup.bash 文件的最后加上以下两行:
export ROS_HOSTNAME=localhost
export ROS_MASTER_URI=http://localhost:11311
然后起一个节点:
rosrun turtlesim turtlesim_node
通过 rosnode list 来查看当前有哪些节点:
1 $ rosnode list 2 /rosout 3 /turtlesim
可以通过 rosnode info <node_name> 来查看节点信息,接收哪个topic的消息以及发送消息到哪个topic
1 #运行 2 $ rosnode info turtlesim 3 #结果 4 -------------------------------------------------------------------------------- 5 Node [/turtlesim] 6 Publications: 7 * /rosout [rosgraph_msgs/Log] 8 * /turtle1/color_sensor [turtlesim/Color] 9 * /turtle1/pose [turtlesim/Pose] 10 11 Subscriptions: 12 * /turtle1/cmd_vel [unknown type] 13 14 Services: 15 * /clear 16 * /kill 17 * /reset 18 * /spawn 19 * /turtle1/set_pen 20 * /turtle1/teleport_absolute 21 * /turtle1/teleport_relative 22 * /turtlesim/get_loggers 23 * /turtlesim/set_logger_level 24 25 26 contacting node http://localhost:39870/ ... 27 Pid: 22730 28 Connections: 29 * topic: /rosout 30 * to: /rosout 31 * direction: outbound 32 * transport: TCPROS
再起一个节点 turtle keyboard teleoperation :
1 #运行 2 qmark@qmark:~/ROS_TRAIN/Test/catkin_ws$ rosrun turtlesim turtle_teleop_key 3 #结果 4 Reading from keyboard 5 --------------------------- 6 Use arrow keys to move the turtle.
ROS TOPIC
可以通过rqt 的GUI界面来查看当前节点之间的通讯:
$ rosrun rqt_graph rqt_graph
在界面中可以很清楚的看到各个节点通过topic来进行通讯。
一个node发送msg到它publish的topic中,另一个subscribe这个topic的node接收msg
可以看到, /teleop_turtle 通过 /turtle1/cmd_vel 这个topic来给 /turtlesim 发送消息。
rostopic的命令:
rostopic bw display bandwidth used by topic rostopic echo print messages to screen rostopic hz display publishing rate of topic rostopic list print information about active topics rostopic pub publish data to topic rostopic type print topic type
想要看 /turtle1/cmd_vel 所接收及发送的消息,可以通过 rostopic echo <topic_name> 来查看。
运行之后,通过rqt可以看到,其实echo 的作用就是增加一个订阅 /turtle1/cmd_vel 的节点,并把节点接收到的信息显示出来。
可以通过以下命令来查看有哪些topic及其有几个订阅、发布节点:
#运行 $ rostopic list -v #结果 Published topics: * /turtle1/color_sensor [turtlesim/Color] 1 publisher * /turtle1/cmd_vel [geometry_msgs/Twist] 1 publisher * /rosout [rosgraph_msgs/Log] 3 publishers * /rosout_agg [rosgraph_msgs/Log] 1 publisher * /turtle1/pose [turtlesim/Pose] 1 publisher Subscribed topics: * /turtle1/cmd_vel [geometry_msgs/Twist] 2 subscribers * /rosout [rosgraph_msgs/Log] 1 subscriber
ROS MESSAGE
通过 rostopic type <topic_name> 来查看一个topic发动的message,这个命令得到的是message的名称,之后就可以通过 rosmsg <options> <msg_name> 来对这个消息进行操作。
#运行 $ rostopic type /turtle1/cmd_vel #结果 geometry_msgs/Twist #运行 $ rosmsg show geometry_msgs/Twist #结果 geometry_msgs/Vector3 linear float64 x float64 y float64 z geometry_msgs/Vector3 angular float64 x float64 y float64 z
rostopic pub
rostopic pub [topic] [msg_type] [args]
#例子 $ rostopic pub -1 /turtle1/cmd_vel geometry_msgs/Twist -- '[2.0, 0.0, 0.0]' '[0.0, 0.0, 1.8]'
rostopic pub #命令 -1 #发布1次消息,-r 1 是一直发布 /turtle1/cmd_vel #接收消息的topic geometry_msgs/Twist #上面 rostopic type 得到的消息名 -- #none of the following arguments is an option '[2.0, 0.0, 0.0]' '[0.0, 0.0, 1.8]' #发布的消息,具体格式看rosmsg show得到的消息格式
运行后通过rqt查看各个节点之间的通信关系:
通过rqt可以看到:rostopic pub 的作用就是增加一个发布消息到 /turtle1/cmd_vel 的节点
rqt_plot
$ rosrun rqt_plot rqt_plot
作图界面,可以输入的信息是 /topic/msgtype
例如,想要查看 /turtle1/pose 这个节点的信息作图,
#运行 $ rostopic type /turtle1/pose #结果 turtlesim/Pose #运行 $ rosmsg show turtlesim/Pose #结果 float32 x float32 y float32 theta float32 linear_velocity float32 angular_velocity
接下来打开界面: rosrun rqt_plot rqt_plot
在左上角的topic框内输入
/turtle1/pose/x /turtle1/pose/y /turtle1/pose/theta /turtle1/pose/linear_velocity /turtle1/pose/angular_velocity
即topic的名称加上上面 rosmsg show 得到的消息类型。
也可以输入 /turtle1/pose 会有下拉选项。