Chapter1 ROS概述与环境搭建

2023-10-30

一、序言

        学习一个新的知识模块时,要先了解模块的相关概念,安装官方软件包、搭建其集成的开发环境,这些完成后,继续开始开创新领域的大门。

二、ROS简介

2.1 ROS的概念

①一个比喻:

机器人的控制集成硬件设计、嵌入式软件设计、上层软件设计(linux)、机械结构设计、机械加工为主。上层软件设计相当于人的大脑、嵌入式软件设计相当于人的小脑,大脑采集机器人感觉到的外部信息进行处理运算,再将执行命令下达,但下达并不是直接下达给硬件实现(好比大脑无法直接控制肉体),而是需要通过小脑来控制(软件),再由小脑来控制硬件。笔者认为,这像是计算机组成原理里面的ISA、操作系统与软件的区别。

 ②ROS的一些模块:

ROS = plumbing(通信) + tools(工具) + capabilities(功能)+ecosystem(生态)

通信:数据交互,如在导航机器人中,需要获取摄像头,或者一些硬件采集数据(雷达+摄像头)

工具:仿真(不用自己买机器人哈哈哈哈哈省钱了兄弟们)

功能:如导航机器人可以实现导航、躲避障碍........这些都自己做的吗?别人做好的模块直接复用,自己进行算法的改进或者调参

生态:开源、掌握话语权

③ROS设计目标(有点抽象.......)

代码重用:类似C++和java的封装思想

分布式:负载均衡,类似计算机网络中OSPF算法。

松耦合:将输入输出标准化,实现自定义(类似C程序设计中的strcpy和mystrcpy)

精简:ROS被设计尽可能精简,以便为ROS编写的代码可以与其它机器人软件框架一起使用。ROS易于与其他机器人软件框架集成。

语言独立性:多语言使用(C++、python、java)

易于测试:ROS具有称为rostest的内置单元/集成测试框架,可轻松安装和拆卸测试工具。

2.2 ROS安装及测试(笔者后续更新,如需技术支持+q 1339027867)

如果安装成功了,那么恭喜你,说句题外话(老子安了一个半小时,真是个弱智).........

那么开始测试ROS

①测试ros,由于ros已经内置了一些小程序,可以运行下列小程序检测ROS是否可以运行

1.首先启动三个命令行(ctrl+alt+t)

2.命令行1输入 

roscore

3.命令行2输入:此时会弹出图形化界面

rosrun turtlesim turtlesim_node

4.命令行3输入:可以通过上下左右控制乌龟运动

rosrun turtlesim turtle_teleop_key

然后就是这样了,恭喜您,配置成功啦!

2.3 ROS初体验

①ROS中主要设计python与C++为主

②虽说使用语言不一样,但是实现流程大致相似

创建一个工作空间--->创建一个功能包--->编辑源文件(.cpp/.py)--->编辑配置文件--->编译并运行

Ⅰ.创建工作空间

"linux人,linux混,linux都是人上人",创建目录当然要用linux

mkdir -p demo01_ws/src

创建一个工作空间,demo01_ws,其下有个文件集叫src,回车。

 进入工作空间

cd demo01_ws/

再然后调用ROS里面的编译命令,回车,会出现一些日志,内容先不用管他

catkin_make

结果,先双击打开demo01_ws,发现多了俩文件夹,build和devel。执行命令行终端输出如下:

Ⅱ.进入src创建ros包并添加依赖

进入工作空间下的src目录,Linux命令如下

cd src

创建一个功能包,需要调用命令,命令后的为工作包的名字(本例为helloworld),三个依赖包

catkin_create_pkg helloworld roscpp rospy std_msgs

执行完提示信息如下:

 ③用C++实现hello world

Ⅰ首先进入目录:demo01_ws  --- src --- helloworld --- src下面,创建cpp文件,双击打开

touch helloworld_c.cpp

Ⅱ.编辑源文件

//1.包含ros的头文件
#include "ros/ros.h"
//2.编写main函数
int main(int argc,char * argvs[])
{
	//3.初始化ros节点
	ros::init(argc,argv,"hello_node");
	//4.输出日志
	ROS_INFO("hello world");
	return 0;
}

Ⅲ.编写配置文件 Cmakelist.txt

修改其去掉井号,第一个_node改成_c

# add_executable(${PROJECT_NAME}_node src/helloworld1_node.cpp)
 #target_link_libraries(${PROJECT_NAME}_node

这个参数 ${PROJECT_NAME}_node 是执行文件的命名,随意命名,就叫haha吧,嘿嘿,也就是通过haha可以映射到cpp文件

接下来修改链接库文件${PROJECT_NAME}_node 这个参数改成execute table里面映射的名称haha

配置文件片段如下,保存。(haha是可执行文件名,helloworld_c.cpp是c++文件名)

 add_executable(haha src/helloworld_c.cpp)

## Rename C++ executable without prefix
## The above recommended prefix causes long target names, the following renames the
## target back to the shorter version for ease of user use
## e.g. "rosrun someones_pkg node" instead of "rosrun someones_pkg someones_pkg_node"
# set_target_properties(${PROJECT_NAME}_node PROPERTIES OUTPUT_NAME node PREFIX "")

## Add cmake target dependencies of the executable
## same as for the library above
# add_dependencies(${PROJECT_NAME}_node ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS})

## Specify libraries to link a library or executable target against
 target_link_libraries(haha
   ${catkin_LIBRARIES}
 )

Ⅳ.编译,在demo01_ws中打开终端进行编译,编译命令为

catkin_make

编译成功后,应该是这样的

Ⅴ.执行

第一步:启动ROS核心   打开终端输入ROSCORE

第二步:启动核心后,执行源文件,在工作中心中(demo那个文件夹),输入

source ./devel/setup.bash

这个内容基本是固定的,目的是修改环境变量

这个案例中笔者在自己复盘时很容易忘掉这步,因此需要额外记忆。

此外,这行代码具有局限性。

这句代码的作用是把当前工作空间刷新到当前窗口下面的环境变量,但是!!!!

如果新开一个窗口 运行上面代码则不好使了

如果想在任何窗口下均能执行haha文件,应该怎么做呢???

根目录找.bashrc文件(ctrl+h),用记事本打开

追加

source ~/demo01_ws/devel/setup.bash
liuhongwei@liuhongwei-virtual-machine:~$ source .bashrc
liuhongwei@liuhongwei-virtual-machine:~$ rosrun helloworld1 haha

执行成功

第三步:执行,调用命令rosrun 后面加上包名(本例为helloworld1),后面再加上被执行的程序

rosrun helloworld1 haha

回车,发现执行成功,执行成功界面如下:

 

④用python建立helloworld

Ⅰ.进入工作空间,进入工作空间下的src目录,进入helloworld1目录,建立文件夹:scripts,再进入文件夹scripts,在里面添加python文件,用linux命令行就是:

mkdir scripts
cd scripts/
touch helloworld_p.py

Ⅱ.打开进行编辑

#! usr/bin/env python
##指定解释器

#1.导包
import rospy
#2.编写主入口
if __name__ == "__main__":
#3.初始化ROS节点
	rospy.init_node("hello_p");
#4.输出日至helloworld
	rospy.loginfo("hello world");

Ⅲ.添加可执行权限:在script目录下,打开终端,输入下一行文件,则有可执行权限

chmod +x helloworld_p.py 

Ⅳ.编写配置文件,配置文件在功能包(helloworld1)下,与script平级,名字叫做CMakeLists.txt

 catkin_install_python(PROGRAMS
   scripts/helloworld_p.py
   DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION}
 )

这是更改后的结果,作用是为python文件选用适宜的解释器

Ⅴ.编译

在demo01_ws下调用catkin_make

Ⅵ.执行

新开一个窗口,执行roscore,加载source ./devel/setup.bash,执行rosrun helloworld1 helloworld_p.py 执行。

三、集成开发环境搭建

3.1 安装终端

1.为什么要安装终端:以小乌龟运动为例,开启多个窗口,使视觉比较凌乱

2.安装:

sudo apt install terminator

3.2 安装VSCODE

1.vscode下载:Documentation for Visual Studio Code

2.双击即可安装

3.相关插件安装:如图所示

3.3 vscode 使用_基本配置

1.创建ROS工作空间

在文件系统中创建ROS工作空间,使用命令行如下:

liuhongwei@liuhongwei-virtual-machine:~$ mkdir -p demo02_ws/src
liuhongwei@liuhongwei-virtual-machine:~$ cd demo02_ws/
liuhongwei@liuhongwei-virtual-machine:~/demo02_ws$ catkin_make

2.启动vscode

在domo02_ws下启动vscode,命令如下:输入后即可启动vscode

liuhongwei@liuhongwei-virtual-machine:~/demo02_ws$ code .

启动后的界面如下

3.vscode中编译ROS

快捷键 ctrl + shift + B 弹出弹窗,选择 catkin_make:build,右面的小齿轮,修改全部代码为

{
"version":"2.0.0",
"tasks":[
{
"label":"catkin_make:debug",
"type":"shell",
"command":"catkin_make",
"args":[],
"group":{"kind":"build","isDefault":true},
"presentation":{"reveal":"always"},
"problemMatcher":"$msCompile"
}]
}

这样按下ctrl + shift + B就会自动编译,十分方便

4.创建ROS功能包

右击src,选定箭头指向选项,依次输入功能包名称与依赖(roscpp rospy std_msgs),功能包创建完成,快捷键编译一下看看有没有问题

5.python实现 / C++实现

C++实现:
Ⅰ.在src下创建cpp文件

#include "ros/ros.h"

int main(int argc , char *  argv[])
{
    ros::init(argc,argv,"hello_c");
    ROS_INFO("hello lhw");
    return 0 ;
}

Ⅱ.修改cmakelist

 Ⅲ.执行

终端,新建终端,首先启动ROSCORE工作核心;再新建一个终端,

source ./devel/setup.bash
rosrun hello_vscode hello_vscode_c

python实现:

1.在hello_vscode下建立scripts文件夹,在文件夹里建立py文件

2.写好python代码

#! /usr/bin/env python

import rospy
if __name__ == "__main__":
        rospy.init_node("hello_p")
        rospy.loginfo("hello")

3.更改scripts权限:右键,打开终端,输入:

chmod +x *.py

4.修改配置文件并编译

 catkin_install_python(PROGRAMS
    scripts/hello_vscode_p.py
   DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION}
 )

5.启动roscore核心

6.配置环境变量

source ./devel/setup.bash
rosrun hello_vscode hello_vscode_p

 

6.中文乱码问题

在main函数的第一句加上一句语句

setlocale(LC_ALL,"");
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Chapter1 ROS概述与环境搭建 的相关文章

  • Spark 请求最大计数

    我是 Spark 的初学者 我尝试请求允许我检索最常访问的网页 我的要求如下 mostPopularWebPageDF logDF groupBy webPage agg functions count webPage alias cntW
  • Python中Decimal类型的澄清

    每个人都知道 或者至少 每个程序员都应该知道 http docs oracle com cd E19957 01 806 3568 ncg goldberg html 即使用float类型可能会导致精度错误 然而 在某些情况下 精确的解决方
  • pydev 调试器:严重警告:此版本的 python 似乎编译不正确(内部生成的文件名不是绝对的)[重复]

    这个问题在这里已经有答案了 通过运行 from sklearn datasets import fetch california housing import pandas as pd pd set option precision 4 m
  • Python模块可以访问英语词典,包括单词的定义[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我正在寻找一个 python 模块 它可以帮助我从英语词典中获取单词的定义 当然有enchant 这可以帮助我检查该单词是否存在于英语中
  • python 模拟第三方模块

    我正在尝试测试一些处理推文的类 我使用 Sixohsix twitter 来处理 Twitter API 我有一个类充当 Twitter 类的外观 我的想法是模拟实际的 Sixohsix 类 通过随机生成新推文或从数据库检索它们来模拟推文的
  • 如何使用 Plotly 中的直方图将所有离群值分入一个分箱?

    所以问题是 我可以在 Plotly 中绘制直方图 其中所有大于某个阈值的值都将被分组到一个箱中吗 所需的输出 但使用标准情节Histogram类我只能得到这个输出 import pandas as pd from plotly import
  • 如何创建一个语句来打印以特定单词开头的单词? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 如何在 python 中打印从特定字母开始的单词 而不使用函数 而是使用方法或循环 1 我有一个字符串 想要打印以 m 开头的单词 S
  • 以同步方式使用 FastAPI,如何获取 POST 请求的原始正文?

    在中使用 FastAPIsync not async模式 我希望能够接收 POST 请求的原始 未更改的正文 我能找到的所有例子都显示async代码 当我以正常同步方式尝试时 request body 显示为协程对象 当我通过发布一些内容来
  • python suds SOAP 请求中的名称空间前缀错误

    我使用 python suds 来实现客户端 并且在发送的 SOAP 标头中得到了错误的命名空间前缀 用于定义由element ref 在 wsdl 中 wsdl 正在引用数据类型 xsd 文件 请参见下文 问题出在函数上GetRecord
  • 使用 OLS 回归预测未来值(Python、StatsModels、Pandas)

    我目前正在尝试在 Python 中实现 MLR 但不确定如何将我找到的系数应用于未来值 import pandas as pd import statsmodels formula api as sm import statsmodels
  • 对图像块进行多重处理

    我有一个函数必须循环遍历图像的各个像素并计算一些几何形状 此函数需要很长时间才能运行 在 24 兆像素图像上大约需要 5 小时 但似乎应该很容易在多个内核上并行运行 然而 我一生都找不到一个有据可查 解释充分的例子来使用 Multiproc
  • 使用鼻子获取设置中当前测试的名称

    我目前正在使用鼻子编写一些功能测试 我正在测试的库操作目录结构 为了获得可重现的结果 我存储了一个测试目录结构的模板 并在执行测试之前创建该模板的副本 我在测试中执行此操作 setup功能 这确保了我在测试开始时始终具有明确定义的状态 现在
  • 如何设置 Celery 来调用自定义工作器初始化?

    我对 Celery 很陌生 我一直在尝试设置一个具有 2 个独立队列的项目 一个用于计算 另一个用于执行 到目前为止 一切都很好 我的问题是执行队列中的工作人员需要实例化一个具有唯一 object id 的类 每个工作人员一个 id 我想知
  • 将 2D NumPy 数组按元素相乘并求和

    我想知道是否有一种更快的方法 专用 NumPy 函数来执行 2D NumPy 数组的元素乘法 然后对所有元素求和 我目前使用np sum np multiply A B 其中 A B 是相同维度的 NumPy 数组m x n 您可以使用np
  • 如何在 python 中没有 csv.reader 迭代器的情况下解析单行 csv 字符串?

    我有一个 CSV 文件 需要重新排列和重新编码 我想跑 line line decode windows 1250 encode utf 8 在由 CSV 读取器解析和分割之前的每一行 或者我想自己迭代行 运行重新编码 并仅使用单行解析表单
  • Python 将日志滚动到变量

    我有一个使用多线程并在服务器后台运行的应用程序 为了无需登录服务器即可监控应用程序 我决定包括Bottle http bottlepy org为了响应一些HTTP端点并报告状态 执行远程关闭等 我还想添加一种查阅日志文件的方法 我可以使用以
  • 使用yield 进行字典理解

    作为一个人为的例子 myset set a b c d mydict item yield join item s for item in myset and list mydict gives as cs bs ds a None b N
  • Tkinter - 浮动窗口 - 调整大小

    灵感来自this https stackoverflow com a 22424245 13629335问题 我想为我的根窗口编写自己的调整大小函数 但我刚刚注意到我的代码显示了一些性能问题 如果你快速调整它的大小 你会发现窗口没有像我希望
  • 迭代 my_dict.keys() 并修改字典中的值是否会使迭代器失效?

    我的例子是这样的 for my key in my dict keys my dict my key mutate 上述代码的行为是否已定义 假设my dict是一本字典并且mutate是一个改变其对象的方法 我担心的是 改变字典中的值可能
  • 当鼠标悬停在上面时,intellisense vscode 不显示参数或文档

    我正在尝试将整个工作流程从 Eclipse 和 Jupyter Notebook 迁移到 VS Code 我安装了 python 扩展 它应该带有 Intellisense 但它只是部分更糟糕 我在输入句点后收到建议 但当将鼠标悬停在其上方

随机推荐

  • mac 安装adb工具

    1 安装homebrew 在终端输入下面的命令 ruby e curl fsSL https raw githubusercontent com Homebrew install master install 2 安装adb brew in
  • conda install & pip install区别 & 查看当前环境下包的情况

    conda可以方便开发管理python环境 包可以conda 安装有时使用pip整理一下不同点 conda 创建环境 conda create name a conda env python 3 6 名为a conda env python
  • SVG图标配置

    在开发项目的时候我们经常会用到svg矢量图 而且我们使用SVG以后 页面上加载的不再是图片资源 这对页面性能来说也是个很大的提升 项目背景 vue3 vite ts 安装依赖 npm install vite plugin svg icon
  • 202320读书笔记|《宋词》——竹杖芒鞋轻胜马,谁怕?一蓑烟雨任平生

    202320读书笔记 宋词 竹杖芒鞋轻胜马 谁怕 一蓑烟雨任平生 宋词 韩震主编 偶然从书友那加入书架的书 宋词挺喜欢李清照的词以及知否的 菩萨蛮 诗集 词 俳句 短歌我都很喜欢 是轻松有趣又简短的 这本书里有一些是上学时候背过的 看到的时
  • log4j2 入门学习与总结

    log4j2 2 3 入门学习与总结 大纲 log4j2 配置文件加载 log4j2 配置文件结构图 log4j2 配置文件说明 log4j2 Appenders child Filter ThresholdFilter 的使用 log4j
  • 【云原生之K8S】Yaml文件详解

    目录 一 K8S支持的文件格式 1 1 yaml和json的主要区别 二 YAML 2 1 查看API资源版本标签 2 2 编写资源配置清单 编写nginx test yaml资源配置清单 创建资源对象 查看创建的pod资源 2 3 创建s
  • C++中的适配器

    C primer中关于适配器的定义 适配器 adaptor 是使一种事物的行为类似于另外一事物的行为的一种机制 这个定义初学时觉得好抽象 为了理解C 中的适配器 不妨先了解物理上的适配器 物理上的适配器就是一个接口转换器 它可以是一个独立的
  • 我如何搞懂Javascript系列之原型和原型链

    理解原型 JavaScript 常被描述为一种基于原型的语言 每个对象拥有一个原型对象 对象以其原型为模板 从原型继承方法和属性 原型对象也可能拥有原型 并从中继承方法和属性 一层一层 以此类推 这种关系常被称为原型链 构造函数创建对象 J
  • JS常用方法

    1 删除数组中指定对象指定元素 let arr name xiaowang id 1 name xiaozhang id 2 createDate xiaoli id 3 删除id为1的对象 其中i为index 1可选择性填写 含义为删除当
  • 传递颜色

    由于颜色在片元着色器中 故不能用attribute 用uniform得到并传递 11
  • python中国古代数学问题——二鼠打洞

    任务描述 九章算术 的 盈不足篇 里有一个很有意思的老鼠打洞问题 原文是这么说的 今有垣厚十尺 两鼠对穿 大鼠日一尺 小鼠亦一尺 大鼠日自倍 小鼠日自半 问 何日相逢 各穿几何
  • 剑指 Offer 10- I. 斐波那契数列(java+python)

    写一个函数 输入 n 求斐波那契 Fibonacci 数列的第 n 项 即 F N 斐波那契数列的定义如下 F 0 0 F 1 1 F N F N 1 F N 2 其中 N gt 1 斐波那契数列由 0 和 1 开始 之后的斐波那契数就是由
  • C/C++语言 从日期格式字符串中提取年月日时分秒

    系列文章目录 文章目录 系列文章目录 前言 一 日期格式字符串 二 strftime函数 1 描述 2 声明 3 形参 4 返回值 三 strptime函数 1 形参 2 示例 3 函数封装 总结 前言 上一篇文章 C C 语言 获取系统时
  • MES管理系统如何帮助制造企业打造透明化工厂

    在制造型企业的运营中 车间现场管理至关重要 然而 面临着信息传递速度慢 跨部门协作困难 生产进度无法及时掌握 制造品质不良 设备故障不能及时处理等困境 企业需要寻求有效的解决方案 MES生产管理系统作为针对制造企业车间生产过程控制和管理的解
  • 如何在使用中文输入法的时候打出英文字符

    解决方法很简单 只需要按CTRL 就可以实现中英文字符切换 这样在按字母的时候还是会显示拼音 但输入字符时都是英文字符了 避免了频繁的shift切换
  • 【Qt学习】07:绘图与绘图设备

    OVERVIEW 绘图与绘图设备 一 QPainter 二 QPainterDevice 1 QPixmap 2 QBitmap 3 QImage 4 QPicture 绘图与绘图设备 一 QPainter Qt 的绘图系统允许使用API在
  • unsigned int用法

    注意使用unsigned int 无符号常数 正如我们所知道的 编程语句都有很多的基本数据类型 如char inf float等等 而在C和C 中还有一个特殊的类型就是无符号数 它由unsigned修饰 如unsigned int等 大家有
  • visible.sync 的作用

    我们在前端开发中经常看到 visible sync这种修饰符 很多人不知道这是干什么的 特别是在使用ElementUI的时候 里面有个弹窗el dialog组件的时候会有用到 visible sync
  • VUE项目中的全局格式化时间过滤器

    1 全局过滤器 https blog csdn net weixin 45054614 article details 105368776 全局时间格式化 对名称进行定义 提供一个function函数 originVal 为形参 Vue f
  • Chapter1 ROS概述与环境搭建

    一 序言 学习一个新的知识模块时 要先了解模块的相关概念 安装官方软件包 搭建其集成的开发环境 这些完成后 继续开始开创新领域的大门 二 ROS简介 2 1 ROS的概念 一个比喻 机器人的控制集成硬件设计 嵌入式软件设计 上层软件设计 l