【奥特学园】ROS机器人入门课程《ROS理论与实践》零基础教程_哔哩哔哩_bilibili
下一篇:奥特学园ROS笔记--2(76-120节)_echo_gou的博客-优快云博客
目录
25节 基本配置
1 建立文件夹,文件夹下建立src
2 在src文件外面:catkin_make后生成build和devel
3 code .打开vscode,然后vscode中ctrl+shift+b,选择后面小齿轮,将以下代码对tasks.json进行覆盖。这里目的是配置编译相关的参数,之后ctrl+shift+b即可编译。

{
// 有关 tasks.json 格式的文档,请参见
// https://go.microsoft.com/fwlink/?LinkId=733558
"version": "2.0.0",
"tasks": [
{
"label": "catkin_make:debug", //代表提示的描述性信息
"type": "shell", //可以选择shell或者process,如果是shell代码是在shell里面运行一个命令,如果是process代表作为一个进程来运行
"command": "catkin_make",//这个是我们需要运行的命令
"args": [],//如果需要在命令后面加一些后缀,可以写在这里,比如-DCATKIN_WHITELIST_PACKAGES=“pac1;pac2”
"group": {"kind":"build","isDefault":true},
"presentation": {
"reveal": "always"//可选always或者silence,代表是否输出信息
},
"problemMatcher": "$msCompile"
}
]
}
4 右键src创建ros功能包:,create catkin package ,分别输入名字和依赖(roscpp rospy std_mags)。
运行步骤
1 roscore
2 source ./devel/setup.bash
3 rosun ......
修改代码之后一定记得重新编译
注:在写代码的时候有红色波浪线则,如果确实没有错那就ctrl+shift+b编译一下。
python步骤:
1 编写代码,代码中第一二行应该加入
#! /usr/bin/env python
#coding=UTF-8
2 添加可执行权限:
1打开scripts所在的文件夹的终端
2输入:chmod +x *.py
3 cmakelist修改:

改成对应的文件名称

4 ctrl+shift+b编译
5 然后运行
1 roscore
2 source ./devel/setup.bash
rosrun plumbing_pub_sub demo01_pub_p.py

28节(1.4.2):
1 ROSnoetic版本不配置CMakeLists的python的话,只能支持python2不能支持python3
2 出现问题:/usr/bin/env:没有那个文件或者目录
30节 launch文件 1.4.3
1 这个文件可以一次性启动多个节点
2 是一个XML文件
3 在功能包下面创建文件夹launch,然后创建.launch文件
<!-- 启动乌龟gui和键盘控制节点 -->
<launch>
<!--添加被执行的节点-->
<node pkg="turtlesim" type="turtlesim_node" name="turtle1" output="screen"/>
<node pkg="turtlesim" type="turtle_teleop_key" name="key" output="screen"/>
</launch>
这三步就相当于之前启动的三个终端执行的语句,其中前后两个<launch>对应的是之前启动roscore的步骤
然后在命令行source以下后
roslaunch xxx文件夹 xxx.launch 即可
----------话题通信---------
38节 发布者和订阅者的具体建立流程
1发布者和订阅者分别在master中进行注册
2master根据注册表信息对两者进行匹配,匹配后master给订阅者发送发布者的rpc地址
3订阅者通过地址和发布者进行链接,然后开始通信
注:使用的协议有rpc和tcp协议;发布者和订阅者建立链接后,master就可以关闭了;上述实现流程已经封装了,了解即可;我们关注的是发布者和订阅者的实现和消息载体;master的作用可以理解为管理和匹配话题、建立两者之间的连接用的。
40节 发布方实现

图中一个是发布者一个是订阅者,创建在src中。
实现流程:
1.包含头文件
2.初始化 ROS 节点:命名(唯一)
3.实例化 ROS 句柄
4.实例化 发布者 对象
5.组织被发布的数据,并编写逻辑发布数据
//初始化节点
ros::init(argc,argv,"ergouzi");
//创建节点句柄
ros::NodeHandle nh;
//创建发布对象
ros::Publisher pub = nh.advertise<std_msgs::String>("fang",10); //10是队列长度,如果发出还没有被接受就会放到队列里面。
//创建消息对象的变量,用于发布数据
std_msgs::String msg;
//发布消息
while(ros::ok()) //节点是否存活,节点死亡ctrl+c结束就死亡
{
msg.data="hello";
pub.publish(msg); //
}
其中ros::ok()代表节点是否还存活;
41节 发布方按频率发送数据
上一节的补充
#include "ros/ros.h"
#include "std_msgs/String.h"
#include <sstream>
//发布方实现
int main(int argc, char *argv[])
{
setlocale(LC_ALL,"");
//初始化节点
ros::init(argc,argv,"ergouzi");
//创建节点句柄
ros::NodeHandle nh;
//创建发布对象
ros::Publisher pub = nh.advertise<std_msgs::String>("fang",10);
//创建消息对象的变量
std_msgs::String msg;
//发布频率
ros::Rate rate(10);
int count=0;
//发布消息
while(ros::ok())
{
count++;
//msg.data="hello";
//实现字符串拼接数字
std::stringstream ss;
ss<<"hello --- -"<<count; //将hello字符和count数字输入到ss
msg.data=ss.str();
pub.publish(msg);
//添加日志
ROS_INFO("发布的数据是%s",ss.str().c_str()); //打印到控制台上
rate.sleep(); //睡眠0.1秒
}
return 0;
}
42节 订阅方实现
步骤和上面两节相似
实现流程:
1.包含头文件
2.初始化 ROS 节点:命名(唯一)
3.实例化 ROS 句柄
4.实例化 订阅者 对象
5.处理订阅的消息(回调函数)
6.设置循环调用回调函数
#include "ros/ros.h"
#include "std_msgs/String.h"
#include <sstream>
void doMsg(const std_msgs::String::ConstPtr &msg){ //通过msg这个参数获取并且操作订阅道到的数据
ROS_INFO("cuihua订阅到的数据是:%s",msg->data.c_str());
}
int main(int argc, char *argv[])
{
setlocale(LC_ALL,"");
ros::init(argc,argv,"cuihua"); //节点名称具有唯一性
ros::NodeHandle nh; //句柄
ros::Subscriber sub=nh.subscribe("fang",10,doMsg); //topic一定和ergouzi保持一致才可通信.发布者那边的泛型可以不添加,订阅者这边可以自动识别。
ros::spin(); //因为上一行的回调函数doMsg需要被频繁的执行去获取数据,所以这一行作用就是处理回调函数;
// while(ros::ok()){ 这样效果也一样
// ros::spinOnce();
// }
return 0;
}
43节 没有添加依赖/前几条数据丢失/回调函数
上一节出现的问题的一个补充
1 在创建功能包的时候如果没有添加依赖,建议直接删除这个包重新创建。
2 订阅者订阅发布者的数据时,前面几条数据可能会丢失。
原因是publisher还没有在roscore中注册完毕。
解决:可以在注册后加入休眠步骤,来延迟第一条数据的发送。

即ros::Duration(3).sleep(); 这里休眠3秒。
3 回调函数:
每次订阅者订阅到外部的消息就执行一次回调函数,而不是代码上出现一次就调用一次
44节 查看计算图
终端输入
rqt_graph
显示计算图,了解节点之间的关系
注:计算图的查看必须要在程序运行的时候才可以查看

最低0.47元/天 解锁文章
1万+

被折叠的 条评论
为什么被折叠?



