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

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 

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

相关文章:

  • 运维打铁:Centos 7使用yum安装 Redis 5
  • 【FAQ】PCoIP 会话后物理工作站本地显示器黑屏
  • centos挂载新的硬盘
  • Docker配置DNS方法详解及快速下载image方法
  • SpringBoot自定义拦截器以及多个拦截器执行顺序
  • 安卓adb shell串口基础指令
  • 【金仓数据库征文】加速数字化转型:金仓数据库在金融与能源领域强势崛起
  • 修改el-select背景颜色
  • 第9章 多模态大语言模型
  • vue element使用el-table时,切换tab,table表格列项发生错位问题
  • mysql快速在不同库中执行相同的sql
  • 金融机构典型欺诈场景
  • 【element plus】解决报错error:ResizeObserver loop limit exceeded的问题
  • JBoltAI 赋能金融文档:基于 RAG 的基金招募说明书视觉增强方案
  • 致远oa部署
  • 在Vue3中,如何在父组件中使用v-model与子组件进行双向绑定?
  • 【计算机视觉】CV实战项目 - 基于YOLOv5与DeepSORT的智能交通监控系统:原理、实战与优化
  • 【C++】内存管理:内存划分、动态内存管理(new、delete用法)
  • 【KWDB 创作者计划】_嵌入式硬件篇---寄存器与存储器截断与溢出
  • 关于边缘计算盒子的外部接口保护
  • 国防部:“台独”武装摆练纯属搞心理安慰,怎么演都是溃败的死局
  • 国防部:希望美方不要有“受迫害妄想症”,总拿别人当借口
  • 鼓励每位学生为优秀定义,上海奉贤这所学校有何特色?
  • 山西国道塌方致55岁货车司机死亡,女儿:货车的车贷还要还
  • 五一节,和人民照相馆一起找回“拍照”的仪式感
  • 广州远洋宾馆负一层配电房发生火情:明火已扑灭,无人员伤亡