微信文件自动存储路径: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操作指令
软链接常见操作
-
为文件创建软链接:
ln -s /path/to/original_file /path/to/link_name
-
为目录创建软链接:
ln -s /path/to/original_directory /path/to/link_name
-
覆盖已有的软链接(使用
-f
选项): 如果已经存在同名的软链接,可以使用-f
选项强制覆盖:ln -sf /path/to/new_target /path/to/existing_link
-
查看软链接是否创建成功: 使用
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话题的发布和订阅实现
-
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
小车学习笔记
一、基础操作笔记
常用软件安装:
-
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操作指令
软链接常见操作
-
为文件创建软链接:
ln -s /path/to/original_file /path/to/link_name
-
为目录创建软链接:
ln -s /path/to/original_directory /path/to/link_name
-
覆盖已有的软链接(使用
-f
选项): 如果已经存在同名的软链接,可以使用-f
选项强制覆盖:ln -sf /path/to/new_target /path/to/existing_link
-
查看软链接是否创建成功: 使用
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话题的发布和订阅实现
-
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
小车学习笔记
一、基础操作笔记
常用软件安装:
-
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学习资料