当前位置: 首页 > web >正文

ROS 快速入门教程03

8.编写Subscriber订阅者节点

8.1 创建订阅者节点

cd catkin_ws/src/
catkin_create_pkg  atr_pkg rospy roscpp std_msgs 

ros::Subscriber sub = nh.subscribe(话题名, 缓存队列长度, 回调函数)
回调函数通常在你创建订阅者时定义。一个订阅者会监听一个话题,并在有消息到达时调用回调函数,而不用手动去执行函数。

#include<ros/ros.h>
#include<std_msgs/String.h>
void chao_callback( std_msgs::String msg)
{printf(msg.data.c_str());printf("\n");
}
int main(int argc, char **argv)
{ros::init(argc, argv, "ma_node");ros::NodeHandle nh;ros::Subscriber sub = nh.subscribe("ssr_node_topic", 10,chao_callback);while(ros::ok()){ros::spinOnce();//功能:处理回调函数}return 0;
}

打开CMakeList,添加后编译。

 add_executable(ma_node src/atr_pkg_node.cpp)
target_link_libraries(ma_node${catkin_LIBRARIES})

打开三个终端分别输入

roscore
rosrun ssr_pkg chao_node
rosrun atr_pkg ma_node

在这里插入图片描述
在这里插入图片描述

显示接收时间函数

#include<ros/ros.h>
#include<std_msgs/String.h>void chao_callback( std_msgs::String msg)
{ROS_INFO(msg.data.c_str());
}int main(int argc, char **argv)
{setlocale(LC_ALL,"");//设置中文显示ros::init(argc, argv, "ma_node");ros::NodeHandle nh;ros::Subscriber sub = nh.subscribe("ssr_node_topic", 10,chao_callback);while(ros::ok()){ros::spinOnce();//功能:处理回调函数}return 0;
}

再次运行ma_node节点。
在这里插入图片描述

8.2 多个订阅者和发布者图形化显示

当存在多个订阅者和发布者时,可以使用rqt_graph来显示逻辑关系。
在这里插入图片描述

8.3 小结

在这里插入图片描述

9.launch启动多个ROS节点

上一小节中,我们启动多个节点就需要打开多个终端,这非常繁琐。这一小节中我们使用launch来启动多个节点。
luanch文件遵循XML语法
<标记名称 属性名1= "属性值1"...>内容</标记名称>
打开vscode,在工作目录的任意子文件夹下创建launch文件
在这里插入图片描述

<launch>
<node pkg ="ssr_pkg" type="yao_node" name="yao_node"/>
<node pkg ="ssr_pkg" type="chao_node" name="chao_node"/>
<node pkg ="atr_pkg" type="ma_node" name="ma_node" output="screen"/>
</launch>

打开终端输入

roslaunch atr_pkg kaihei.launch 

在这里插入图片描述

9.2 小结

在这里插入图片描述

10.ROS机器人运动控制

机器人的运动可以分解为矢量运动和旋转运动。
矢量运动:二维平面中的各种平移。单位:米/每秒。
旋转运动:机器人进行转向。单位:弧度/每秒。
在这里插入图片描述

11.机器人运动控制的实现

第一节中我们已经下载过wpr_simulation这个源代码了。

cd catkin_ws
catkin_make #编译源代码文件
roslaunch wpr_simulation #开启演示模拟环境
#再打开一个终端输入
rosrun wpr_simulation demo_vel_ctrl#进行demo演示

本节课就要实现这样的一个效果,实现思路:
在这里插入图片描述

cd catkin_ws/src/
catkin_create_pkg  vel_pkg roscpp rospy geometry_msgs

打开vscode,在vel_pkg文件夹下的src目录里创建叫vel_node.cpp文件。

#include<ros/ros.h>
#include<geometry_msgs/Twist.h>int main(int argc,char **argv)
{ros::init(argc,argv,"vel_node");ros::NodeHandle n;ros::Publisher vel_pub = n.advertise<geometry_msgs::Twist>("cmd_vel",10);geometry_msgs::Twist vel_msg;vel_msg.linear.x = 0.1;vel_msg.linear.y = 0.0;vel_msg.linear.z = 0.0;  vel_msg.angular.x = 0.0;vel_msg.angular.y = 0.0;vel_msg.angular.z = 0.0;ros::Rate r(30);while(ros::ok()){vel_pub.publish(vel_msg);r.sleep();}return 0;
}

cmake里添加后编译。

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

分别在两个终端里输入:

roslaunch wpr_simulation wpb_simple.launch 
rosrun vel_pkg  vel_node 

便能看到小车在缓慢向前移动。
在这里插入图片描述

http://www.xdnf.cn/news/1766.html

相关文章:

  • Redis LFU 策略参数配置指南
  • 电脑怎么强制退出程序回到桌面 详细操作步骤
  • SVN 右键不显示clean up的解决方法
  • VS code 下載
  • Unity 内置Standard Shader UNITY_BRDF_PBS函数分析 (二)
  • Android 混合开发实战:统一 View 与 Compose 的浅色/深色主题方案
  • 快速体验tftp文件传输(嵌入式设备)
  • 计算机求职面经内容与技巧分享
  • Java零拷贝
  • JavaScript 中的 Reflect 对象:深入理解与应用
  • 【前端】【业务场景】【面试】在前端开发中,如何处理国际化(i18n)和本地化(l10n)需求?请描述具体的实现步骤和可能用到的工具。
  • 含锡废水的处理
  • Temperature
  • 第十二章 Python语言-大数据分析PySpark(终)
  • windows系统自定义powshell批处理脚本
  • 【Umi】- 配置文件的加载机制
  • Ejs模版引擎介绍,什么是模版引擎,什么是ejs,ejs基本用法
  • PCB数字地和模拟地的连接问题
  • 【android bluetooth 协议分析 06】【l2cap详解 7】【l2c_rcv_acl_data函数解析】
  • 被封号如何申诉?Google Play开发者账号申诉模版分享
  • Dify升级-linux环境下使用zip离线安装方式部署升级
  • vue3+TS 手动实现表格滚动
  • C#进阶学习(十二)协变逆变
  • [C#]反射的实战应用,实际数据模拟
  • CDGP|大模型赋能数据治理:实践案例与深度剖析
  • VITS:基于对抗学习的条件变分自编码器
  • Java大师成长计划之第2天:面向对象编程在Java中的应用
  • 【回眸】Aurix TC397 IST 以太网 UDP 相关开发
  • 【python】Python 中,单下划线(_)和双下划线(__)开头以及结尾的命名方式具有特殊的含义和用途
  • 每日算法——快乐数、两数之和