一、前言
学习一个新的知识模块,首先要了解模块的相关概念,安装官方软件包,搭建其集成开发环境。这些完成后,继续打开新领域的大门。
二、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
快捷键弹出弹窗,选择 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" }] }
这样按会自动编译,很方便
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,"");
文章出处登录后可见!