学习一个新的知识模块时,要先了解模块的相关概念,安装官方软件包、搭建其集成的开发环境,这些完成后,继续开始开创新领域的大门。
①一个比喻:
机器人的控制集成硬件设计、嵌入式软件设计、上层软件设计(linux)、机械结构设计、机械加工为主。上层软件设计相当于人的大脑、嵌入式软件设计相当于人的小脑,大脑采集机器人感觉到的外部信息进行处理运算,再将执行命令下达,但下达并不是直接下达给硬件实现(好比大脑无法直接控制肉体),而是需要通过小脑来控制(软件),再由小脑来控制硬件。笔者认为,这像是计算机组成原理里面的ISA、操作系统与软件的区别。
②ROS的一些模块:
ROS = plumbing(通信) + tools(工具) + capabilities(功能)+ecosystem(生态)
通信:数据交互,如在导航机器人中,需要获取摄像头,或者一些硬件采集数据(雷达+摄像头)
工具:仿真(不用自己买机器人哈哈哈哈哈省钱了兄弟们)
功能:如导航机器人可以实现导航、躲避障碍........这些都自己做的吗?别人做好的模块直接复用,自己进行算法的改进或者调参
生态:开源、掌握话语权
③ROS设计目标(有点抽象.......)
代码重用:类似C++和java的封装思想
分布式:负载均衡,类似计算机网络中OSPF算法。
松耦合:将输入输出标准化,实现自定义(类似C程序设计中的strcpy和mystrcpy)
精简:ROS被设计尽可能精简,以便为ROS编写的代码可以与其它机器人软件框架一起使用。ROS易于与其他机器人软件框架集成。
语言独立性:多语言使用(C++、python、java)
易于测试:ROS具有称为rostest的内置单元/集成测试框架,可轻松安装和拆卸测试工具。
如果安装成功了,那么恭喜你,说句题外话(老子安了一个半小时,真是个弱智).........
那么开始测试ROS
①测试ros,由于ros已经内置了一些小程序,可以运行下列小程序检测ROS是否可以运行
1.首先启动三个命令行(ctrl+alt+t)
2.命令行1输入
roscore
3.命令行2输入:此时会弹出图形化界面
rosrun turtlesim turtlesim_node
4.命令行3输入:可以通过上下左右控制乌龟运动
rosrun turtlesim turtle_teleop_key
然后就是这样了,恭喜您,配置成功啦!
①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 执行。
1.为什么要安装终端:以小乌龟运动为例,开启多个窗口,使视觉比较凌乱
2.安装:
sudo apt install terminator
1.vscode下载:Documentation for Visual Studio Code
2.双击即可安装
3.相关插件安装:如图所示
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,"");