14.ROS编程学习:乌龟位姿的话题订阅

目录

准备工作

 c++实现乌龟位姿的话题订阅

 python实现乌龟位姿的话题订阅

学习参考:赵虚左的ROS课程+古月的ROS机器人开发实践

准备工作

通过launch文件启动乌龟GUI和乌龟键盘控制器,以后全部通过launch文件启动ros节点。

 wugui_start.launch

<!-- 启动乌龟GUI和键盘控制节点 -->
<launch>
    <!-- 乌龟GUI -->
    <node pkg="turtlesim" type="turtlesim_node" name="turtle1" output="screen"/>
    <!-- 键盘控制 -->
    <node pkg="turtlesim" type="turtle_teleop_key" name="key" output="screen"/>
</launch>

启动ros节点通过<node>标签定义,pkg为节点所在的功能包名称,type定义节点可执行文件名称,name属性用来定义节点运行的名称(可以自定义,覆盖节点初始化时定义的名称),output为将节点输出打印在终端控制台屏幕上,默认输出为日志文档。——ROS机器人开发实践P59

如果不加上output,日志文档不显示,以为着这个例程的提示不显示了,不显示内容如下:

Use arrow keys to move the turtle. 'q' to quit.
[ INFO] [1666599608.809833878]: Starting turtlesim with node name /turtle1
[ INFO] [1666599608.812535342]: Spawning turtle [turtle1] at x=[5.544445], y=[5.544445], theta=[0.000000]

启动launch文件

source ./devel/setup.bash 
roslaunch wugui_ttest wugui_start.launch 

 话题查询

rosmelodic@rosmelodic-virtual-machine:~/catkin_ws$ rostopic list 
/rosout
/rosout_agg
/turtle1/cmd_vel
/turtle1/color_sensor
/turtle1/pose

特定话题的细节信息查询,如下可知该话题的消息类型为turtlesim/Pose,没有订阅者。注意这个消息类型,后面要调用。

rosmelodic@rosmelodic-virtual-machine:~/catkin_ws$ rostopic info /turtle1/pose 
Type: turtlesim/Pose

Publishers: 
 * /turtle1 (http://rosmelodic-virtual-machine:41597/)

Subscribers: None

特定消息类型查询,如下包含乌龟的坐标、角度、线速度和角速度。

rosmelodic@rosmelodic-virtual-machine:~/catkin_ws$ rosmsg info turtlesim/Pose 
float32 x
float32 y
float32 theta
float32 linear_velocity
float32 angular_velocity

 打印话题输出的消息

rosmelodic@rosmelodic-virtual-machine:~/catkin_ws$ rostopic echo /turtle1/pose 
---
x: 5.544444561
y: 5.544444561
theta: 0.0
linear_velocity: 0.0
angular_velocity: 0.0
---
x: 5.544444561
y: 5.544444561
theta: 0.0
linear_velocity: 0.0
angular_velocity: 0.0

... ... ... ...

 c++实现乌龟位姿的话题订阅

准备工作

因为turtlesim/Pose为自定义的消息格式,且在上一节配置功能包时没有配置此功能包,故在配置文件上追加包。

(1条消息) 13.ROS编程学习:话题发布控制乌龟_机械专业的计算机小白的博客-CSDN博客https://blog.csdn.net/wzfafabga/article/details/127457144功能包的依赖为rospy roscpp geometry_msgs std_msgs

加上: turtlesim

package.xml配置依赖。

<build_depend>turtlesim</build_depend>
<exec_depend>turtlesim</exec_depend>

CMakeList.txt配置编译所需要的组件。

find_package(catkin REQUIRED COMPONENTS
  geometry_msgs
  roscpp
  rospy
  std_msgs
  turtlesim
)

测试配置有无问题。

catkin_ws

经过测试CMakeList.txt配置错了会报错,package.xml配置错了并没有报错。

在自定义消息类型中,CMakeList.txt配置还需要配置运行时依赖:


catkin_package(
#  INCLUDE_DIRS include
#  LIBRARIES sub_pub
 CATKIN_DEPENDS roscpp rospy std_msgs message_runtime
#  DEPENDS system_lib
)

如果package.xml没加入对应的依赖会报错:

CMake Error at /opt/ros/melodic/share/catkin/cmake/catkin_package.cmake:??? (message):
  catkin_package() DEPENDS on the catkin package '??????????' which must
  therefore be listed as a run dependency in the package.xml

(1条消息) 4.ROS编程学习:自定义话题消息与c++调用_机械专业的计算机小白的博客-CSDN博客https://blog.csdn.net/wzfafabga/article/details/127161241创建test01_sub_pose,cpp

test01_sub_pose,cpp

#include "ros/ros.h"
#include "turtlesim/Pose.h"

/* 
 1.包含头文件
 2.初始化ROS节点
 3.初始化节点句柄
 4.创建订阅者
 5.回调函数
 6.spin()
 */

// 处理订阅到的数据
void huidiao(const turtlesim::Pose::ConstPtr &posee){
    ROS_INFO("乌龟的位姿信息:坐标:(%.2f,%.2f),朝向角度:%.2f,线速度:%.2f,角速度:%.2f",
            posee->x,posee->y,posee->theta,posee->linear_velocity,posee->angular_velocity);
}

int main(int argc, char *argv[])
{
    // 防止中文乱码
    setlocale(LC_ALL,"");
    // 初始化ROS节点
    ros::init(argc,argv,"sub_pose");
    // 初始化节点句柄
    ros::NodeHandle n;
    // 创建订阅者
    ros::Subscriber sub = n.subscribe("/turtle1/pose",100,huidiao);
    // 回头函数
    ros::spin();
    return 0;
}

 注意订阅者的话题名是准备工作得到的话题名/turtle1/pose,大写的Pose是话题的数据类型turtlesim/Pose。

ros::Subscriber sub = n.subscribe("/turtle1/pose",100,huidiao);

配置CMakeList.txt

add_executable(test01_sub_pose src/test01_sub_pose.cpp)
add_dependencies(test01_sub_pose ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS})
target_link_libraries(test01_sub_pose
  ${catkin_LIBRARIES}
)

启动launch文件(包含乌龟GUI和键盘控制器)

roslaunch wugui_ttest wugui_start.launch 
rosrun wugui_ttest test01_sub_pose

出现问题:键盘控制终端和乌龟位姿订阅终端不在一起。

将乌龟位姿订阅节点加入launch文件(能在一个终端实现的都要通过launch文件实现)

需要注意的是type是可执行文件的文件名!为编译后的c++文件和添加可执行权限后的python文件。

<!-- 启动乌龟GUI和键盘控制节点 -->
<launch>
    <!-- 乌龟GUI -->
    <node pkg="turtlesim" type="turtlesim_node" name="turtle1" output="screen"/>
    <!-- 键盘控制 -->
    <node pkg="turtlesim" type="turtle_teleop_key" name="key" output="screen"/>
    <!-- 乌龟位姿订阅 -->
    <node pkg="wugui_ttest" type="test01_sub_pose" name="wugui_pose" output="screen"/>
</launch>

再次运行launch文件

roslaunch wugui_ttest wugui_start.launch 

 python实现乌龟位姿的话题订阅

 test01_sub_pose_p.py

#! /usr/bin/env python
# -*- coding: UTF-8 -*-


""" 
    1.导包
    2.初始化ROS节点
    3.创建订阅者
    4.回调函数
    5.回头函数spin()
"""

import rospy
from turtlesim.msg import Pose

# 回调函数,处理订阅到的信息
def huidiao(pose):
    rospy.loginfo("乌龟的位置:(%.2f,%.2f),朝向角度:%.2f,线速度:%.2f,角速度:%.2f",
                pose.x,pose.y,pose.theta,pose.linear_velocity,pose.angular_velocity)

if __name__ == "__main__":
    # 初始化ROS节点
    rospy.init_node("sub_pose_p")
    # 创建订阅者
    sub = rospy.Subscriber(name="turtle1/pose", data_class=Pose,callback=huidiao, queue_size=100)
    # 回头函数
    rospy.spin()

 有一个细节:写回调函数时,pose为形参,没有定义pose的数据类型,导致没法代码补齐。解决方式:

方式一,通过rosmsg info查看消息的详细信息

rosmelodic@rosmelodic-virtual-machine:~/catkin_ws$ rosmsg info turtlesim/Pose 
float32 x
float32 y
float32 theta
float32 linear_velocity
float32 angular_velocity

方式二,在已知消息的组成时,通过程序中通过输入Pose.进行代码提示。 

添加可执行权限

chmod +x *.py

CMakeList.txt配置

catkin_install_python(PROGRAMS
  scripts/test01_sub_pose_p.py
  DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION}
)

 编译一下

catkin_make

将节点加入到launch文件中

<!-- 启动乌龟GUI和键盘控制节点 -->
<launch>
    <!-- 乌龟GUI -->
    <node pkg="turtlesim" type="turtlesim_node" name="turtle1" output="screen"/>
    <!-- 键盘控制 -->
    <node pkg="turtlesim" type="turtle_teleop_key" name="key" output="screen"/>
    <!-- 乌龟位姿订阅 -->
    <node pkg="wugui_ttest" type="test01_sub_pose_p.py" name="wugui_pose" output="screen"/>
</launch>

 注意python面向对象编程,脚本语言,type可执行文件名为python文件的文件名。c++需要编译成可执行文件,再将文件名赋给type。

启动launch文件

roslaunch wugui_ttest wugui_start.launch 

猜你喜欢

转载自blog.csdn.net/wzfafabga/article/details/127495303