最新消息: USBMI致力于为网友们分享Windows、安卓、IOS等主流手机系统相关的资讯以及评测、同时提供相关教程、应用、软件下载等服务。

文件-转存

业界 admin 11浏览 0评论

微信文件自动存储路径:C:\Users\why\Documents\WeChat Files\wxid_m5s1yimjnl4422\FileStorage\File\2022-03

scanf : 返回值

查询数组大小

sizeof( 数组名)/ sizeof(数组名[0]) eg :sizeof(num)/ sizeof(num[0])

1、定义接口文件(msg、srv文件) 2、cmakelist 里编译文件

3、git remote -v : 查看所有远程库链接

4、git status : 查看所有文件状态

5、git status ### : 查看指定文件状态

6、typora : control+, : 设置图片保存路径

windows 命令行删除磁盘

diskpart

list disk

select disk 磁盘号

gitee 文件上传云端

1、初始化工作空间

git init

2、 添加提交所有文件

git add .

git add ### : 添加单个文件

3、 查看文件状态(可忽略)

git status : 查看所有文件状态

git status ### : 查看指定文件状态

4、提交到本地仓库

git commit -m "备注"

5、添加提交仓库的地址(若前面添加过忽略此步)

git remote add origin https://gitee/why_123456/studio.git

6、提交到仓库

git puh -u origin "master"

7、若忘记前面是否提交过仓库地址,可用下面命令查询

git remote -v : 查看所有远程库链接

8、查看文件中修改的内容

git diff 文件名

9、查看日志信息

git log

10、想上传一个嵌套项目到服务器,假设我在其中一个子模块进行了修改,那么需要先进到这个子模块,将子模块的修改使用:" git stash push "指令将其推到一个独立的栈中,(如果子模块是游离态,则将游离态先通过 “ git checkout main ”指令切换到主分支)然后再使用“ git pull ”将代码更到最新,再代码更到最新后,再使用“  git stash pop ”指令恢复,恢复后手动解决冲突,在冲突解决后再把代码使用git add "文件夹名或文件名"提交修改

11、撤销git add . 以及git commit操作指令

软链接常见操作

  1. 为文件创建软链接

    ln -s /path/to/original_file /path/to/link_name
  2. 为目录创建软链接

    ln -s /path/to/original_directory /path/to/link_name
  3. 覆盖已有的软链接(使用 -f 选项): 如果已经存在同名的软链接,可以使用 -f 选项强制覆盖:

    ln -sf /path/to/new_target /path/to/existing_link
  4. 查看软链接是否创建成功: 使用 ls -l 命令查看软链接是否创建成功。软链接会显示为 -> 指向的文件:

    ls -l /path/to/link_name

      5.删除软链接:删除软链接时可以直接使用 rm 命令

rm /path/to/link_name

功能包查找

使用sudo apt install nlohmann-json-dev安装“nlohmann-json-dev”包,发现无法安装;

可使用apt search nlohmann来查看有哪些相关的包,输出如下:

Sorting... Done
Full Text Search... Done
nlohmann-json3-dev/focal,focal 3.7.3-1 all
  JSON for Modern C++

发现有nlohmann-json3-dev包可替代“nlohmann-json-dev”包,输入:sudo apt install nlohmann-json3-dev安装即可,这种方式会安装到 /usr/include 目录下。

在正常安装后,如果 nlohmann_json 已经通过系统的标准路径安装(如 /usr/include),那么不需要使用 find_package 来查找它。可以直接包含头文件,而无需 CMake 查找相关配置。

CMakeLists.txt 中,直接通过 include_directories 添加 /usr/include 路径。确保没有使用 find_package(nlohmann_json REQUIRED),并且像下面这样添加 include_directories

find_package(catkin REQUIRED COMPONENTS
  roscpp
  std_msgs
)

# 添加 /usr/include 目录以便包含头文件
include_directories(
    include
    /usr/include
    ${realsense2_INCLUDE_DIR}
    ${catkin_INCLUDE_DIRS}
    )

catkin_package(
    LIBRARIES ${PROJECT_NAME}
    CATKIN_DEPENDS message_runtime roscpp sensor_msgs std_msgs
    nodelet
    cv_bridge
    image_transport
    ddynamic_reconfigure
    nav_msgs
    )

add_executable(D435i_pose src/D435i_pose.cpp)
target_link_libraries(D435i_pose ${catkin_LIBRARIES})

空文件夹怎么上传到gitee

描述:将本地项目上传至gitee的方法截图 (ubuntu 同理)
  1:在gitee上创建以自己项目名称命名的空项目


  2:查看自己的用户名及邮箱

进入设置查看自己的邮箱和用户名


  3: 配置你的用户名及邮箱

git config --global user.name "用户名"
git config --global user.email "邮箱"

  4:查看用户名及邮箱

git config user.name
git config user.email

  5:初始化本地环境,把该项目变成可被git管理的仓库

git init

  6:添加该项目下的所有文件

git add .

  7:使用如下命令将文件添加到仓库中去

git commit -m '本次提交的说明'

  8:将本地代码库与远程代码库相关联

git remote add origin https://gitee/仓库名称

  9:强制把远程仓库的代码跟新到当前分支上面。ps:如果仓库为空这一步可以跳过

git pull --rebase origin master

  11:将本地代码推送到指定远程的仓库中

git push -u origin master

 Cmake 记录

eg:

gcc 编译

vs studio 使用快捷键

选中多行注释 : ctrl + k >> ctrl +c 将使用多行注释来注释代码

选中多行注释 : chtl + k >> c 使用单行注释直接注释多行代码

在ROS上下载某个功能包:

1、进入ROS官网,找到packages >> search ROS

2、找到功能包名,点击进入 >> 进入github网址

        

3、使用git clone 下载或者直接下载ZIP格式;等待下载完成。

ros坐标系:

                           

static_transform_publisher工具的功能是发布两个参考系之间的静态坐标转换,两个参考系一般不发生相对位置变化:

命令格式如下:

▲ static_transfrom_publisher x y z yaw pitch roll frame_id child_frame_id period_in_ms
    使用以米为单位的 x/y/z 偏移量和以弧度为单位的偏航/俯仰/滚动,将静态坐标变换发布到 tf。(偏航是围绕 Z 的旋转,俯仰是   围绕 Y 的旋转,滚动是围绕 X 旋转)。该周期(以毫秒为单位)指定发送转换的频率。100ms(10hz)是一个不错的值。
▲ static_transfrom_publisher x y z qx qy qz qw frame_id child_frame_id period_in_ms
    使用 x/y/z 偏移量(以米和四元数为单位)将静态坐标变换发布到 tf。该周期(以毫秒为单位)指定发送转换的频率。100ms(10hz)是一个不错的值。

一、ros 常用命令

rqt_graph : 查看节点图

rosnode list : 查看节点列表

rostopic list : 查看话题列表

rosnode info xxx : 查看节点信息

rostopic info xxx : 查看话题信息

rosmsg show xxx : 显示消息数据类型

rosservice info xxx : 查看服务信息

env | grep ros : 查看与ros有关的环境变量

rospack : 查询功能包信息

rosdep :安装功能包依赖

rqt : 将功能包依赖可视化为一个图

package.xml : 定义了功能包的属性,如名称、版本号、对其他功能包的依赖等

topic相关命令:

rostopic info xxx : 查询话题相关的信息

rosmg show xxx : 查询数据相关信息

rostopic find 消息类型 : 从数据类型查找话题

rostopic type 话题 :查看话题的数据类型

rostopic pub -r 10 话题名+tab(自动补全) [-r: 循环发布 10:频率HZ] : 话题发布

rostopic echo xxx: 打印话题信息

rostopic hz : 话题频率

rostopic bw : 话题带宽

rosrun tf view_frames :TF树

grep : 查找内容包含指定的范本样式的文件,如果发现某文件的内容符合所指定 的范本样式,预设grep 指令会把含有范本样式的那一列显示出来。

rosrun rqt_reconfigure rqt_reconfigure

二、创建工作空间与功能包

基础知识储备

工作空间:用于存放工程开发相关文件的文件夹。

src : 代码空间

build : 编译空间

devel : 开发空间

install :安装空间

1、创建工作空间流程

1、新建文件夹 $ mkdir -p ~/catkin_ws/src &&cd ~/catkin_ws/src

2、初始化工作空间 $ catkin_init_workspace

3、编译工作空间 (在catkin_ws路径下)$ catkin_make。 自动搜索src下的所有功能包并编译。自动产生build和devel文件夹,build存放二进制文件(一般用不到),devel存放可执行文件位于devel/lib中。

4、创建安装空间(在catkin_ws路径下) $ catkin_make install

5、设置环境变量,$ source devel/setup.bash (如果终端为zsh,后缀写.zsh)。查看当前ROS包环境变量,$ echo ROS_PACKAGE_PATH,不用每次都source的方式是直接编辑~/.bash文件,在最后加入source /home/username/catkin_ws/devel/setup.bash注意这里的路径用 pwd命令查看一下,要加入具体的username。

2.创建功能包

1.在 src下创建功能包$ catkin_create_pkg <pkg_name>[depend3][depend2] ( 一般都要依赖std_msgs rospy roscpp)

2.返回工作空间下,进行编译 $ catkin_make,注意功能包不能重名。功能包与文件夹的区别,功能包必须含有 CMakelist.txt和 package.xml。

三、Topic话题的发布和订阅实现

  1. ROS Topic话题通信,发布者实现流程

    1.初始化节点 ros::init(argc,argv,"node_name")
    
    2.创建句柄 ros:: NodeHandle node;//node 可以写为 n
    
    3.Master 注册节点信息,创建publisher,发布话题topic,定义话题消息类型
    
    ros:: Publisher pub = node.advertise<[msg_type]>("[topic_name]",1000); //消息类型,话题名
    
    4.设置发布频率 ros:: Rate loop_rate(单位:hz)
    
    5.循环发布,以ROS状态为循环条件:
    
    while (ros::ok()){
    
        1> 定义话题中信息数据,并赋值 ros::msg_typemsg;
    
        2>节点发布消息 pub.publish(msg); 打印消息:ROS_INFO("")
    
        3>基于发布频率延迟发布 loop_rate.sleep();
    
    }

fast - lab 学习

ego_planner 笔记

实机飞行中可修改参数:

<1> src >> plan_manage >> launch >> single_run_in_exp.launch

<2> src >> plan_manage >> launch >> advanced_param.xml

<3> src >> plan_manage >> launch >> advanced_param_exp.xml

小车学习笔记

一、基础操作笔记

常用软件安装:

  1. terminator

    sudo apt install terminator

    常用指令

补充:SSH 密钥登录

直接使用:

1.小车开机,连接WIFI,密码:dongguan。

2.SSH远程登录:ssh -Y wheeltec@192.168.0.100,密码:dongguan


1.SSH简述与安装(Secure Shell) Secure Shell(SSH) 是由 IETF(The Internet Engineering Task Force) 制定的建立在应用层基础上的安全网络协议。 我们这里使用的是SSH在Ubuntu中的免费开源实现,使用它主要是方便远程使用ROS小车的功能。 一般Ubuntu系统默认自动安装有ssh客户端,服务端需要自行安装 sudo apt-get install openssh-server 查看系统是否已经安装ssh客户端或者服务端:dpkg -l | grep ssh。 启动ssh服务:sudo /etc/init.d/ssh start 关闭ssh服务:sudo /etc/init.d/ssh stop 重启ssh服务:sudo /etc/init.d/ssh restart

服务端:ROS小车上的树莓派/Nano/TX2/NX/工控机 客户端:其它Ubuntu电脑/虚拟机

两种登录方式:账号密码登录、公钥密钥登录。

2.账号密码登录 ssh -Y 服务端用户名@服务端ip地址 选择端口号: ssh -p 22 -Y 服务端用户名@服务端ip地址 服务端修改端口号:/etc/ssh/sshd_config,修改Port sudo /etc/init.d/ssh restart 对称加密:是采用单钥密码系统的加密方法,使用同一密钥对信息进行加密和解密的加密方法。 1.客户端向SSH服务器发出请求,服务器将自己的公钥返回给客户端。 2.客户端用服务器的公钥加密自己的登录密码,再将信息发送给服务器。 3.服务器接收到客户端传统的密码,用自己的私钥解码。如果结果正确,则同意登录,建立起连接,否则拒绝。

非对称加密:需要两个密钥:公共密钥和私有密钥,它们成对出现,公钥加密的数据有且只有私钥能解密,私钥加密的数据有且只有公钥解密,相对于“对称加密”,“非对称加密”加密方法加密和解密使用不同的密钥,所以叫“非对称加密”加密方法。

3.公钥密钥登录(免密登录) 生成公钥密钥对:ssh-keygen -t rsa(客户端) 上传公钥到服务端:ssh-copy-id 服务端用户名@服务端ip地址

4.别名登录

~/.ssh/config(客户端)

Host wheeltec HostName

192.168.0.100

User wheeltec

Port 22

1、编译过程cmakelists.txt

常用cmakelists宏

cmake_minimum_required() CMake版本

project() 项目名称

find_package() 添加依赖

add_executable() 生成可执行文件

target_link_libraries() 可执行文件链接到库

catkin_package() 编译生成信息导出

其他的cmakelists宏:

add_message_files() 添加话题消息类型文件

add_service_files() 添加服务消息类型文件

add_action_files() 添加行为消息类型文件

generate_messages() 生成消息文件

nclude_directories() 添加头文件路径

add_dependencies() 添加依赖项

add_library() 生成自定义的库

install() 安装规则

2、package.xml

必要的package.xml标签

<package format = "2"> 根标签

<name > 包名 </name>

<version>版本号</version>

<descriptioon>描述</descriptioon>

<maintainer email = "邮箱">维护者</maintainer>

<license>开源许可</license>

...................

</package>

可选的package.xml标签

<depend> 指定依赖项为编译、 导出、 运行需要的依赖

<build_depend> 编译依赖项

<build_export_depend> 导出依赖项

<exec_depend> 运行依赖

<test_depend> 测试用例依赖项

<buildtool_depend> 编译构建工具

<doc_depend> 文档依赖项

3、Launch param启动文件

标签大全:

<node>...</node>或者<node .... /> 两种形式;

node使用模板

**<node pkg="功能包名" type="节点类型(可执行的cpp文件或者py文件)" name="节点名">**

include嵌套实例:

最简单节点写入:

<node name = '节点名' pkg = "文件夹名" type ="可执行文件"/node>

实例:

<node  name = "send_mark" pkg = "turn_on_wheeltec_robot" type = "send_mark.py">
​
</node>

remap重命名实例:

三个参数比较:<param>、<rosparam>、<arg>

<param> 在参数服务器添加一个参数

<rosparam> 从“.yaml”文件中导入大量参数

<arg> 在launch 文件中声明一个参数 (用于动态传参,类似于函数的参数,可以增强launch文件的灵活性)

参数实例

<param name ="" type ="数据类型" value =""/>

group分组实例:

第一种是将许多节点同时划分进某个工作空间,从而实现对node的批量管理;

group if = "$(eval mapping_mode == 'gmapping')"时,当if 属性为o时,忽略<group></group>之间的标签。

$(arg arg-name) //$() 这个符号出现的任何地方,roslaunch命令都将会把它替换成给定argument 的值(value)。

参数命令大全:

激光雷达数据中,inf代表障碍物距离太远或者太近或者没检测到障碍物

4、TF坐标变换

tf 树:

rosrun tf view_frames

4.1静态坐标关系

args : xyz三轴偏移量(单位:米)

yaw pitch roll 三周弧度(rad)

link1_parent、link1 : 父坐标和子坐标

period_in_ms :发布频率(单位:ms)

qx、qy、 qz、qw :四元数表示姿态,上面用yaw 、pitch、 roll表示

4.2动态坐标关系:TF广播器与监听器

TF广播器 :将两个TF坐标广播出去

sendtransform :成员函数,将TF消息广播出去

TF监听器:接收TF两坐标间关系

第一步:tfbuffer :创建一个对象

transfromlistener : 对前面的tfbuffer 进行构造和初始化

第二步:实例化geomestry_msgs::transfromstamp的消息数据类型的结构体,用来装载两个TF坐标之间的信息。

第三步:使用lookuptransfrom这个类成员函数对两个TF进行关系监听,将监听的信息给geomestry_msgs::transfromstamp的结构体

海龟实验ROS:

roslaunch  turtle_tf2  turtle_tf2_demo_cpp.launch

海归自动追踪

查看两个TF坐标变换关系:rosrun tf tf_echo turtle2 turtle1(turtle2、 turtle1代表需要查询的两个TF坐标的frame id)

TF广播器与监听器的实现

补充知识

        int main(int argc, char **argv)

argc : 表示传入main()函数的参数个数

argv : 表示传入main函数的参数序列或者指针,因此,无论是否有没有输入 参数,argv都会输入一个程序的名称。

5、程序修改与编译

编译使程序修改生效(.c .cpp .h 文件需要编译,若修改的是.py .launch .urde 等文件则不需要编译)

编译时多线程编译:catkin_make -j2 -l2

(-j : 代表允许2个编译命令同时进行,一般以CPU核心数目的两倍最好)

(-L :系统加载的任务书数,数目一般与-j 数目保持一致)

指定编译单个功能包:

catkin_make-DCATKIN_WHITELIST_PACKAGES="功能包名"

(指定编译之后,后面编译都是指定功能包编译,想要解除,输入下面命令)

解除指定功能包编译:

catkin_make-DCATKIN_WHITELIST_PACKAGES=""

sublime text 软件常见快捷键:

alt + shift + 分栏的数目: 界面分栏

ctrl + shift +f : 全局搜索

ctrl + p 输入:函数所在文件关键词@函数关键词(输入函数关键词后可通过方向键选择函数文件)

ctrl + d : 多字符

ctrl + z : 撤销修改

ctrl +Y : 回复修改

ctrl +F : 查找关键字

ctrl +Shift + k :删除整行

ctrl +/ :注释单行

ctrl +shift +/ :注释多行

Tab : 向右缩进

shift + tab :向左缩进

ctrl + m : 光标移动到括号内或开始的位置

6、查看里程计、IMU话题信息

6.1 启动初始化节点(wheeltec终端)

roslaunch turn _on_wheeltec_robot  turn _on_wheeltec_robot.launch

6.2 查看当前存在的话题(pssoni终端)

rostopic list

6.3 查看里程计信息

rostopic echo /odom

查看IMU信息

rostopic echo /moblie_base/mobile_base/sensors/imu_data

查看小车电压

rostopic echo /PowerVolage
rostopic info /odom
rosmsg show nav_msgs/Odometry

7、激光雷达建图

7.1 启动激光建图

roslaunch turn_on_wheeltec_robot mapping.launch

7.2 查看见图效果

rviz

7.3 使用键盘控制节点控制小车运行(或其他方法)

roslaunch wheeltec robot_rc keyboard_teleop.launch

7.4 建图完成后保存地图

1.保存到想要的路径:
    rosrun map_server map_saver -f 地图名
2.一键保存地图:
    roslaunch turn_on_wheeltec_robot map_saver.launch 
    (文件位置在turn_on_wheeltec_robot/map/map_saver.launch ,可在args里面自行修改路径)

7.5 地图可使用ps编辑

8、建图算法切换

8.1 各种算法切换

在src\turn_on_wheeltec_robot\launch/mapping.launch文件夹里选择建图算法
启动建图指令 :roslaunch turn_on_wheeltec_robot mapping.launch

gmapping 发布的话题:

目前比较常用的建图算法。构建大地图时所需内存和计算量都会增加,故不适合构建大场景地图。因为没有回环检 测,所以 在回环闭合时可能会造成地图 错位。

hector 发布话题:

不需要里程计,人抱着小车走也可以建图。效果不如 gmapping,适合因条 件限制没有里程计的机器人。 建图时转向 速度 尽量缓慢,建议 0.1rad/s

可在rviz中查看位姿估计,通过add中的话题添加posewithcovaria、pose

cartographer 算法:

8.2 保存rqt_graph 节点话题图

1.打开rqt_graph ;

2.点击保存,在选择保存路径。

8.3 TF树图片保存(位置在主目录下frames.pdf)

rosrun tf view_frames

8.4 当建图算法为hector时,可使用如下命令重置地图

rostopic pub /syscommand std_msgs/String "data:'reset'"

8.5 建图速度越慢,效果越好。

9、自主导航

9.1 直接上手使用及launch文件讲解

直接上手使用

9.1.1 把小车放置在地图起点/rviz手动设置起点

9.1.2 运行导航

roslaunch turn_on_wheeltec_robot navigation.launch

9.1.3 启动rviz

rviz设置起点方法

9.1.4 使用rviz 2DNavGoal功能

9.1.5 配置路径规划时的线条 及地图

地图 (在navigation.launch文件中调用的,可自行修改地图)

线条

手动发布目标点(可取代2D NAV GOAL)

rostopic pub /move_base_simple/goal
四元数
    x = ax*sin(theta/2)
    y = ay*sin(theta/2)
    z = az*sin(theta/2)     
    w = cos(theta/2)

总结:先建图,在使用建立的地图进行导航

1、建图:

roslaunch turn_on_wheeltec_robot mapping.launch

2、启动rviz

rviz

3、使用键盘控制或者遥控控制小车移动

roslaunch wheeltec robot_rc keyboard_teleop.launch

4、保存建立的地图

保存到想要的路径:
    rosrun map_server map_saver -f 地图名

5、使用建立的地图进行导航(在navigation.launch文件中调用前面建立的地图,可自行修改地图)

roslaunch turn_on_wheeltec_robot navigation.launch

9.2 自主导航 整体导航工作原理及参数配置讲解

9.2.1 建图与导航的定位方式

建图与导航的定位一般使用robot_pose_ekf功能包进行定位,该功能包订阅odom和imu话题,发布地图和 小车的TF坐 标关系和经过扩展卡尔曼滤波的odom话题。

9.2.2 Navigation 工作框架

9.2.3 acml 功能包

9.2.4 movebase 功能包

src\turn_on_wheeltec_robot 目录下的param里的yaml文件修改小车尺寸,从而修改膨胀尺寸

note : 当机器人是圆形时,可使用半径来描述

参数配置文件

10、多点导航

11、激光雷达跟随

1、相关功能包 :rplidar_ros 和 simple_follower (两个文件夹都有cfg文件,都是rqt在线调参时的参数)

2、雷达节点主要cpp文件 : node.cpp 作用:对雷达原始数据进行处理,发布scan话题,在scan话题上发布LaserScan类型的雷达消息数据。

3、节点启动命令:roslaunch simple_follower laser_follower.launch

12、查看RGB摄像头和深度摄像头

RGB节点启动:roslaunch usb_cam usb_cam-test.launch

查看话题信息:rostopic list

查看图像话题:rqt_image_view

深度摄像头启动:roslaunch astra_camera astra.launch

查看话题信息:rostopic list

查看图像话题:rqt_image_view 选择depth/image 查看深度摄像头

13、视觉跟随

视觉跟随是实现小车对目标颜色的物体进行跟踪,通过ROS中cv_bridge功能包作为端口,将图像信息传给open从v,从而实现多种视觉功能。

13.1 实际操作

启动视觉跟随功能包:(会寻找视野范围内的物体,进行移动)

roslaunch simple_follower visual_follower.launch

进行实时调参

rqt >> plugins >> configuration >> dynamic reconfigure

13.2 视觉跟随流程

目标识别(visualTracker.py)、物体追踪(visual_follow.py)

13.3 视觉跟随参数调整

法一:直接在节点的launch文件中修改param,即修改参数服务器中的参数

在follow文件中,可修改最大速度与目标距离

在tracker文件中,可修改不同颜色的阈值参数

法二:使用rqt 在线调参(只能在本次节点运行时有效)

14 视觉巡线

实际操作

roslaunch simple_follower line_follower.launch

15 RGBD摄像头建图与导航

15.1 安装rtabmap

##更新软件列表
	sudo apt-get update
##安装rtabmap
	sudo apt-get install ros-melodic-rtabmap-ros
15.2 测试包
roslaunch rtabmap_ros demo_robot_mapping.launch   ##这样会打开自带的可视化工具
roslaunch rtabmap_ros demo_robot_mapping.launch rviz:=ture rtabmap:=false  ##关闭自带可视化工具,打开rviz
##启动第二行指令后,跑图像包
rosbag  play --clock demo_mapping.bag

打rviz后,pointcloud2点云地图是每一帧的点云,而mapcloud代表建图开始至今的所有点云地图合集,map 代表2D地图,mapgraph 代表机器人运动轨迹路线(下图紫线)。

RGBD摄像头建图本质就是2D和3D点云图配合到一起。

15.3 建图(gmapping,查看TF树和话题结构)

输入的话题:

1>里程计: /odom (nav_msgs/Odometry)

2>雷达: /scan(snr_mgs/LaserScan)

3>摄像头:/camera/rgb/image_raw (sensor_msgs/Image)

/camera/rgb/image_info (sensor_msgs/CamerInfo)

/camera/depth/image` (sensor_msgs/Image)

4>

16、纯视觉建图

可自行设置rviz,设置如下

MapCloud : 订阅话题为rtabmap/mapData

Map : 地图,订阅话题为 rtabmap/grid map

TF : TF坐标(参考4设置)

RobotModel : 机器人模型

启动命令:

建图:
roslaunch turn_on_wheeltec_robot pure3d_mapping.launch

自行设置rviz:
rviz

键盘控制小车移动:
roslaunch wheeltec_robot_rc keyboard_teleop.launch

导航:
roslaunch turn_on_wheeltec_robot pure3d_navigation.launch

note : 摄像头限制,障碍物与摄像头距离<0.6m时,无法识别障碍物。

在使用导航时,rviz还需再添加两个地图,一个作为全局地图,一个局部代价地图

路径规划(path),一个全局规划(global_plan),一个局部规划(local_plan)

两个雷达(laserscan),一个csan,一个scan2

想要显示多点导航的导航点,rviz中添加markerArray(path_point)

17、KCF跟踪

launch所涉及节点:

1、小车初始化节点

2、RGB摄像头的深度摄像头

3、python 的图像处理(图像压缩)

4、KCF节点

5、接受kcf目标信息以及输出KCF跟踪目标的速度(kcf_follow.py)

在使用KCF跟踪时,框选的目标不能够丢失视野,丢失后有很大概率找不回来所框选的目标。

src/kcf_track/src/runtracker.cpp文件,69行定义的函数为框选函数。

启动KCF跟踪 :

roslaunch kcf_track kcf_tracker.launch

18、AR标签识别与跟随

功能包名:ar_track_alacar

补充:二进制安装功能包,则看不到功能包源码。可在wiki上查看具体信息

主要功能:

1、生成不同大小、分辨率和ID编码的AR标签

2、识别和跟踪单个AR标签姿态,可选择集成相机深度数据,以更好估计姿态

单独运行AR标签识别:路径:turn_ on_wheeltec_robot/ar_label.launch

启动AR标签识别:

roslaunch ros_astra_camera astra.launch

修改基坐标(fixed frame)为ar_link,需提前准备AR标签,可在wiki上下载打印。第一种显示方式:TF;

第二种显示方式:add >> by topic >> ARmaker_points(Marker)

将maker的话题修改为/visualization marker,结果如图

在终端会出现报错,直接忽略此报错!

补充:AR标签可在WIKI下载,也可自己在命令行生成。

自己生成:进入工作空间

rosrun ar_track_alvar createMaker -s 6 1
第一个数字为:生成的AR标签边长
第二个数字:AR标签的编号

AR图片会自动保存在当前路径下

19、物体识别

原理:基于TF算法,调用Object Detection API(谷歌的物体识别系统)实现在ROS系统上进行物体识别 ;进入TensorFlow官网,查看教程

实际操作:

1、进行SSH登录 : ssh -Y wheeltec@192.168.0.100
2、打开源码,选择是否打开图像 src/ros_object_detection/scripts/object_detection/ros_tensorflow_classify.py 文件中的.#cv2.imshow("class",cv_image) 注释的话就不会打开原图,反之亦然。
3、运行物体识别:roslaunch ros_detection ros_tensorflow_classify.launch

进行物体识别时占较大内存,故尽量静态。

物体识别过程:开启物体识别功能 > > 相机获取物体图像信息(image_raw) > > 使用opencv处理图像 > >调用Object Detection API 识别 > > 将已知种类中的UID转换为文字并发布概率值。

20 、网页视频实时监控

ROS中的网页视频实时监控功能包 web_video_server

作用:将ROS视频流信息通过网络实时传送到网页端,我们可通过网络输入网页地址查看图像流。

环境配置:结合小车文档与ros wiki 配置

演示:

1、SSh远程登陆2个窗口 :ssh -Y wheeltec@192.168.0.100
2、打开摄像头 :roslaunch usb_cam usb_cam-test.launch
3、运行video_server可执行文件 : rosrun web_video_server web_video_server
(用于创建等待HTTP请求的服务端,在打印出等待连接时就说明建立好了)
4、打开浏览器 : 输入设备的IP地址,进入网页http://192.168.0.100:8080
5、image_raw : 实时视频 			Snapshot : 拍照

拓展:可根据需要使用不同的相机进行拍摄,只要能运行打开RGB摄像头的文件都可使用该功能。

网页视频实时监控主要流程:

21、自主探索建图

RRT : 快速扩展随机树,可探索未知区域,既可用于建图,还可用于路径规划

使用方法

直接编译功能包 rrt_exploration
适配: 
	rrt_slam.launch和simple.launch 两个文件放置在turn_on_wheeltec_robot功能包下
使用步骤:
	1、启动rrt_slam.launch文件 : roslaunch turn_on_wheeltec_robot rrt_slam.launch
	2、打开RVIZ,点击add >> by topic选择下列话题
		clicked_point					显示随机数的范围点和起点
		detected_points					检测到的边界点
		frontiers						滤波器接收到的边界点,数据同上
		centroids						滤波后的有效边界点
		global_detector_shaps			 全局树
		local_detector_shaps			 本地树
	3、用RVIZ	的publish point 工具,按顺时针或逆时针设置4个树的边界点(围起来必须是一个封闭的四边形),以及一个树的起点(起点尽量靠近小车起点),设置完	   成后小车就会根据树去探索地图。
补充:可在turn_on_wheeltec_robot/launch/simple.launch文件下修改等待保存地图的时间

二、SLAM原理与算法详解

(一)、CostMap 膨胀地图

1、代价地图

规划器原理图片

2、加载地图文件、地图参数文件

三种格式:pgm(便携式灰度图) 、jpg、png

对于jpg、png格式地图,可使用挂图工具修改或者重画地图导入使用;对于地图文件,本质是由许多像素组成, 每个像素取它的灰度值作为网格值(范围:0-255),对于rgb图,需先转换为灰度图。

3 、地图参数文件(wheeltec.yaml)

各个参数对应作用:

image : 从哪个路径导入地图(可写绝对路径或者相对路径)
resolution :地图的分辨率,米/像素
origin :小车在地图中的起始姿态(x,y,yaw);因为是建图功能 生成的地图,使用的小车视角,故yaw一般自动设置为0 
negate :是否应该反转  白/黑  空闲/占用
occupied_thresh:大于此阈值的像素被认为是完全占用。取值[0,1]
free_thresh :小于此阈值的像素被认为是完全空闲。取值[0,1]
可选参数
mode : Trinary 为默认值三元解释,不写时即解释所有值,使输出最终成为三个值之一;(占用、空闲、未知)
灰度值[0,255] 转为 p 值[0,1] ; 	转换公式 : p = (255 - x)/255.0  (如下图)

4、Costmap
4.1 目的:

保护小车运行安全,避免小车撞到障碍物

4.2 主要分两部分:

footprint 、膨胀

4.3 代价地图:

4.4 三种碰撞可能:

case 1 : 小车中心与红色障碍物相交 (一定发生碰撞)

case 2 : 障碍物在以小车内切圆为半径膨胀时,小车中心与蓝色部分相交(一定发生碰撞)

case 3 : 障碍物在以小车外切圆为半径膨胀时,小车中心不与蓝色部分相交(不会发生碰撞)

4.5 costmap 组成 :

static Layer (静态地图层) :接收/map 话题信息,加载的地图文件

Obstacle Layer (障碍物层) :接收雷达等信息,实现检测环境障碍物,observation_sources (观测源)有 PointCloud 、

PointCloud2 、 LaserScan (最常用)

Inflation Layer(膨胀层) : 根据inflation_radius (膨胀半径)参数,膨胀障碍物,使机器人更安全

下图中左边为插件化地图 右边是为实现插件化设计,所做的类的设计结构图

在move_base 框架中,有两个costmap : global_costmap 、local_costmap

类的继承图:

主要关注的两个类 : Costmap2D (提供存储地图,换算坐标) 、Layer(每一层的操作,包括updateCosts 、updateBounds 两个主要的函数 )

膨胀层本身不储存信息,只对地图进行膨胀

costmap 工作流程图

5 总结:

6 补充: 恢复行为

一般不会使用,只有如动态障碍物阻挡住小车的去路时使用

(二)、自适应蒙特卡罗定位AMCL

1、导航所属位置及主要作用

作用 :提供定位功能 以 tf形式输出 (即从机器人角度说明自身位置)

2、蒙特卡罗基本思想

当所要求解的问题是某种事件出现的概率,或者是某个随机变量的期望值时,它们可以通过某种试验的方法,得到这种事件出现的频率,或者这个随机变数的平均值,并用它们作为问题的解。

举例: • 抛硬币 • 使用圆和正方形估算π值

具体方法 :粒子滤波

粒子滤波步骤:1、初始化 2、计算权重 3、重采样 4、状态转移

3、粒子滤波过程图解:

1、初始化 随机产生200个位置假设

2、计算权重

3、重采样

4、状态转移

5、重复上述步骤

6、最终得到结果 及 粒子滤波流程框图

4、自适应蒙特卡洛定位所解决的两个问题:

1、粒子数固定问题 : 当机器人定位基本完成的时候,比如这些粒子都集中在一块了,这个时候重采样的粒子数可以少一点。

2、机器人绑架的问题 :指机器人在已知环境下,突然被放到另个一陌生的环境,导致原本正确的粒子在新环境中变得错误。即当粒子 的平均分数突然降低(意味着正确的粒子在某次迭代中被抛弃了),在全局再重新的撒一些粒子。

机器定位三大问题 :全局定位 、 位姿跟踪 、 绑架劫持

“绑架劫持” :是机器人在已知自身位姿的情况下,得到了一个错误的位姿信息或者外界将其放到另一个位姿,而里程计信息给出了错误 的信息。

(三)、全局路径规划

1、全局路径规划所处位置

2、全局规划的两种算法 :Dijkstra 广度优先 、A* 深度优先

Dijkstra 算法:广度优先的思想。从起点开始,由近到远遍历所有的点,把起点到每一个点的路径都计算出来,直至遇到目标点 ;

优点:能够保证计算出的路径一定为最短最优路径。

缺点:计算量大,有颜色的各自都是计算过的点 ,颜色深浅代表距离长短。

A* 算法 :深度优先的思想。通过目标点对路径规划有一个方向性的指引作用,优先朝着目标点方向计算

优点 :计算量相对于 Dijkstra 小很多。

缺点 :不能够保证所计算的路径为最优解。

在ROS中两种算法的切换:navigation-melodic > > global_planner > > src > > planner_core.cpp 中116行,将use_dijkstra 的参数在turn_on_wheeltec_robot > > param_common >> move_base_params.yaml 文件中写为 :

global_planner/use_dijksstra : false

global_planner/use_grid_path : true

3、全局路径规划 : Dijkstra 算法详解

前期准备 :可先运行教程中的Dijkstra 算法写的一个小 demo ,须在ubuntu 下载pygame 插件 : sudo apt-get install python-pygame

Dijkstra 算法过程详解:

基本思想 : 由近到远把所有点的最短路径算出来

情景假设 : 从起点开始

1、每次走一格,不能跨格 ;

2、共有8个相邻栅格可以走;

3、若走(上、下、左、右)计路程为 :2 ;

4、 若走(左上、左下、右上、右下)计路程为 :3 (路程设置为2、3是为了方便计算,本身应为根号2倍关系)

5、设置两个列表(或者数组)

openlist = [] ----存放待确定路径的点

closedlist = [] ----存放以确定路径的点

6、每个点都记录自己的父节点,下标表示

7、为方便记录 设起点为S ;相邻 8 个点以A - H 称呼

8、已放进closedlist 的点不走,因已确定路径

3.1 Dijkstra 算法过程解析(为方便理解,此处直接截图)

Dijkstra 算法自身理解总结 :先按照纵向顺序选择最小的点,然后展开依次向左右最小的点并以最小点为中心进行延伸。

4、全局路径规划 A*算法详解

基本思想 :深度优先

前期准备 :两种距离 ------ 欧几里得距离、曼哈顿距离

绿色代表 欧几里得距离 :

红色、蓝色、黄色代表曼哈顿距离:

红黄蓝距离等效,曼哈顿距离也称出租车距离。

A*算法关键 :估算函数

F* = G + H* (其中F : 从起点到终点估算路程 G : 从起点到当前节点实际路程

H :当前节点到终点最小估算路程,使用曼哈顿距离、或者欧几里得距离)

情景假设 : 从起点开始

1、每次走一格,不能跨格 ;

2、共有8个相邻栅格可以走;

3、若走(上、下、左、右)计路程为 :2 ;

4、 若走(左上、左下、右上、右下)计路程为 :3 (路程设置为2、3是为了方便计算,本身应为根号2倍关系)

5、设置两个列表(或者数组)

openlist = [] ----存放待确定路径的点

closedlist = [] ----存放以确定路径的点

6、每个点都记录自己的父节点,下标表示

7、为方便记录 设起点为S ;相邻 8 个点以A - H 称呼

8、已放进closedlist 的点不走,因已确定路径

9、算H* 估算距离时,忽略障碍物 (与Dijkstra区别)

4.1 A* 算法具体流程

估算函数 : F* = G + H* (其中F : 从起点到终点估算路程 G : 从起点到当前节点实际路程 H :当前节点到终点最小估算路程,使用曼哈 顿距离、或者欧几里得距离)

A* 算法自身理解总结 :首先选取F值最小的为中心点 >> 当F值相同时,取实际路程G最小时的路线。再以该点为中心点进行栅格填充,重复以上步骤,直至找到终点。

(四)、局部路径规划

1、局部路径规划所处位置

局部路径规划原因: 先由全局规划器规划出大致路径,再由局部路径规划器把它分割为很多小段,在进行局部路径规划,即把一个总的目标分割为多个小目标然后依次达成;优点是在全局路径规划时,对地图保存过的障碍物进行避障,在局部路径规划时,能够对新增的障碍物进行避障,除此之外,还能够对动态障碍物进行避障。

2、局部路径规划的两种算法:DWA算法(动态窗口法)、TEB算法(Timed-Elastic-Band 橡皮筋法)

DWA算法:接受全局规划器生成的路径以及里程计信息、地图信息

输出底盘运动的速度信息

3、前期准备(概念补充)

state sampling(状态采样,代表算法:dijkstra、A*) 、action sampling(动作采样)

state samping : 假设小车位置,然后根据这个位置一系列状态信息,包括与起点距离、终点距离、周围障碍物信息的情况等,来判断这个位置是否可取。

action sampling : 假设小车线速度,角速度多少 ,对小车动作进行采样,首先采样小车速度,假设小车在这个速度以后将会走到哪,然后建立小车的运动模型。航向权重对路径选取影响很大。TEB算法不能完全禁止倒车

4、DWA算法详解

算法流程:

初始化--小车最大最小速度读、加速度、评价函数权重等循环
{
	判断是否达到目的地
	计算当前采样的速度范围(动态窗口)
	遍历所有速度v & w,根据模型模拟一段时间的路径
	根据评价函数打分(包括评价函数、归一化、权重)
	选取最优解 -- v & w,下发给运动底盘
	小车继续移动
}

5、TEB算法详解

参照移动硬盘/视频区\Mini ROS小车附送资料\1.Mini ROS小车附送资料_2022.01.06\2.ROS从底层源码到进阶应用系列教程\5.ROS_SLAM原理与算法详解视频教程\7.局部路径规划02-TEB算法

三、深度学习------YOLOV3

学习目标: 1、了解深度学习与YOLOv3主要内容;

2、学会YOLOv3在ROS小车上的具体使用,如物体识别、手势控制、交通标志识别并用于沙盘地图自动驾驶

3、学会训练自己的数据库

(一) 、深度学习与yolov3 简介

目标检测任务需要做的事情:识别、定位

YOLOV3基本思想 : 将输入的图像分割为很多小格子(grid cells),接着一方面根据边界框(bounding boxes)和置信度(confidence)来确定定位,另一方面通过类别概率图(class probability map)确定识别目标类型,最后输出预测结果。

深度学习 :基于神经网络算法,是从生物神经网络运作机制得到的启发,通过接收外界信号,达到一定阈值后,触发动作电位

(二)、深度学习应用:通用物体识别与手势控制小车

(三)、深度学习应用:沙盘地图自动驾驶

(四)、深度学习应用:沙盘地图自动驾驶代码讲解

(五)、深度学习应用:沙盘地图自动驾驶功能演示及参数调整

(六)、搭建YOLOV3训练环境和制作自己的数据集

(七)、YOLOV3训练和ROS端使用

古月居、深蓝学院查找YOLO学习资料

微信文件自动存储路径:C:\Users\why\Documents\WeChat Files\wxid_m5s1yimjnl4422\FileStorage\File\2022-03

scanf : 返回值

查询数组大小

sizeof( 数组名)/ sizeof(数组名[0]) eg :sizeof(num)/ sizeof(num[0])

1、定义接口文件(msg、srv文件) 2、cmakelist 里编译文件

3、git remote -v : 查看所有远程库链接

4、git status : 查看所有文件状态

5、git status ### : 查看指定文件状态

6、typora : control+, : 设置图片保存路径

windows 命令行删除磁盘

diskpart

list disk

select disk 磁盘号

gitee 文件上传云端

1、初始化工作空间

git init

2、 添加提交所有文件

git add .

git add ### : 添加单个文件

3、 查看文件状态(可忽略)

git status : 查看所有文件状态

git status ### : 查看指定文件状态

4、提交到本地仓库

git commit -m "备注"

5、添加提交仓库的地址(若前面添加过忽略此步)

git remote add origin https://gitee/why_123456/studio.git

6、提交到仓库

git puh -u origin "master"

7、若忘记前面是否提交过仓库地址,可用下面命令查询

git remote -v : 查看所有远程库链接

8、查看文件中修改的内容

git diff 文件名

9、查看日志信息

git log

10、想上传一个嵌套项目到服务器,假设我在其中一个子模块进行了修改,那么需要先进到这个子模块,将子模块的修改使用:" git stash push "指令将其推到一个独立的栈中,(如果子模块是游离态,则将游离态先通过 “ git checkout main ”指令切换到主分支)然后再使用“ git pull ”将代码更到最新,再代码更到最新后,再使用“  git stash pop ”指令恢复,恢复后手动解决冲突,在冲突解决后再把代码使用git add "文件夹名或文件名"提交修改

11、撤销git add . 以及git commit操作指令

软链接常见操作

  1. 为文件创建软链接

    ln -s /path/to/original_file /path/to/link_name
  2. 为目录创建软链接

    ln -s /path/to/original_directory /path/to/link_name
  3. 覆盖已有的软链接(使用 -f 选项): 如果已经存在同名的软链接,可以使用 -f 选项强制覆盖:

    ln -sf /path/to/new_target /path/to/existing_link
  4. 查看软链接是否创建成功: 使用 ls -l 命令查看软链接是否创建成功。软链接会显示为 -> 指向的文件:

    ls -l /path/to/link_name

      5.删除软链接:删除软链接时可以直接使用 rm 命令

rm /path/to/link_name

功能包查找

使用sudo apt install nlohmann-json-dev安装“nlohmann-json-dev”包,发现无法安装;

可使用apt search nlohmann来查看有哪些相关的包,输出如下:

Sorting... Done
Full Text Search... Done
nlohmann-json3-dev/focal,focal 3.7.3-1 all
  JSON for Modern C++

发现有nlohmann-json3-dev包可替代“nlohmann-json-dev”包,输入:sudo apt install nlohmann-json3-dev安装即可,这种方式会安装到 /usr/include 目录下。

在正常安装后,如果 nlohmann_json 已经通过系统的标准路径安装(如 /usr/include),那么不需要使用 find_package 来查找它。可以直接包含头文件,而无需 CMake 查找相关配置。

CMakeLists.txt 中,直接通过 include_directories 添加 /usr/include 路径。确保没有使用 find_package(nlohmann_json REQUIRED),并且像下面这样添加 include_directories

find_package(catkin REQUIRED COMPONENTS
  roscpp
  std_msgs
)

# 添加 /usr/include 目录以便包含头文件
include_directories(
    include
    /usr/include
    ${realsense2_INCLUDE_DIR}
    ${catkin_INCLUDE_DIRS}
    )

catkin_package(
    LIBRARIES ${PROJECT_NAME}
    CATKIN_DEPENDS message_runtime roscpp sensor_msgs std_msgs
    nodelet
    cv_bridge
    image_transport
    ddynamic_reconfigure
    nav_msgs
    )

add_executable(D435i_pose src/D435i_pose.cpp)
target_link_libraries(D435i_pose ${catkin_LIBRARIES})

空文件夹怎么上传到gitee

描述:将本地项目上传至gitee的方法截图 (ubuntu 同理)
  1:在gitee上创建以自己项目名称命名的空项目


  2:查看自己的用户名及邮箱

进入设置查看自己的邮箱和用户名


  3: 配置你的用户名及邮箱

git config --global user.name "用户名"
git config --global user.email "邮箱"

  4:查看用户名及邮箱

git config user.name
git config user.email

  5:初始化本地环境,把该项目变成可被git管理的仓库

git init

  6:添加该项目下的所有文件

git add .

  7:使用如下命令将文件添加到仓库中去

git commit -m '本次提交的说明'

  8:将本地代码库与远程代码库相关联

git remote add origin https://gitee/仓库名称

  9:强制把远程仓库的代码跟新到当前分支上面。ps:如果仓库为空这一步可以跳过

git pull --rebase origin master

  11:将本地代码推送到指定远程的仓库中

git push -u origin master

 Cmake 记录

eg:

gcc 编译

vs studio 使用快捷键

选中多行注释 : ctrl + k >> ctrl +c 将使用多行注释来注释代码

选中多行注释 : chtl + k >> c 使用单行注释直接注释多行代码

在ROS上下载某个功能包:

1、进入ROS官网,找到packages >> search ROS

2、找到功能包名,点击进入 >> 进入github网址

        

3、使用git clone 下载或者直接下载ZIP格式;等待下载完成。

ros坐标系:

                           

static_transform_publisher工具的功能是发布两个参考系之间的静态坐标转换,两个参考系一般不发生相对位置变化:

命令格式如下:

▲ static_transfrom_publisher x y z yaw pitch roll frame_id child_frame_id period_in_ms
    使用以米为单位的 x/y/z 偏移量和以弧度为单位的偏航/俯仰/滚动,将静态坐标变换发布到 tf。(偏航是围绕 Z 的旋转,俯仰是   围绕 Y 的旋转,滚动是围绕 X 旋转)。该周期(以毫秒为单位)指定发送转换的频率。100ms(10hz)是一个不错的值。
▲ static_transfrom_publisher x y z qx qy qz qw frame_id child_frame_id period_in_ms
    使用 x/y/z 偏移量(以米和四元数为单位)将静态坐标变换发布到 tf。该周期(以毫秒为单位)指定发送转换的频率。100ms(10hz)是一个不错的值。

一、ros 常用命令

rqt_graph : 查看节点图

rosnode list : 查看节点列表

rostopic list : 查看话题列表

rosnode info xxx : 查看节点信息

rostopic info xxx : 查看话题信息

rosmsg show xxx : 显示消息数据类型

rosservice info xxx : 查看服务信息

env | grep ros : 查看与ros有关的环境变量

rospack : 查询功能包信息

rosdep :安装功能包依赖

rqt : 将功能包依赖可视化为一个图

package.xml : 定义了功能包的属性,如名称、版本号、对其他功能包的依赖等

topic相关命令:

rostopic info xxx : 查询话题相关的信息

rosmg show xxx : 查询数据相关信息

rostopic find 消息类型 : 从数据类型查找话题

rostopic type 话题 :查看话题的数据类型

rostopic pub -r 10 话题名+tab(自动补全) [-r: 循环发布 10:频率HZ] : 话题发布

rostopic echo xxx: 打印话题信息

rostopic hz : 话题频率

rostopic bw : 话题带宽

rosrun tf view_frames :TF树

grep : 查找内容包含指定的范本样式的文件,如果发现某文件的内容符合所指定 的范本样式,预设grep 指令会把含有范本样式的那一列显示出来。

rosrun rqt_reconfigure rqt_reconfigure

二、创建工作空间与功能包

基础知识储备

工作空间:用于存放工程开发相关文件的文件夹。

src : 代码空间

build : 编译空间

devel : 开发空间

install :安装空间

1、创建工作空间流程

1、新建文件夹 $ mkdir -p ~/catkin_ws/src &&cd ~/catkin_ws/src

2、初始化工作空间 $ catkin_init_workspace

3、编译工作空间 (在catkin_ws路径下)$ catkin_make。 自动搜索src下的所有功能包并编译。自动产生build和devel文件夹,build存放二进制文件(一般用不到),devel存放可执行文件位于devel/lib中。

4、创建安装空间(在catkin_ws路径下) $ catkin_make install

5、设置环境变量,$ source devel/setup.bash (如果终端为zsh,后缀写.zsh)。查看当前ROS包环境变量,$ echo ROS_PACKAGE_PATH,不用每次都source的方式是直接编辑~/.bash文件,在最后加入source /home/username/catkin_ws/devel/setup.bash注意这里的路径用 pwd命令查看一下,要加入具体的username。

2.创建功能包

1.在 src下创建功能包$ catkin_create_pkg <pkg_name>[depend3][depend2] ( 一般都要依赖std_msgs rospy roscpp)

2.返回工作空间下,进行编译 $ catkin_make,注意功能包不能重名。功能包与文件夹的区别,功能包必须含有 CMakelist.txt和 package.xml。

三、Topic话题的发布和订阅实现

  1. ROS Topic话题通信,发布者实现流程

    1.初始化节点 ros::init(argc,argv,"node_name")
    
    2.创建句柄 ros:: NodeHandle node;//node 可以写为 n
    
    3.Master 注册节点信息,创建publisher,发布话题topic,定义话题消息类型
    
    ros:: Publisher pub = node.advertise<[msg_type]>("[topic_name]",1000); //消息类型,话题名
    
    4.设置发布频率 ros:: Rate loop_rate(单位:hz)
    
    5.循环发布,以ROS状态为循环条件:
    
    while (ros::ok()){
    
        1> 定义话题中信息数据,并赋值 ros::msg_typemsg;
    
        2>节点发布消息 pub.publish(msg); 打印消息:ROS_INFO("")
    
        3>基于发布频率延迟发布 loop_rate.sleep();
    
    }

fast - lab 学习

ego_planner 笔记

实机飞行中可修改参数:

<1> src >> plan_manage >> launch >> single_run_in_exp.launch

<2> src >> plan_manage >> launch >> advanced_param.xml

<3> src >> plan_manage >> launch >> advanced_param_exp.xml

小车学习笔记

一、基础操作笔记

常用软件安装:

  1. terminator

    sudo apt install terminator

    常用指令

补充:SSH 密钥登录

直接使用:

1.小车开机,连接WIFI,密码:dongguan。

2.SSH远程登录:ssh -Y wheeltec@192.168.0.100,密码:dongguan


1.SSH简述与安装(Secure Shell) Secure Shell(SSH) 是由 IETF(The Internet Engineering Task Force) 制定的建立在应用层基础上的安全网络协议。 我们这里使用的是SSH在Ubuntu中的免费开源实现,使用它主要是方便远程使用ROS小车的功能。 一般Ubuntu系统默认自动安装有ssh客户端,服务端需要自行安装 sudo apt-get install openssh-server 查看系统是否已经安装ssh客户端或者服务端:dpkg -l | grep ssh。 启动ssh服务:sudo /etc/init.d/ssh start 关闭ssh服务:sudo /etc/init.d/ssh stop 重启ssh服务:sudo /etc/init.d/ssh restart

服务端:ROS小车上的树莓派/Nano/TX2/NX/工控机 客户端:其它Ubuntu电脑/虚拟机

两种登录方式:账号密码登录、公钥密钥登录。

2.账号密码登录 ssh -Y 服务端用户名@服务端ip地址 选择端口号: ssh -p 22 -Y 服务端用户名@服务端ip地址 服务端修改端口号:/etc/ssh/sshd_config,修改Port sudo /etc/init.d/ssh restart 对称加密:是采用单钥密码系统的加密方法,使用同一密钥对信息进行加密和解密的加密方法。 1.客户端向SSH服务器发出请求,服务器将自己的公钥返回给客户端。 2.客户端用服务器的公钥加密自己的登录密码,再将信息发送给服务器。 3.服务器接收到客户端传统的密码,用自己的私钥解码。如果结果正确,则同意登录,建立起连接,否则拒绝。

非对称加密:需要两个密钥:公共密钥和私有密钥,它们成对出现,公钥加密的数据有且只有私钥能解密,私钥加密的数据有且只有公钥解密,相对于“对称加密”,“非对称加密”加密方法加密和解密使用不同的密钥,所以叫“非对称加密”加密方法。

3.公钥密钥登录(免密登录) 生成公钥密钥对:ssh-keygen -t rsa(客户端) 上传公钥到服务端:ssh-copy-id 服务端用户名@服务端ip地址

4.别名登录

~/.ssh/config(客户端)

Host wheeltec HostName

192.168.0.100

User wheeltec

Port 22

1、编译过程cmakelists.txt

常用cmakelists宏

cmake_minimum_required() CMake版本

project() 项目名称

find_package() 添加依赖

add_executable() 生成可执行文件

target_link_libraries() 可执行文件链接到库

catkin_package() 编译生成信息导出

其他的cmakelists宏:

add_message_files() 添加话题消息类型文件

add_service_files() 添加服务消息类型文件

add_action_files() 添加行为消息类型文件

generate_messages() 生成消息文件

nclude_directories() 添加头文件路径

add_dependencies() 添加依赖项

add_library() 生成自定义的库

install() 安装规则

2、package.xml

必要的package.xml标签

<package format = "2"> 根标签

<name > 包名 </name>

<version>版本号</version>

<descriptioon>描述</descriptioon>

<maintainer email = "邮箱">维护者</maintainer>

<license>开源许可</license>

...................

</package>

可选的package.xml标签

<depend> 指定依赖项为编译、 导出、 运行需要的依赖

<build_depend> 编译依赖项

<build_export_depend> 导出依赖项

<exec_depend> 运行依赖

<test_depend> 测试用例依赖项

<buildtool_depend> 编译构建工具

<doc_depend> 文档依赖项

3、Launch param启动文件

标签大全:

<node>...</node>或者<node .... /> 两种形式;

node使用模板

**<node pkg="功能包名" type="节点类型(可执行的cpp文件或者py文件)" name="节点名">**

include嵌套实例:

最简单节点写入:

<node name = '节点名' pkg = "文件夹名" type ="可执行文件"/node>

实例:

<node  name = "send_mark" pkg = "turn_on_wheeltec_robot" type = "send_mark.py">
​
</node>

remap重命名实例:

三个参数比较:<param>、<rosparam>、<arg>

<param> 在参数服务器添加一个参数

<rosparam> 从“.yaml”文件中导入大量参数

<arg> 在launch 文件中声明一个参数 (用于动态传参,类似于函数的参数,可以增强launch文件的灵活性)

参数实例

<param name ="" type ="数据类型" value =""/>

group分组实例:

第一种是将许多节点同时划分进某个工作空间,从而实现对node的批量管理;

group if = "$(eval mapping_mode == 'gmapping')"时,当if 属性为o时,忽略<group></group>之间的标签。

$(arg arg-name) //$() 这个符号出现的任何地方,roslaunch命令都将会把它替换成给定argument 的值(value)。

参数命令大全:

激光雷达数据中,inf代表障碍物距离太远或者太近或者没检测到障碍物

4、TF坐标变换

tf 树:

rosrun tf view_frames

4.1静态坐标关系

args : xyz三轴偏移量(单位:米)

yaw pitch roll 三周弧度(rad)

link1_parent、link1 : 父坐标和子坐标

period_in_ms :发布频率(单位:ms)

qx、qy、 qz、qw :四元数表示姿态,上面用yaw 、pitch、 roll表示

4.2动态坐标关系:TF广播器与监听器

TF广播器 :将两个TF坐标广播出去

sendtransform :成员函数,将TF消息广播出去

TF监听器:接收TF两坐标间关系

第一步:tfbuffer :创建一个对象

transfromlistener : 对前面的tfbuffer 进行构造和初始化

第二步:实例化geomestry_msgs::transfromstamp的消息数据类型的结构体,用来装载两个TF坐标之间的信息。

第三步:使用lookuptransfrom这个类成员函数对两个TF进行关系监听,将监听的信息给geomestry_msgs::transfromstamp的结构体

海龟实验ROS:

roslaunch  turtle_tf2  turtle_tf2_demo_cpp.launch

海归自动追踪

查看两个TF坐标变换关系:rosrun tf tf_echo turtle2 turtle1(turtle2、 turtle1代表需要查询的两个TF坐标的frame id)

TF广播器与监听器的实现

补充知识

        int main(int argc, char **argv)

argc : 表示传入main()函数的参数个数

argv : 表示传入main函数的参数序列或者指针,因此,无论是否有没有输入 参数,argv都会输入一个程序的名称。

5、程序修改与编译

编译使程序修改生效(.c .cpp .h 文件需要编译,若修改的是.py .launch .urde 等文件则不需要编译)

编译时多线程编译:catkin_make -j2 -l2

(-j : 代表允许2个编译命令同时进行,一般以CPU核心数目的两倍最好)

(-L :系统加载的任务书数,数目一般与-j 数目保持一致)

指定编译单个功能包:

catkin_make-DCATKIN_WHITELIST_PACKAGES="功能包名"

(指定编译之后,后面编译都是指定功能包编译,想要解除,输入下面命令)

解除指定功能包编译:

catkin_make-DCATKIN_WHITELIST_PACKAGES=""

sublime text 软件常见快捷键:

alt + shift + 分栏的数目: 界面分栏

ctrl + shift +f : 全局搜索

ctrl + p 输入:函数所在文件关键词@函数关键词(输入函数关键词后可通过方向键选择函数文件)

ctrl + d : 多字符

ctrl + z : 撤销修改

ctrl +Y : 回复修改

ctrl +F : 查找关键字

ctrl +Shift + k :删除整行

ctrl +/ :注释单行

ctrl +shift +/ :注释多行

Tab : 向右缩进

shift + tab :向左缩进

ctrl + m : 光标移动到括号内或开始的位置

6、查看里程计、IMU话题信息

6.1 启动初始化节点(wheeltec终端)

roslaunch turn _on_wheeltec_robot  turn _on_wheeltec_robot.launch

6.2 查看当前存在的话题(pssoni终端)

rostopic list

6.3 查看里程计信息

rostopic echo /odom

查看IMU信息

rostopic echo /moblie_base/mobile_base/sensors/imu_data

查看小车电压

rostopic echo /PowerVolage
rostopic info /odom
rosmsg show nav_msgs/Odometry

7、激光雷达建图

7.1 启动激光建图

roslaunch turn_on_wheeltec_robot mapping.launch

7.2 查看见图效果

rviz

7.3 使用键盘控制节点控制小车运行(或其他方法)

roslaunch wheeltec robot_rc keyboard_teleop.launch

7.4 建图完成后保存地图

1.保存到想要的路径:
    rosrun map_server map_saver -f 地图名
2.一键保存地图:
    roslaunch turn_on_wheeltec_robot map_saver.launch 
    (文件位置在turn_on_wheeltec_robot/map/map_saver.launch ,可在args里面自行修改路径)

7.5 地图可使用ps编辑

8、建图算法切换

8.1 各种算法切换

在src\turn_on_wheeltec_robot\launch/mapping.launch文件夹里选择建图算法
启动建图指令 :roslaunch turn_on_wheeltec_robot mapping.launch

gmapping 发布的话题:

目前比较常用的建图算法。构建大地图时所需内存和计算量都会增加,故不适合构建大场景地图。因为没有回环检 测,所以 在回环闭合时可能会造成地图 错位。

hector 发布话题:

不需要里程计,人抱着小车走也可以建图。效果不如 gmapping,适合因条 件限制没有里程计的机器人。 建图时转向 速度 尽量缓慢,建议 0.1rad/s

可在rviz中查看位姿估计,通过add中的话题添加posewithcovaria、pose

cartographer 算法:

8.2 保存rqt_graph 节点话题图

1.打开rqt_graph ;

2.点击保存,在选择保存路径。

8.3 TF树图片保存(位置在主目录下frames.pdf)

rosrun tf view_frames

8.4 当建图算法为hector时,可使用如下命令重置地图

rostopic pub /syscommand std_msgs/String "data:'reset'"

8.5 建图速度越慢,效果越好。

9、自主导航

9.1 直接上手使用及launch文件讲解

直接上手使用

9.1.1 把小车放置在地图起点/rviz手动设置起点

9.1.2 运行导航

roslaunch turn_on_wheeltec_robot navigation.launch

9.1.3 启动rviz

rviz设置起点方法

9.1.4 使用rviz 2DNavGoal功能

9.1.5 配置路径规划时的线条 及地图

地图 (在navigation.launch文件中调用的,可自行修改地图)

线条

手动发布目标点(可取代2D NAV GOAL)

rostopic pub /move_base_simple/goal
四元数
    x = ax*sin(theta/2)
    y = ay*sin(theta/2)
    z = az*sin(theta/2)     
    w = cos(theta/2)

总结:先建图,在使用建立的地图进行导航

1、建图:

roslaunch turn_on_wheeltec_robot mapping.launch

2、启动rviz

rviz

3、使用键盘控制或者遥控控制小车移动

roslaunch wheeltec robot_rc keyboard_teleop.launch

4、保存建立的地图

保存到想要的路径:
    rosrun map_server map_saver -f 地图名

5、使用建立的地图进行导航(在navigation.launch文件中调用前面建立的地图,可自行修改地图)

roslaunch turn_on_wheeltec_robot navigation.launch

9.2 自主导航 整体导航工作原理及参数配置讲解

9.2.1 建图与导航的定位方式

建图与导航的定位一般使用robot_pose_ekf功能包进行定位,该功能包订阅odom和imu话题,发布地图和 小车的TF坐 标关系和经过扩展卡尔曼滤波的odom话题。

9.2.2 Navigation 工作框架

9.2.3 acml 功能包

9.2.4 movebase 功能包

src\turn_on_wheeltec_robot 目录下的param里的yaml文件修改小车尺寸,从而修改膨胀尺寸

note : 当机器人是圆形时,可使用半径来描述

参数配置文件

10、多点导航

11、激光雷达跟随

1、相关功能包 :rplidar_ros 和 simple_follower (两个文件夹都有cfg文件,都是rqt在线调参时的参数)

2、雷达节点主要cpp文件 : node.cpp 作用:对雷达原始数据进行处理,发布scan话题,在scan话题上发布LaserScan类型的雷达消息数据。

3、节点启动命令:roslaunch simple_follower laser_follower.launch

12、查看RGB摄像头和深度摄像头

RGB节点启动:roslaunch usb_cam usb_cam-test.launch

查看话题信息:rostopic list

查看图像话题:rqt_image_view

深度摄像头启动:roslaunch astra_camera astra.launch

查看话题信息:rostopic list

查看图像话题:rqt_image_view 选择depth/image 查看深度摄像头

13、视觉跟随

视觉跟随是实现小车对目标颜色的物体进行跟踪,通过ROS中cv_bridge功能包作为端口,将图像信息传给open从v,从而实现多种视觉功能。

13.1 实际操作

启动视觉跟随功能包:(会寻找视野范围内的物体,进行移动)

roslaunch simple_follower visual_follower.launch

进行实时调参

rqt >> plugins >> configuration >> dynamic reconfigure

13.2 视觉跟随流程

目标识别(visualTracker.py)、物体追踪(visual_follow.py)

13.3 视觉跟随参数调整

法一:直接在节点的launch文件中修改param,即修改参数服务器中的参数

在follow文件中,可修改最大速度与目标距离

在tracker文件中,可修改不同颜色的阈值参数

法二:使用rqt 在线调参(只能在本次节点运行时有效)

14 视觉巡线

实际操作

roslaunch simple_follower line_follower.launch

15 RGBD摄像头建图与导航

15.1 安装rtabmap

##更新软件列表
	sudo apt-get update
##安装rtabmap
	sudo apt-get install ros-melodic-rtabmap-ros
15.2 测试包
roslaunch rtabmap_ros demo_robot_mapping.launch   ##这样会打开自带的可视化工具
roslaunch rtabmap_ros demo_robot_mapping.launch rviz:=ture rtabmap:=false  ##关闭自带可视化工具,打开rviz
##启动第二行指令后,跑图像包
rosbag  play --clock demo_mapping.bag

打rviz后,pointcloud2点云地图是每一帧的点云,而mapcloud代表建图开始至今的所有点云地图合集,map 代表2D地图,mapgraph 代表机器人运动轨迹路线(下图紫线)。

RGBD摄像头建图本质就是2D和3D点云图配合到一起。

15.3 建图(gmapping,查看TF树和话题结构)

输入的话题:

1>里程计: /odom (nav_msgs/Odometry)

2>雷达: /scan(snr_mgs/LaserScan)

3>摄像头:/camera/rgb/image_raw (sensor_msgs/Image)

/camera/rgb/image_info (sensor_msgs/CamerInfo)

/camera/depth/image` (sensor_msgs/Image)

4>

16、纯视觉建图

可自行设置rviz,设置如下

MapCloud : 订阅话题为rtabmap/mapData

Map : 地图,订阅话题为 rtabmap/grid map

TF : TF坐标(参考4设置)

RobotModel : 机器人模型

启动命令:

建图:
roslaunch turn_on_wheeltec_robot pure3d_mapping.launch

自行设置rviz:
rviz

键盘控制小车移动:
roslaunch wheeltec_robot_rc keyboard_teleop.launch

导航:
roslaunch turn_on_wheeltec_robot pure3d_navigation.launch

note : 摄像头限制,障碍物与摄像头距离<0.6m时,无法识别障碍物。

在使用导航时,rviz还需再添加两个地图,一个作为全局地图,一个局部代价地图

路径规划(path),一个全局规划(global_plan),一个局部规划(local_plan)

两个雷达(laserscan),一个csan,一个scan2

想要显示多点导航的导航点,rviz中添加markerArray(path_point)

17、KCF跟踪

launch所涉及节点:

1、小车初始化节点

2、RGB摄像头的深度摄像头

3、python 的图像处理(图像压缩)

4、KCF节点

5、接受kcf目标信息以及输出KCF跟踪目标的速度(kcf_follow.py)

在使用KCF跟踪时,框选的目标不能够丢失视野,丢失后有很大概率找不回来所框选的目标。

src/kcf_track/src/runtracker.cpp文件,69行定义的函数为框选函数。

启动KCF跟踪 :

roslaunch kcf_track kcf_tracker.launch

18、AR标签识别与跟随

功能包名:ar_track_alacar

补充:二进制安装功能包,则看不到功能包源码。可在wiki上查看具体信息

主要功能:

1、生成不同大小、分辨率和ID编码的AR标签

2、识别和跟踪单个AR标签姿态,可选择集成相机深度数据,以更好估计姿态

单独运行AR标签识别:路径:turn_ on_wheeltec_robot/ar_label.launch

启动AR标签识别:

roslaunch ros_astra_camera astra.launch

修改基坐标(fixed frame)为ar_link,需提前准备AR标签,可在wiki上下载打印。第一种显示方式:TF;

第二种显示方式:add >> by topic >> ARmaker_points(Marker)

将maker的话题修改为/visualization marker,结果如图

在终端会出现报错,直接忽略此报错!

补充:AR标签可在WIKI下载,也可自己在命令行生成。

自己生成:进入工作空间

rosrun ar_track_alvar createMaker -s 6 1
第一个数字为:生成的AR标签边长
第二个数字:AR标签的编号

AR图片会自动保存在当前路径下

19、物体识别

原理:基于TF算法,调用Object Detection API(谷歌的物体识别系统)实现在ROS系统上进行物体识别 ;进入TensorFlow官网,查看教程

实际操作:

1、进行SSH登录 : ssh -Y wheeltec@192.168.0.100
2、打开源码,选择是否打开图像 src/ros_object_detection/scripts/object_detection/ros_tensorflow_classify.py 文件中的.#cv2.imshow("class",cv_image) 注释的话就不会打开原图,反之亦然。
3、运行物体识别:roslaunch ros_detection ros_tensorflow_classify.launch

进行物体识别时占较大内存,故尽量静态。

物体识别过程:开启物体识别功能 > > 相机获取物体图像信息(image_raw) > > 使用opencv处理图像 > >调用Object Detection API 识别 > > 将已知种类中的UID转换为文字并发布概率值。

20 、网页视频实时监控

ROS中的网页视频实时监控功能包 web_video_server

作用:将ROS视频流信息通过网络实时传送到网页端,我们可通过网络输入网页地址查看图像流。

环境配置:结合小车文档与ros wiki 配置

演示:

1、SSh远程登陆2个窗口 :ssh -Y wheeltec@192.168.0.100
2、打开摄像头 :roslaunch usb_cam usb_cam-test.launch
3、运行video_server可执行文件 : rosrun web_video_server web_video_server
(用于创建等待HTTP请求的服务端,在打印出等待连接时就说明建立好了)
4、打开浏览器 : 输入设备的IP地址,进入网页http://192.168.0.100:8080
5、image_raw : 实时视频 			Snapshot : 拍照

拓展:可根据需要使用不同的相机进行拍摄,只要能运行打开RGB摄像头的文件都可使用该功能。

网页视频实时监控主要流程:

21、自主探索建图

RRT : 快速扩展随机树,可探索未知区域,既可用于建图,还可用于路径规划

使用方法

直接编译功能包 rrt_exploration
适配: 
	rrt_slam.launch和simple.launch 两个文件放置在turn_on_wheeltec_robot功能包下
使用步骤:
	1、启动rrt_slam.launch文件 : roslaunch turn_on_wheeltec_robot rrt_slam.launch
	2、打开RVIZ,点击add >> by topic选择下列话题
		clicked_point					显示随机数的范围点和起点
		detected_points					检测到的边界点
		frontiers						滤波器接收到的边界点,数据同上
		centroids						滤波后的有效边界点
		global_detector_shaps			 全局树
		local_detector_shaps			 本地树
	3、用RVIZ	的publish point 工具,按顺时针或逆时针设置4个树的边界点(围起来必须是一个封闭的四边形),以及一个树的起点(起点尽量靠近小车起点),设置完	   成后小车就会根据树去探索地图。
补充:可在turn_on_wheeltec_robot/launch/simple.launch文件下修改等待保存地图的时间

二、SLAM原理与算法详解

(一)、CostMap 膨胀地图

1、代价地图

规划器原理图片

2、加载地图文件、地图参数文件

三种格式:pgm(便携式灰度图) 、jpg、png

对于jpg、png格式地图,可使用挂图工具修改或者重画地图导入使用;对于地图文件,本质是由许多像素组成, 每个像素取它的灰度值作为网格值(范围:0-255),对于rgb图,需先转换为灰度图。

3 、地图参数文件(wheeltec.yaml)

各个参数对应作用:

image : 从哪个路径导入地图(可写绝对路径或者相对路径)
resolution :地图的分辨率,米/像素
origin :小车在地图中的起始姿态(x,y,yaw);因为是建图功能 生成的地图,使用的小车视角,故yaw一般自动设置为0 
negate :是否应该反转  白/黑  空闲/占用
occupied_thresh:大于此阈值的像素被认为是完全占用。取值[0,1]
free_thresh :小于此阈值的像素被认为是完全空闲。取值[0,1]
可选参数
mode : Trinary 为默认值三元解释,不写时即解释所有值,使输出最终成为三个值之一;(占用、空闲、未知)
灰度值[0,255] 转为 p 值[0,1] ; 	转换公式 : p = (255 - x)/255.0  (如下图)

4、Costmap
4.1 目的:

保护小车运行安全,避免小车撞到障碍物

4.2 主要分两部分:

footprint 、膨胀

4.3 代价地图:

4.4 三种碰撞可能:

case 1 : 小车中心与红色障碍物相交 (一定发生碰撞)

case 2 : 障碍物在以小车内切圆为半径膨胀时,小车中心与蓝色部分相交(一定发生碰撞)

case 3 : 障碍物在以小车外切圆为半径膨胀时,小车中心不与蓝色部分相交(不会发生碰撞)

4.5 costmap 组成 :

static Layer (静态地图层) :接收/map 话题信息,加载的地图文件

Obstacle Layer (障碍物层) :接收雷达等信息,实现检测环境障碍物,observation_sources (观测源)有 PointCloud 、

PointCloud2 、 LaserScan (最常用)

Inflation Layer(膨胀层) : 根据inflation_radius (膨胀半径)参数,膨胀障碍物,使机器人更安全

下图中左边为插件化地图 右边是为实现插件化设计,所做的类的设计结构图

在move_base 框架中,有两个costmap : global_costmap 、local_costmap

类的继承图:

主要关注的两个类 : Costmap2D (提供存储地图,换算坐标) 、Layer(每一层的操作,包括updateCosts 、updateBounds 两个主要的函数 )

膨胀层本身不储存信息,只对地图进行膨胀

costmap 工作流程图

5 总结:

6 补充: 恢复行为

一般不会使用,只有如动态障碍物阻挡住小车的去路时使用

(二)、自适应蒙特卡罗定位AMCL

1、导航所属位置及主要作用

作用 :提供定位功能 以 tf形式输出 (即从机器人角度说明自身位置)

2、蒙特卡罗基本思想

当所要求解的问题是某种事件出现的概率,或者是某个随机变量的期望值时,它们可以通过某种试验的方法,得到这种事件出现的频率,或者这个随机变数的平均值,并用它们作为问题的解。

举例: • 抛硬币 • 使用圆和正方形估算π值

具体方法 :粒子滤波

粒子滤波步骤:1、初始化 2、计算权重 3、重采样 4、状态转移

3、粒子滤波过程图解:

1、初始化 随机产生200个位置假设

2、计算权重

3、重采样

4、状态转移

5、重复上述步骤

6、最终得到结果 及 粒子滤波流程框图

4、自适应蒙特卡洛定位所解决的两个问题:

1、粒子数固定问题 : 当机器人定位基本完成的时候,比如这些粒子都集中在一块了,这个时候重采样的粒子数可以少一点。

2、机器人绑架的问题 :指机器人在已知环境下,突然被放到另个一陌生的环境,导致原本正确的粒子在新环境中变得错误。即当粒子 的平均分数突然降低(意味着正确的粒子在某次迭代中被抛弃了),在全局再重新的撒一些粒子。

机器定位三大问题 :全局定位 、 位姿跟踪 、 绑架劫持

“绑架劫持” :是机器人在已知自身位姿的情况下,得到了一个错误的位姿信息或者外界将其放到另一个位姿,而里程计信息给出了错误 的信息。

(三)、全局路径规划

1、全局路径规划所处位置

2、全局规划的两种算法 :Dijkstra 广度优先 、A* 深度优先

Dijkstra 算法:广度优先的思想。从起点开始,由近到远遍历所有的点,把起点到每一个点的路径都计算出来,直至遇到目标点 ;

优点:能够保证计算出的路径一定为最短最优路径。

缺点:计算量大,有颜色的各自都是计算过的点 ,颜色深浅代表距离长短。

A* 算法 :深度优先的思想。通过目标点对路径规划有一个方向性的指引作用,优先朝着目标点方向计算

优点 :计算量相对于 Dijkstra 小很多。

缺点 :不能够保证所计算的路径为最优解。

在ROS中两种算法的切换:navigation-melodic > > global_planner > > src > > planner_core.cpp 中116行,将use_dijkstra 的参数在turn_on_wheeltec_robot > > param_common >> move_base_params.yaml 文件中写为 :

global_planner/use_dijksstra : false

global_planner/use_grid_path : true

3、全局路径规划 : Dijkstra 算法详解

前期准备 :可先运行教程中的Dijkstra 算法写的一个小 demo ,须在ubuntu 下载pygame 插件 : sudo apt-get install python-pygame

Dijkstra 算法过程详解:

基本思想 : 由近到远把所有点的最短路径算出来

情景假设 : 从起点开始

1、每次走一格,不能跨格 ;

2、共有8个相邻栅格可以走;

3、若走(上、下、左、右)计路程为 :2 ;

4、 若走(左上、左下、右上、右下)计路程为 :3 (路程设置为2、3是为了方便计算,本身应为根号2倍关系)

5、设置两个列表(或者数组)

openlist = [] ----存放待确定路径的点

closedlist = [] ----存放以确定路径的点

6、每个点都记录自己的父节点,下标表示

7、为方便记录 设起点为S ;相邻 8 个点以A - H 称呼

8、已放进closedlist 的点不走,因已确定路径

3.1 Dijkstra 算法过程解析(为方便理解,此处直接截图)

Dijkstra 算法自身理解总结 :先按照纵向顺序选择最小的点,然后展开依次向左右最小的点并以最小点为中心进行延伸。

4、全局路径规划 A*算法详解

基本思想 :深度优先

前期准备 :两种距离 ------ 欧几里得距离、曼哈顿距离

绿色代表 欧几里得距离 :

红色、蓝色、黄色代表曼哈顿距离:

红黄蓝距离等效,曼哈顿距离也称出租车距离。

A*算法关键 :估算函数

F* = G + H* (其中F : 从起点到终点估算路程 G : 从起点到当前节点实际路程

H :当前节点到终点最小估算路程,使用曼哈顿距离、或者欧几里得距离)

情景假设 : 从起点开始

1、每次走一格,不能跨格 ;

2、共有8个相邻栅格可以走;

3、若走(上、下、左、右)计路程为 :2 ;

4、 若走(左上、左下、右上、右下)计路程为 :3 (路程设置为2、3是为了方便计算,本身应为根号2倍关系)

5、设置两个列表(或者数组)

openlist = [] ----存放待确定路径的点

closedlist = [] ----存放以确定路径的点

6、每个点都记录自己的父节点,下标表示

7、为方便记录 设起点为S ;相邻 8 个点以A - H 称呼

8、已放进closedlist 的点不走,因已确定路径

9、算H* 估算距离时,忽略障碍物 (与Dijkstra区别)

4.1 A* 算法具体流程

估算函数 : F* = G + H* (其中F : 从起点到终点估算路程 G : 从起点到当前节点实际路程 H :当前节点到终点最小估算路程,使用曼哈 顿距离、或者欧几里得距离)

A* 算法自身理解总结 :首先选取F值最小的为中心点 >> 当F值相同时,取实际路程G最小时的路线。再以该点为中心点进行栅格填充,重复以上步骤,直至找到终点。

(四)、局部路径规划

1、局部路径规划所处位置

局部路径规划原因: 先由全局规划器规划出大致路径,再由局部路径规划器把它分割为很多小段,在进行局部路径规划,即把一个总的目标分割为多个小目标然后依次达成;优点是在全局路径规划时,对地图保存过的障碍物进行避障,在局部路径规划时,能够对新增的障碍物进行避障,除此之外,还能够对动态障碍物进行避障。

2、局部路径规划的两种算法:DWA算法(动态窗口法)、TEB算法(Timed-Elastic-Band 橡皮筋法)

DWA算法:接受全局规划器生成的路径以及里程计信息、地图信息

输出底盘运动的速度信息

3、前期准备(概念补充)

state sampling(状态采样,代表算法:dijkstra、A*) 、action sampling(动作采样)

state samping : 假设小车位置,然后根据这个位置一系列状态信息,包括与起点距离、终点距离、周围障碍物信息的情况等,来判断这个位置是否可取。

action sampling : 假设小车线速度,角速度多少 ,对小车动作进行采样,首先采样小车速度,假设小车在这个速度以后将会走到哪,然后建立小车的运动模型。航向权重对路径选取影响很大。TEB算法不能完全禁止倒车

4、DWA算法详解

算法流程:

初始化--小车最大最小速度读、加速度、评价函数权重等循环
{
	判断是否达到目的地
	计算当前采样的速度范围(动态窗口)
	遍历所有速度v & w,根据模型模拟一段时间的路径
	根据评价函数打分(包括评价函数、归一化、权重)
	选取最优解 -- v & w,下发给运动底盘
	小车继续移动
}

5、TEB算法详解

参照移动硬盘/视频区\Mini ROS小车附送资料\1.Mini ROS小车附送资料_2022.01.06\2.ROS从底层源码到进阶应用系列教程\5.ROS_SLAM原理与算法详解视频教程\7.局部路径规划02-TEB算法

三、深度学习------YOLOV3

学习目标: 1、了解深度学习与YOLOv3主要内容;

2、学会YOLOv3在ROS小车上的具体使用,如物体识别、手势控制、交通标志识别并用于沙盘地图自动驾驶

3、学会训练自己的数据库

(一) 、深度学习与yolov3 简介

目标检测任务需要做的事情:识别、定位

YOLOV3基本思想 : 将输入的图像分割为很多小格子(grid cells),接着一方面根据边界框(bounding boxes)和置信度(confidence)来确定定位,另一方面通过类别概率图(class probability map)确定识别目标类型,最后输出预测结果。

深度学习 :基于神经网络算法,是从生物神经网络运作机制得到的启发,通过接收外界信号,达到一定阈值后,触发动作电位

(二)、深度学习应用:通用物体识别与手势控制小车

(三)、深度学习应用:沙盘地图自动驾驶

(四)、深度学习应用:沙盘地图自动驾驶代码讲解

(五)、深度学习应用:沙盘地图自动驾驶功能演示及参数调整

(六)、搭建YOLOV3训练环境和制作自己的数据集

(七)、YOLOV3训练和ROS端使用

古月居、深蓝学院查找YOLO学习资料

发布评论

评论列表 (0)

  1. 暂无评论