ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

唐浩原3.11--3.18学习记录

2021-03-18 17:58:03  阅读:309  来源: 互联网

标签:3.18 ROS -- 3.11 topic msg vel ros 节点


本周已完成
1.搭建好ubuntu18.4.2环境
2.搭建好Ros相关的环境
3.完成Ros2.0相关核心概念和命令行等基本知识的学习
4.实现了publisher发送topic,完成subscriber订阅的功能
5.leetcode刷题&&题解(C++)
6.github博客的搭建(暂未上传具体代码,项目已经创建好了,后面整理好一起上传):
https://github.com/functionctf/Ros-connected-material

文章目录


学习过程记录&&感悟

ubuntu18.4.2环境配置

01.ubuntu18.4.2配置还算顺利,但是中间也遇到了各种各样的问题。比如下载相关软件的拓展包过慢,通过自己一番摸索,换成了国内更快的镜像源网站,下载速度问题就解决了。
具体参照的csdn博客是:

https://blog.csdn.net/weixin_41762173/article/details/79480832?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522161605740716780264018007%2522%252C%2522scm%2522%253A%252220140713.130102334…%2522%257D&request_id=161605740716780264018007&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2allsobaiduend~default-1-79480832.pc_search_result_no_baidu_js&utm_term=ubuntu%E9%95%9C%E5%83%8F%E6%BA%90

02.学习刚开始的时候出现ubuntu连不上网的问题,遂去csdn上进行搜索。试了很多方法都不管用…最后与室友的交流下,突然想到可能是自己的vmware的相关服务没有开。。。
win+r 启动services.msc
把NAT,DHCP等与ubuntu的网络相关的服务打开,问题解决
在ba这里插入图片描述![在这里插入图片描述](https://www.icode9.com/i/ll/?i=20210318165955253.png
ubuntu终于连上网了

搭建好Ros相关的环境

1.刚开始搭建好ubuntu,单纯的认为ROS很快就解决了,没想到遇到了极大的阻力。一度花了将近两天的时间。
问题是下面这这行命令:
sudo apt install ros-melodic-desktop-full
无论怎么尝试,总是安装不上
以及rosdep init 或者rosdep update 连接错误

提示的是 ERROR: unable to process source
网上的90%教程都是提示要改一个美国的ip通过进行访问下载资源。
后面发现根本没有用。
最终是乖乖到github上下载一个压缩文件rosdistro-master到本地。然后ubuntu指向本地资源,成功解决这个报错。

具体操作步骤参看这个大佬的blog
https://blog.csdn.net/xwmrqqq/article/details/114292547
(这个网站应该是2021年2月份进行永久性迁移了,所以按照之前的方法根本行不通,目前想要完成这个命令行的运行,靠ubuntu到外网上下载是不现实的)

ROS相关概念&&功能的实现

本人首先对ROS的概念进行学习,进行了一些简单的个人总结
Ros是什么?
提高机器人研发中的软件复用率
Ros=通信机制+开发工具+应用功能+生态系统

开发工具:
命令行&编译器,tf左边变换,qt工具箱,rviz

应用功能:
导航,
Navigation导航
Slam建图 深度学习,imu信息,里程计信息
Movelt!:运动计划

生态系统:
ros-wiki ros文档论坛
Ros answers

ROS核心概念:
1.节点:
2.执行单元:执行具体任务的可执行文件
不同节点可用不同的语言,分布于不同的主机中
3.节点管理器:控制中心,负责节点的管理和参数服务器的维护
为节点提供命名和注册服务

节点之间的通信方式:
1.话题通信(异步通信:无法得知发布者和订阅者之间的时效性)
在这里插入图片描述

发布者(publisher)发布消息(Message,具有一定的数据结构),通过topic(重要的数据传输总线,相当于导线),订阅者(subscriber)订阅,最终通过远端的上位机观看数据情况(同样需要订阅数据)

2.服务(service)通信(同步通信)
在这里插入图片描述
参数:

全局共享字典:用来存放参数

文件系统

ROS命令行工具使用方式

Rostopic
Rosservice
Rosnode
Rosparam
Rosmsg
Rossrv

功能的实现就是小海龟模型案例。通过键入上下左右键(给一个vel_cmd),publisher发送topic话题消息,随后subscriber进行订阅。之后的衍生是通过C++代码实现publish和subscribe。
roscore:首先启动Rosmaster,运行ros节点管理器

rosrun turtlesim turtlesim_node打开小海龟仿真器
解释:rosrun运行某个功能包turtlesim中某个节点(双击tab显示所有节点,选择合适的turtlesim_node)的指令

rosrun turtlesim turtle_teleop_key打开键盘控制节点

分析工具
1.rqt_graph:topic可视化,方便理解清楚话题之间的关系
在这里插入图片描述

Teleop代表键盘节点,数据通讯通过topic(turtle1话题,内容是cmd_vel速度,代表键盘控制的上下左右),turtlesim小海龟仿真器节点订阅

3.ros_node查看存在的命令,进行下一步输入
Rosnode list列出所有的节点
Rosnode info /xxx查看具体节点的信息
rostopic检查topic相关的信息
Rostopic list检查存在且活跃的所有topic信息

任务:给话题发布命令,让海龟动起来
ros pub +话题名(通过tab键补全) +具体的内容(双击tab完成),修改默认数据,单位是m/s,rad/s
Rostopic pub 只能发布一次
为了能让海龟一直运动
比如:rostopic pub -r 10 …
-r 代表rate是速度,10代表赫兹,一秒钟发布十次,这样小海龟就能一直运动了

查看消息的数据结构
Rosmsg show xxxx
在这里插入图片描述

前面的是用topic来进行的,现在学习查看服务相关的数据
Rosservice list
Rosservice call /spawn…(tab键补齐)
Call代表发出服务端消息,相当于打电话给客户端
在这里插入图片描述

创建了另一个海龟,同时命名为2,下面的几乎重复的命令相当于接收方接到电话之后的respones

话题记录,话题复现
意义在于,记录一次实验的数据,然后保存下来,到实验室中进行话题复现,进行数据的修改和完善

rosbag record -a -O cmd_record
-a代表存储all数据,O代表压缩,压缩文件名为cmd_record

回车,记录数据准备就绪

我们随便控制海龟的运动情况

完成之后按ctrl+c
数据保存在终端的默认路径下面

接下来进行复现
Rescore开启节点管理器,然后无需键盘控制节点,只需打开仿真器节点
运行Rosbag play cmd_record.bag即可复现之前的指令

问题复现
https://blog.csdn.net/qq_43310597/article/details/106008565?utm_medium=distribute.pc_relevant.none-task-blog-baidujs_title-0&spm=1001.2101.3001.4242

创建功能空间与功能包
在这里插入图片描述
在这里插入图片描述在这里插入图片描述
在这里插入图片描述在这里插入图片描述

完成publisher方的编程

C++实现发布者的创建

Publisher发布成功

订阅者subscribe端功能的实现

在python中实现订阅

补充:具体的C++代码如下:
publisher端:

/**
 * 该例程将发布turtle1/cmd_vel话题,消息类型geometry_msgs::Twist
 */
 
#include <ros/ros.h>
#include <geometry_msgs/Twist.h>

int main(int argc, char **argv)
{
	// ROS节点初始化
	ros::init(argc, argv, "velocity_publisher");

	// 创建节点句柄
	ros::NodeHandle n;

	// 创建一个Publisher,发布名为/turtle1/cmd_vel的topic,消息类型为geometry_msgs::Twist,队列长度10
	ros::Publisher turtle_vel_pub = n.advertise<geometry_msgs::Twist>("/turtle1/cmd_vel", 10);

	// 设置循环的频率
	ros::Rate loop_rate(10);

	int count = 0;
	while (ros::ok())
	{
	    // 初始化geometry_msgs::Twist类型的消息
		geometry_msgs::Twist vel_msg;
		vel_msg.linear.x = 0.5;
		vel_msg.angular.z = 0.2;

	    // 发布消息
		turtle_vel_pub.publish(vel_msg);
		ROS_INFO("Publsh turtle velocity command[%0.2f m/s, %0.2f rad/s]", 
				vel_msg.linear.x, vel_msg.angular.z);

	    // 按照循环频率延时
	    loop_rate.sleep();
	}

	return 0;
}

subscriber端:

/**
 * 该例程将订阅/turtle1/pose话题,消息类型turtlesim::Pose
 */
 
#include <ros/ros.h>
#include "turtlesim/Pose.h"

// 接收到订阅的消息后,会进入消息回调函数
void poseCallback(const turtlesim::Pose::ConstPtr& msg)
{
    // 将接收到的消息打印出来
    ROS_INFO("Turtle pose: x:%0.6f, y:%0.6f", msg->x, msg->y);
}

int main(int argc, char **argv)
{
    // 初始化ROS节点
    ros::init(argc, argv, "pose_subscriber");

    // 创建节点句柄
    ros::NodeHandle n;

    // 创建一个Subscriber,订阅名为/turtle1/pose的topic,注册回调函数poseCallback
    ros::Subscriber pose_sub = n.subscribe("/turtle1/pose", 10, poseCallback);

    // 循环等待回调函数
    ros::spin();

    return 0;
}

最终小海龟就动起来啦
在这里插入图片描述

leetcode题解(简单)

leetcode给我的打击蛮大的。。。
不练不知道,练的时候才发现自己的代码有待提升,就C++而言,很多知识遗忘,题目看到有思路,但是让自己写却写不出来。
就挑了最简单的题目进行了练习:
1.两数之和问题:https://leetcode-cn.com/problems/two-sum/

题目:

给定一个整数数组和一个目标值,找出数组中和为目标值的两个数。

你可以假设每个输入只对应一种答案,且同样的元素不能被重复利用。

示例:

给定 nums = [2, 7, 11, 15], target = 9

因为 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]

题解:
拿到这个问题的第一反应是来一个o(n)²级别的循环运算,就是先拿第一个数,然后和后面的所有数进行相加,比对一下是否等于target值。所以等于是暴力求解问题。后面想了一下,如果用target作为被减数,然后用num中的值一一去减它。加入出现的结果中有num样本空间中的子集,问题就很快解决了。题解利用到的vector容器。属于STL库的知识,没有学过,所以还是蛮痛苦的。通过对vector的学习,根据自己的理解解决了问题

class Solution {
public:
    vector<int> twoSum(vector<int>& nums, int target) {
        unordered_map<int,int>record;//记录数据和下标
        for(int i=0; i < nums.size(); i++) {
            int difference = target - nums[i];
            if(record.find(difference) != record.end()){//如果target与该数的差能在该数之前的数中找到
                int result[]={record[difference], i};//记录符合条件的两数的下标
                return vector<int>(result, result+2);
            }
            record[nums[i]]=i;
        }
        return{};
    }
};

在这里插入图片描述

总结及下周安排:

1.把ROS相关的知识再温习一下,具体的操作和命令行熟悉
2.leetcode题不能停。。上周配ros和ubuntu花了不少时间,导致leetcode没有达到每周三题的标准。下周继续
3.C++/python的知识进一步学习
4.了解一下slam相关的知识
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

标签:3.18,ROS,--,3.11,topic,msg,vel,ros,节点
来源: https://blog.csdn.net/qq_45618337/article/details/114983513

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有