概述
目录
准备工作
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
最后
以上就是精明外套为你收集整理的14.ROS编程学习:乌龟位姿的话题订阅准备工作 c++实现乌龟位姿的话题订阅 python实现乌龟位姿的话题订阅的全部内容,希望文章能够帮你解决14.ROS编程学习:乌龟位姿的话题订阅准备工作 c++实现乌龟位姿的话题订阅 python实现乌龟位姿的话题订阅所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复