commit 1857caf68c69835ea64c0e99ebd4f7432faa1a70 Author: 杨明 Date: Tue Dec 5 18:42:49 2023 +0800 初始化文档 diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..359bb53 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,3 @@ +# 默认忽略的文件 +/shelf/ +/workspace.xml diff --git a/.idea/autolabor-m1-doc.iml b/.idea/autolabor-m1-doc.iml new file mode 100644 index 0000000..6102194 --- /dev/null +++ b/.idea/autolabor-m1-doc.iml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 0000000..d59da34 --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/Writerside/c.list b/Writerside/c.list new file mode 100644 index 0000000..c4c77a2 --- /dev/null +++ b/Writerside/c.list @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/Writerside/hi.tree b/Writerside/hi.tree new file mode 100644 index 0000000..9f6549e --- /dev/null +++ b/Writerside/hi.tree @@ -0,0 +1,10 @@ + + + + + + + \ No newline at end of file diff --git a/Writerside/images/completion_procedure.png b/Writerside/images/completion_procedure.png new file mode 100644 index 0000000..3535a3f Binary files /dev/null and b/Writerside/images/completion_procedure.png differ diff --git a/Writerside/images/completion_procedure_dark.png b/Writerside/images/completion_procedure_dark.png new file mode 100644 index 0000000..a65beb0 Binary files /dev/null and b/Writerside/images/completion_procedure_dark.png differ diff --git a/Writerside/images/convert_table_to_xml.png b/Writerside/images/convert_table_to_xml.png new file mode 100644 index 0000000..2518a64 Binary files /dev/null and b/Writerside/images/convert_table_to_xml.png differ diff --git a/Writerside/images/convert_table_to_xml_dark.png b/Writerside/images/convert_table_to_xml_dark.png new file mode 100644 index 0000000..4716122 Binary files /dev/null and b/Writerside/images/convert_table_to_xml_dark.png differ diff --git a/Writerside/images/new_topic_options.png b/Writerside/images/new_topic_options.png new file mode 100644 index 0000000..bc6abb6 Binary files /dev/null and b/Writerside/images/new_topic_options.png differ diff --git a/Writerside/images/new_topic_options_dark.png b/Writerside/images/new_topic_options_dark.png new file mode 100644 index 0000000..bf3e48d Binary files /dev/null and b/Writerside/images/new_topic_options_dark.png differ diff --git a/Writerside/topics/Default-topic.md b/Writerside/topics/Default-topic.md new file mode 100644 index 0000000..e6ee2b5 --- /dev/null +++ b/Writerside/topics/Default-topic.md @@ -0,0 +1,79 @@ +# This is the first topic + + + +## Add new topics +You can create empty topics, or choose a template for different types of content that contains some boilerplate structure to help you get started: + +![Create new topic options](new_topic_options.png){ border-effect="line" thumbnail="true" width="321"} + +## Write content +%product% supports two types of markup: Markdown and XML. +When you create a new help article, you can choose between two topic types, but this doesn't mean you have to stick to a single format. +You can author content in Markdown and extend it with semantic attributes or inject entire XML elements. + +For example, this is how you inject a procedure: + + + +

Start typing procedure and select a procedure type from the completion suggestions:

+ completion suggestions for procedure +
+ +

Press Tab or Enter to insert the markup.

+
+
+ +## Add interactive elements + +### Tabs +To add switchable content, use tabs (start typing `tabs` on a new line). + + + + ![Alt Text](new_topic_options.png){ width=450 } + + + + ]]> + + + +### Collapsible blocks +Besides injecting entire XML elements, you can use attributes to configure the behavior of certain elements. +For example, you can collapse a chapter that contains non-essential information like this: + +#### Supplementary info {collapsible="true"} +Content under such header will be collapsed by default, but you can modify the behavior by adding the following attribute: +`default-state="expanded"` + +## Convert selection to XML +If you need to extend an element with more functions, you can convert selected content from Markdown to semantic markup. +For example, if you want to merge cells in a table, it's much easier to convert it to XML than do this in Markdown. +Position the caret anywhere in the table and press Alt+Enter: + +Convert table to XML + +## Feedback and support +Please report any issues, usability improvements, or feature requests to our +YouTrack project +(you will need to register). + +You are welcome to join our +public Slack workspace. +Before you do, please read our [Code of conduct](https://plugins.jetbrains.com/plugin/20158-writerside/docs/writerside-code-of-conduct.html). +We assume that you’ve read and acknowledged it before joining. + +You can also always email us at [writerside@jetbrains.com](mailto:writerside@jetbrains.com). + + + + Markup reference + Reorder topics in the TOC + Build and publish + Configure Search + + diff --git a/Writerside/v.list b/Writerside/v.list new file mode 100644 index 0000000..2d12cb3 --- /dev/null +++ b/Writerside/v.list @@ -0,0 +1,5 @@ + + + + + diff --git a/Writerside/writerside.cfg b/Writerside/writerside.cfg new file mode 100644 index 0000000..5f10ad4 --- /dev/null +++ b/Writerside/writerside.cfg @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file diff --git a/chassis/controlRule.md b/chassis/controlRule.md new file mode 100644 index 0000000..f486b77 --- /dev/null +++ b/chassis/controlRule.md @@ -0,0 +1,231 @@ +### 注意: +* 在使用串口发送指令时,底层超过 **1s** 没有接收到上位机的指令,会向上位机返回错误状态码FF (error状态:连接超时),此时用户如果想要重新控制车辆,需要发送Reset命令 +* 在调试发送指令时,先发一条Reset命令,然后接着发指令,如: + + 0x 55 AA 02 02 05 00 FA + 0x 55 AA 09 00 01 00 04 00 00 00 00 00 00 F3 + 0x 55 AA 02 02 05 00 FA + 0x 55 AA 09 00 01 00 04 00 00 00 00 00 00 F3 + ... + +#### 串口测试速度指令样例 + +##### 左转 + + 55 AA 02 02 05 00 FA 55 AA 09 00 01 00 00 00 04 00 00 00 00 F3 + +##### 右转 + + 55 AA 02 02 05 00 FA 55 AA 09 00 01 00 04 00 00 00 00 00 00 F3 + +##### 前进 + + 55 AA 02 02 05 00 FA 55 AA 09 00 01 00 04 00 04 00 00 00 00 F7 + +##### 后退 + + 55 AA 02 02 05 00 FA 55 AA 09 00 01 FF FA FF FA 00 00 00 00 F7 + +下面列出几个常用的控制指令示例: + +# 控制车轮速度指令 +假设请求左车轮速度为0.1m/s,传输数据帧内容为: + + 0x 55 AA 09 00 01 00 04 00 00 00 00 00 00 F3 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
HeaderLengthSequencePayloadChecksum
MsgIDPARAM
55 AA09000100 0400 0000 0000 00F3
起始标志位有效数据的长度为9个字节第一个指令控制车轮速度指令左车轮右车轮固定不变为0异或校验码
+ +如上文所说,通常我们所说的速度是以m/s为单位的速度,而指令中车轮速度的参数实际上是单位时间内期望编码器的计数,在此需要将指令的速度V(m/s)结合AP1下位机的物理参数进行计算,下面是车轮速度换算方法。 + +M1下位机物理参数如下表: + +名称 | 参数 | 说明 +:-------------: | :-------------: | :------------- +wheel_diameter | 0.25 | 车轮直径,单位:米 +encoder_resolution | 1600 | 编码器转一圈产生的脉冲数 +PID_RATE | 50 | PID调节PWM值的频率 + +假设我们给M1左轮V=0.1m/s的速度(右轮速度的计算指令与此相同),计算方法如下: + +车轮转动一圈,移动的距离为轮子的周长: + + distance_one_round + =wheel_diameter*π + =wheel_diameter*3.1415926 + =0.25*3.1415926 + +车轮转动一圈,编码器产生的脉冲数为: + + wheel_encoder_resolution + =1*encoder_resolution + =1*1600 + =1600 + +注:编码器与车轮连接在一起,车轮转1圈,编码器转1圈;编码器的脉冲数可以理解为编码器计数,编码器自转一圈计数1600,则车轮转一圈编码器计数为1600。 + +所以AP1每移动1米产生脉冲数(编码器的计数)为: + + ticks_per_meter + =(1/distance_one_round)*wheel_encoder_resolution + =1/(0.25*3.1415926)*1600 + =2037.18 + +又因为PID的频率是1秒钟50次,所以指令的参数计算方法为: + + int(V*ticks_per_meter/PID_RATE) + =int(0.1*2037.18/50) + =4 + + +用户可直接使用0.1m/s速度的计算结果来对应自己期望的速度换算成相应的数值,如0.2m/s为8,1m/s为40等。 + +接着将计算出来的4换算为16进制为: + + 00 04 + +则速度指令的PARAM为 + + 00 04 00 00 00 00 00 00 + + +注:如果用户发送的速度超过了最大速度,则会按最大速度行进。 + +# 获取电池电量指令 + 0x 55 AA 02 01 02 00 FE + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
HeaderLengthSequencePayloadChecksum
MsgIDPARAM
55 AA02010200FE
起始标志位有效数据的长度为2个字节第二个指令小车的电量请求参数为00异或校验码
+ +# 重置状态指令 +当接收到下位机发送的错误状态码FF时,需要将AP1状态重置(Reset),才能重新恢复控制,指令如下: + + 0x 55 AA 02 02 05 00 FA + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
HeaderLengthSequencePayloadChecksum
MsgIDPARAM
55 AA02020500FA
起始标志位有效数据的长度为2个字节第三个指令重置状态指令参数为00异或校验码
+ +# 清除编码器计数指令 + + + 0x 55 AA 02 03 06 00 F8 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
HeaderLengthSequencePayloadChecksum
MsgIDPARAM
55 AA02030600F8
起始标志位有效数据的长度为2个字节第四个指令请求清除编码器计数参数为00异或校验码
diff --git a/chassis/imgs/1.png b/chassis/imgs/1.png new file mode 100644 index 0000000..4b3b83f Binary files /dev/null and b/chassis/imgs/1.png differ diff --git a/chassis/imgs/2.png b/chassis/imgs/2.png new file mode 100644 index 0000000..571f17a Binary files /dev/null and b/chassis/imgs/2.png differ diff --git a/chassis/imgs/4.png b/chassis/imgs/4.png new file mode 100644 index 0000000..8d4be9c Binary files /dev/null and b/chassis/imgs/4.png differ diff --git a/chassis/imgs/autolaborPro1-flow.jpg b/chassis/imgs/autolaborPro1-flow.jpg new file mode 100644 index 0000000..de0c4a1 Binary files /dev/null and b/chassis/imgs/autolaborPro1-flow.jpg differ diff --git a/chassis/imgs/autolaborPro1-xor.png b/chassis/imgs/autolaborPro1-xor.png new file mode 100644 index 0000000..0440214 Binary files /dev/null and b/chassis/imgs/autolaborPro1-xor.png differ diff --git a/chassis/imgs/ps1.jpg b/chassis/imgs/ps1.jpg new file mode 100644 index 0000000..919de8a Binary files /dev/null and b/chassis/imgs/ps1.jpg differ diff --git a/chassis/imgs/ps2.jpg b/chassis/imgs/ps2.jpg new file mode 100644 index 0000000..1b4184a Binary files /dev/null and b/chassis/imgs/ps2.jpg differ diff --git a/chassis/intro.md b/chassis/intro.md new file mode 100644 index 0000000..a9b2263 --- /dev/null +++ b/chassis/intro.md @@ -0,0 +1,108 @@ +# 产品参数 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
尺寸726*617*326mm净重40kg
负载50kg电池24v 磷酸铁锂电池
电池容量20AH续航时间4h
辅助电源24v最大速度0.8m/s
驱动方式四驱转向方式差速转向
通信接口RS232串口
115200bps
编码器精度物理:400线
逻辑:1600线(四倍频)
PID控制频率50Hz适用地形全地形
垂直越障能力8cm爬坡能力25°
支持系统Windows/Linux支持平台x86/arm
手柄控制20m手柄通讯2.4Ghz
+ +# 产品尺寸 + +![4.png](imgs/4.png) + + + +# 控制手柄参数 +该手柄有自动休眠功能,长时间不操作,省电模块被激活后自动进入休眠模式,按下START键即可唤醒手柄。 + +参数名称 | 参数内容 +:-------------: | :-------------: +电池 | AAA(7号)电池\*2 +使用时间 | 约10小时 +无线频率 | 2.4GHz +接收范围 | 20m + +* * * + +# 控制面板使用 +![1.png](imgs/1.png) + +控制面板清单: + +名称 | 个数 | 说明 +:-------------: | :-------------: | :-------------: +紧急停止 | 1 | 在紧急情况下请按下该紧急停止按钮 +电源 | 1 | 电源开启关闭按钮 +充电口 | 1 | 为内置电池充电 +电量显示 | 1 | 以百分比的形式显示M1电池电量 +遥控/上位机 | 1 | 切换手柄控制与上位机控制按钮 +RS232 | 1 | 使用串口数据线连接下位机与上位机,进行通信 + +* * * + +# 熔断式保险或空气开关 + + 当M1意外出现短路、过载的情况时,熔断式保险或空气开关会主动切断电池的回路。 + ![2.png](imgs/2.png) + + + + + diff --git a/chassis/odomCalibration.md b/chassis/odomCalibration.md new file mode 100644 index 0000000..7e8dd27 --- /dev/null +++ b/chassis/odomCalibration.md @@ -0,0 +1,55 @@ + +## 里程计标定 + +里程计标定也叫里程计校准,即在当前运行环境下重新计算运动模型,得到里程计的运动模型参数,此教程**只适用于使用ROS控制M1机器人**的用户。 + +Autolabor M1 出厂时已做过标定了,在一般运行环境下(地毯、水泥、普通瓷砖等平坦路面)不用重新做标定,但如果您的运行环境是非一般环境,机器人可能就需要重新做标定,比如【经过打磨过的】并且还有【镜面效果】的水泥路面,或摩擦力较大路面,如果您在使用导航套件建图时效果不佳,也可以进行标定。 + +对于不太确定产品是否需要标定的用户,可先进行里程计测试,根据测试结果来判断机器人是否需要标定。 + + + +## 检测机器人是否需要标定 + + + +### 操作步骤: + +1. 启动键盘控制,使用ROS键盘控制AP1原地转360度 +2. 打开一个新的terminal,运行 + ``` + $ rviz + ``` +3. rviz窗口打开后,将fixed frame选择为odom +4. 关闭其他所有勾选,只保留grid和tf(如没有grid,左下角add新增) +5. 打开tf,下拉出来frames的内容,关闭其他所有勾选,保留baselink和odom +6. rviz右侧界面可看两个重合的坐标系(baselink和odom) +7. 对机器人(实体)的四个轮子做标记,标记此时车的位置 +8. 键盘控制机器人原地360度转一圈(请必须记住此时旋转的方向,标定会用到),控制机器人回到刚刚标记的位置(重合),保持机器人与标记的初始位置方向一致 +9. 观察rviz中的2个坐标系是否重合 + +如果不重合,表示需要标定。 + +如果基本重合,表示不需要标定。 + +## 对机器人进行里程计标定 + +### 操作步骤: + +1. 打开一个新的terminal +2. 运行 + ``` + $ rosrun tf tf_echo /odom /base_link + ``` +3. 在出现的数据中查找in RPY (degree)[0,0,X] +4. 查看X值,如果刚刚键盘控制车时是顺时针转,用360-X,如果是逆时针转,用360+X,得到Y +5. 计算 model_param*Y/360,得到计算结果 +6. 打开启动的launch文件,找到Autolabor M1驱动部分(autolabor_pro1_driver),找到model_param参数,将model_param改为上一步得到的结果 +7. 保存、关闭launch文件 +8. 关闭terminal中的运行的launch(ctrl+c),如果rviz关闭时弹出窗口,询问是否需要保存,点击【without saving】(不保存) +9. 再次重复【检测机器人是否需要标定】的操作 + +如果不重合,表示需要标定,如果基本重合,表示不需要标定,重复以上【标定】工作,一次次的进行,直到基本重合。 + +注意:除第一次标定时使用的model_param为驱动中的原始值,之后每一次的标定操作中model_param为上一次标定计算的model_param结果(第5步) + diff --git a/chassis/overview.md b/chassis/overview.md new file mode 100644 index 0000000..4ca0ec5 --- /dev/null +++ b/chassis/overview.md @@ -0,0 +1,50 @@ +# 产品概述 +Autolabor M1机器人移动开发平台是一款集模块化、简洁化、可定制为一身的机器人底盘,适用于机器人教育培训、科学研究和产品开发等。具有通过性强、负载能力大、精度高、动力足、续航长和扩展性高等特点,可跨平台开发,支持多种应用场景。 + +* * * + + +# 主要特性 +* 可靠耐用,操作简单,无需组装,开机直接使用 +* 高通过性,爬坡能力十足,续航能力强 +* 高精度工业级编码器,定位精准 +* 高负载,负重可达50KG +* 适应场景广泛,室内外均可使用 +* 兼容多个系统,支持多种开发平台、控制方式 +* 支持ROS开发,提供ROS驱动包与运动模型 +* 雷达、摄像头、惯导等多种传感器随意组合搭配,拆装方便 +* 使用文档齐全,配备后续用户支持,并不断更新开发教程 + +* * * + + +# 产品清单 + +名称 | 数量 | 备注 +:---:|:---:|--- +M1移动平台 | 1辆 | +M1充电器 | 1个 | +M1控制手柄| 1套 | 含电池 +串口数据线 | 1根 | +配套工具 | 1套 | + +* * * + +# 使用提醒 + +* 产品边缘锋利,请小心接触,避免划伤 +* 产品表面为金属材质,请勿与电路板直接接触 * 操控平台时避免速度过快,引起碰撞 * 搬运时以及设置作业时,请勿落下或倒置 +* 非专业人员,请不要私自拆卸 * 不使用非原厂标配的电池、电源、充电座 * 运行时请勿用手触碰 +* 不要在有水的地方,存在腐蚀性、易燃性气体的环境内和靠近可燃性物质的地方使用 * 不要放置在加热器或者大型卷线电阻器等发热体周围 +* 切勿将电机直接与商用电源连接 + +* * * + +# 电池安全 +* 请在有人看护的状态下充电,若人员离开请拔掉充电插头 +* 充电器在充电工作时,会向外界散发一定的热量,充电器与产品应放在通风干燥的环境中使用 * 正常充电时,充电指示灯为红色,当转为绿色时为充满 +* 停止充电时,应先拔下插头,然后取下电池端插头 +* 产品长期不用,需三个月至半年补充一次电 +* 产品电池不可将电完全用完,否则会严重受损,容易造成不可修复 + +* * * \ No newline at end of file diff --git a/chassis/protocolRule.md b/chassis/protocolRule.md new file mode 100644 index 0000000..70a389d --- /dev/null +++ b/chassis/protocolRule.md @@ -0,0 +1,198 @@ +## 协议概述 + +本协议是一种用于M1上位机与下位机之间通信的自定义通信协议,波特率为115200,以16进制格式传输。上位机向下位机发送请求(commands),下位机在收到来自上位机的请求后,作出相应的反应并返回应答(feedback)至上位机,帧结构说明如下。 + +## 帧结构说明 +数据帧分为5个部分:起始标志位/帧头(Header),数据长度(Length),序列号(Sequence),有效载荷数据(Payload),检验码(Checksum)。 + +数据帧结构如下表所示: + + + + + + + + + + + + + + + + + + +
NameHeaderLengthSequencePayloadChecksum
Size2 Byte1 Byte1 ByteN Bytes1 Byte
+ +### 起始标志位/帧头(Header) +起始标志位,即为我们常说的帧头,以固定不变的“55AA”作为起始标志位,标志着一帧的开始。 + +### 数据长度(Length) +数据长度,其值表示数据包Payload的长度。 + +### 序列号(Sequence) +帧的序列号从0开始,范围为0~255,消息的发送端每发送一个帧将该字段的值加1,接收端可以根据该字段是否连续,判断是否有丢包的情况发生。 + +### 有效载荷数据(Payload) +有效载荷数据,即实际数据内容,考虑到数据传输效率与可扩展性,本协议将Payload的长度设计为非固定长度,可适应不同的消息类型。 + +Payload分为两部分:MsgID和PARAM。 + + + + + + + + + + + + + + + +
Payload
MsgIDPARAM
指令的类型指令的内容
+ +Payload指令如下表所示: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeMsgIDPARAMDescription
车轮速度指令发送0100 0000 0000 0000 00 + +* M1是2电机4轮驱动模式,左/右两侧的两个轮子各由一个电机驱动。因此左边的两个轮子的速度是相同的,在发送左/右轮速度时,仅需发送一个轮子的速度,每个轮速是2个字节 +* PARAM中前2个字节设置左轮的速度,接着2个字节设置右轮的速度,后面4个字节全部置0,用于后续拓展四轮控制 +* 当我们改变车轮的速度的时候,其实是改变车轮编码器的计数,例如给左轮一个0.1m/s前进的速度,即给出的指令是0004,则需要通过计算将车轮速度转化为编码器的计数,后面会讲到如何计算 +
左轮右轮空字段,用于后续扩展
接收0100 0400 0000 0000 00返回的数据是当前时刻车轮编码器的累计计数
左轮右轮空字段,用于后续扩展
电池电量指令发送0200请求电池电量
接收0232返回的数据为0~100电量区间的16进制表达,例如电量为50,则返回32
重置状态指令发送0500 + +**注:当上位机在发送指令后,接收到错误状态信息FF时,必须发送重置指令,重置后才能恢复对下位机的控制** + +
接收0501返回操作成功
0500返回操作失败
清除编码器计数指令发送0600对编码器计数清零
接收0601返回操作成功
0600返回操作失败
错误状态指令接收FF01电池没电当上位机向发送请求,下位机发生错误无法执行指令时,会向上位机返回相应的错误信息
FF02电流过大
FF03串口通信故障
FF04车轮卡死
+错误状态处理流程图: +
+ +![Flow](imgs/autolaborPro1-flow.jpg) + +
+ + +### 检验码(Checksum) + +为保证上位机与下位机所传输数据的无误性与一致性,本协议采用异或(XOR)校验的方式,根据具体发送的指令生成异或校验码,校验的数据包括帧头55AA,用户可以使用在线的[异或校验计算器](http://www.ip33.com/bcc.html)来计算,如下图所示**计算结果(Hex)**即时我们所需的异或校验码。 +
+ +![XOR](imgs/autolaborPro1-xor.png) + +
+ + diff --git a/chassis/sendCommand.md b/chassis/sendCommand.md new file mode 100644 index 0000000..6549036 --- /dev/null +++ b/chassis/sendCommand.md @@ -0,0 +1,140 @@ +# ROS驱动包(ROS Driver Package) + +ROS驱动包(ROS Driver Package)是为使用ROS开发的用户,提供上位机与下位机通讯的驱动包([下载](http://www.autolabor.com.cn/download))。 +### 订阅的话题 +/cmd\_vel ([geometry_msgs/Twist]( http://download.autolabor.com.cn/ROS/AutolaborPro1_ROS_Driver_Package20190107.zip)) +控制下位机运动的速度指令 + +### 发布的话题 +/wheel\_odom ([nav_msgs/Odometry](http://docs.ros.org/api/nav_msgs/html/msg/Odometry.html)) +轮速里程计 + +/remaining\_battery ([std_msgs::Int32](http://docs.ros.org/hydro/api/std_msgs/html/msg/Int32.html)) +剩余电池电量 + +/current([std_msgs::Float32](http://docs.ros.org/hydro/api/std_msgs/html/msg/Float32.html)) +电流信息 + +/voltage([std_msgs::Float32](http://docs.ros.org/hydro/api/std_msgs/html/msg/Float32.html)) +电压信息 + + +### 参数 + +| 参数 | 名称 | 备注 | +| :------------ | :------------ | :------------ | +| ~port_name (str, default: /dev/ttyUSB0) | 串口名称 | | +| ~odom_frame (str, default: odom) | odom | | +| ~base_frame (str, default: base_link) | base_link | | +| ~baud_rate (int, default: 115200) | 波特率 | | +| ~control_rate (int, default: 10) | 控制频率 | | +| ~sensor_rate (int, default: 5) | 请求电池电量频率 | | +| ~reduction_ratio (double, default: 1) | 减速比 | | +| ~encoder_resolution (double, default: 1600) | 编码器的编码数 | | +| ~wheel_diameter (double, default: 0.25) | 车轮直径 | | +| ~model_param_cw (double, default:0.8) | 顺时针旋转运动模型参数 | | ~model_param_acw (double, default:0.8) | 逆时针旋转运动模型参数 | | ~pid_rate (double, default:50.0) | PID控制周期 | | + +### TF转换 + +odom → base_link + +### 驱动示例 + + + + + + + + + + + + + + + + + + + + + + + +### 驱动启动方法 + +1. 将ROS驱动放入工作空间catkin_ws/src +2. 回到catkin_ws根目录下 +3. 打开terminal +3. 执行 + source /opt/ros/kinetic/setup.bash +4. 执行 + caktin_make +5. 执行 + source devel/setup.bash +6. 执行 + roslaunch autolabor_pro1_driver driver.launch + +驱动启动后,可以给小车发送速度指令。此时须将底盘架起来,车轮悬空。 + +### 速度指令发送 + +1. 打开一个terminal +2. 执行 rostopic list 查看有无/cmd_vel 话题 +3. 如果有的话,执行: + + rostopic pub -r 10 /cmd_vel geometry_msgs/Twist -- '[0.0,0.0,0.0]' '[0.0,0.0,1]' + +此时车轮会开始转动,如果想要停止的话,必须在执行命令的terminal中执行Ctrl+C,停止发送。 + +关于指令参数的详细介绍,请参考ROS官网 [Using rostopic pub](http://wiki.ros.org/ROS/Tutorials/UnderstandingTopics) + + + +### 常见问题 +* 如果启动的时无法找到端口,请使用以下命令,查看是否存在该目录 /dev/ttyUSB0 + + ll /dev/ttyUSB0 + +* 若不存在,请检查: + + 1. 串口线是否插好 + 2. 小车电源是否打开 + 3. 如果上述都没有问题,请查询是否是其他的USB端口,如/dev/ttyUSB1或/dev/ttyUSB2 + +* 如果存在目录,但启动显示权限不足,请使用以下命令进行赋权 + + sudo chmod 666 /dev/ttyUSB0 + +# ROS驱动调试助手 + +该驱动还为用户提供了一个调试的节点,可以使用该节点直接向驱动板发送串口指令,进行指令速度与实际运行速度的校准或调整模型等工作。 + + +### 使用步骤 +1. 创建并启动launch文件,示例如下 + + + + + + + + + + + +2. 打开新终端,输入以下命令,打开操作界面(如下图) + + rosrun rqt_reconfigure rqt_reconfigure + + ![](imgs/autolaborPro1-rqt.png) + +3. 调整 left\_wheel 与 right\_wheel的数值,可独立控制左/右轮转速,勾选 run\_flag,即可向小车发送速度指令 + +注:调整的数值为一个PID控制周期下,预期编码器的变化数,详细的计算方法可参见控制车轮速度指令中的**[编码器计数计算方法](controlRule#caculate-method)** + + + + diff --git a/chassis/use.md b/chassis/use.md new file mode 100644 index 0000000..b773ab9 --- /dev/null +++ b/chassis/use.md @@ -0,0 +1,120 @@ +# 控制方式 +AP1可以使用手柄控制和上位机控制两种方式来控制,下面将分别概述这两种控制方式。 + +## 手柄控制 + +### 概述 + +我们配送一个控制手柄用于控制M1移动。 + +### 使用说明 + +M1出厂默认控制模式为手柄控制,在控制面板中可切换控制模式,将M1控制面板中的上位机控制按钮置于“手柄”方向切换到手柄控制模式,即可操作手柄的按键控制移动平台。 + +#### 手柄操作步骤 + +1. 打开手柄电源,切换至ON模式,手柄顶部POWER指示灯亮起 +2. 使用MODE键开启控制模式,顶部MODE LED指示灯为红色时,才能使用手柄进行控制 +3. 先按住手柄顶部两个【1】键,然后按照下文使用说明操作 + +![PS2 control](imgs/ps1.jpg) +![PS2 control](imgs/ps2.jpg) + +#### 手柄按键说明 + +我们对于M1的手柄控制设计有几种速度档位,如下表。 + + + + + + + + + + + + + + + + +
档位0档1档2档3档
速度25%50%75%100%
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
按键功能备注
左区4控制键前/后/左/右控制运动方向
SELECT/最低速度档设置运动速度为最低档位设置速度档位为0档
START/最高速度档设置运动速度为最高档位设置速度档位为3档
左侧摇杆键控制M1的运动方向和速度使用摇杆灵活的控制运动角度与速度,不必受限于正前/后/左/右,控制摇杆推动的力度来控制速度档位的调节,将摇杆向前方直接推到低,则直接是3档,向后方直接推到底,则直接设置为0档
右侧摇杆键无功能现阶段暂未使用
右区控制键-上线速度增加调整速度档位,每按一下,速度提高一档,最高不得高于最高档,如3档
右区控制键-下线速度减少每按一下,速度降低一档,最低不得高于最底档,如0档
右区控制键-左/右角速度增加/减少同线速度
顶部名为“1”的按键运动控制使能在遥控底盘运动、调整线速度、调整角速度的时候,这两个按钮应该处于被按下的状态
顶部名为“2”的按键配对测试按键当按下其中任意一个名为“2”的按键后,且配对的机器人为下位机模式,此时机器人会发出蜂鸣音提示
+ + + + +* * * + +## 上位机控制 +### 概述 +使用M1配送的串口数据线与上位机相连,按照预定义的**协议规则**,向下位机(底层硬件平台)发送指令,控制移动平台。 + +### 使用说明 +将AP1控制面板中的上位机控制按钮置于开启状态,使用接口线将下位机与上位机连接起来,向下位机发送指令。 + +### 指令发送方式 +用户可按照自己的开发场景,选择不同的方式发送指令: + +* 使用**串口调试助手**直接向下位机发送指令 +* 基于ROS开发可使用我们提供的**ROS驱动包**与下位机通信发送接收指令 + + diff --git a/conf.json b/conf.json new file mode 100644 index 0000000..34d74e1 --- /dev/null +++ b/conf.json @@ -0,0 +1,185 @@ +{ + "_readme": [ + "注:uri 必须保障唯一性,若有重复引用,请使用 rewrite 注册新的 uri", + "由于设计缺陷,rewrite 时只能自定义最后一级路径", + "uri 格式 1 - 相对文档:a/b/c", + "uri 格式 2 - 相对站内:/usedoc/ap1/a/b/c", + "uri 格式 3 - 绝对地址:https://www.baidu.com", + "_readme 本身并没有什么软用" + ], + "index": "navigationKit/receivingGuide/inspection", + "rewrite": { + }, + "plugin": { + "emoji": false, + "taskList": true, + "tex": true, + "flowChart": true, + "sequenceDiagram": true + }, + "menu": { + "toc": { + "startLevel": "1", + "overLevel": "1" + }, + "items": [ + { + "name": "Autolabor M1", + "isOpen": true, + "items": [ + { + "name": "收货指南", + "items": [ + { + "name": "检查", + "uri": "navigationKit/receivingGuide/inspection" + } + ] + }, + { + "name": "快速开始", + "items": [ + { + "name": "手柄控制", + "uri": "navigationKit/quickStart/handle" + }, + { + "name": "键盘控制", + "uri": "navigationKit/quickStart/keyboard" + }, + { + "name": "2DSLAM建图", + "uri": "navigationKit/quickStart/2dSlam" + }, + { + "name": "3DSLAM建图", + "uri": "navigationKit/quickStart/3dSlam" + }, + { + "name": "RTK循迹", + "items": [ + { + "name": "安装设置", + "uri": "navigationKit/quickStart/rtk/install" + }, + { + "name": "使用步骤", + "uri": "navigationKit/quickStart/rtk/use" + }, + { + "name": "工作原理", + "uri": "navigationKit/quickStart/rtk/principle" + }, + { + "name": "开发引导", + "uri": "navigationKit/quickStart/rtk/develop" + }, + { + "name": "常见问题", + "uri": "navigationKit/quickStart/rtk/faq" + } + ] + }, + { + "name": "深度相机", + "items": [ + { + "name": "简介", + "uri": "navigationKit/quickStart/vzense/intro" + }, + { + "name": "使用", + "uri": "navigationKit/quickStart/vzense/use" + } + ] + }, + { + "name": "远程连接", + "items": [ + { + "name": "远程连接", + "uri": "navigationKit/quickStart/remote/remoteConnect" + }, + { + "name": "远程控制-键盘插件", + "uri": "navigationKit/quickStart/remote/keyboardPlugin" + }, + { + "name": "常见问题", + "uri": "navigationKit/quickStart/remote/qa" + } + ] + }, + { + "name": "里程计标定", + "uri": "navigationKit/quickStart/robotCalibration" + } + ] + }, + { + "name": "二次开发", + "items": [ + { + "name": "系统目录", + "uri": "navigationKit/development/osIntro" + }, + { + "name": "激光SLAM", + "uri": "navigationKit/development/slamintro" + }, + { + "name": "激光SLAM-多点导航", + "uri": "navigationKit/development/multiGoalintro" + }, + { + "name": "RTK循迹", + "uri": "navigationKit/development/rtkintro" + }, + { + "name": "视觉SLAM", + "uri": "navigationKit/development/vslamintro" + }, + { + "name": "YOLO识别", + "uri": "navigationKit/development/yolo" + } + ] + } + ] + }, + { + "name": "Autolabor M1底盘", + "items": [ + { + "name": "产品概述", + "uri": "chassis/overview" + }, + { + "name": "产品参数", + "uri": "chassis/intro" + }, + { + "name": "产品使用", + "uri": "chassis/use" + }, + { + "name": "串口协议", + "uri": "chassis/protocolRule" + }, + { + "name": "串口指令", + "uri": "chassis/controlRule" + }, + { + "name": "ROS驱动", + "uri": "chassis/sendCommand" + }, + { + "name": "里程计标定", + "uri": "chassis/odomCalibration" + } + ] + } + ] + } +} \ No newline at end of file diff --git a/conf.pre.json b/conf.pre.json new file mode 100644 index 0000000..f1272e8 --- /dev/null +++ b/conf.pre.json @@ -0,0 +1,210 @@ +{ + "_readme": [ + "注:uri 必须保障唯一性,若有重复引用,请使用 rewrite 注册新的 uri", + "由于设计缺陷,rewrite 时只能自定义最后一级路径", + "uri 格式 1 - 相对文档:a/b/c", + "uri 格式 2 - 相对站内:/usedoc/ap1/a/b/c", + "uri 格式 3 - 绝对地址:https://www.baidu.com", + "_readme 本身并没有什么软用" + ], + "index": "navigationKit/receivingGuide/inspection", + "rewrite": { + }, + "plugin": { + "emoji": false, + "taskList": true, + "tex": true, + "flowChart": true, + "sequenceDiagram": true + }, + "menu": { + "toc": { + "startLevel": "1", + "overLevel": "1" + }, + "items": [ + { + "name": "Autolabor M1", + "isOpen": true, + "items": [ + { + "name": "收货指南", + "items": [ + { + "name": "检查", + "uri": "navigationKit/receivingGuide/inspection" + }, + { + "_remark": "TODO", + "name": "清点", + "uri": "navigationKit/receivingGuide/inventory" + } + ] + }, + { + "_remark": "TODO", + "name": "组装测试", + "items": [ + { + "name": "组装", + "uri": "navigationKit/assembly/install" + }, + { + "name": "测试", + "uri": "navigationKit/assembly/test" + } + ] + }, + { + "name": "快速开始", + "items": [ + { + "name": "手柄控制", + "uri": "navigationKit/quickStart/handle" + }, + { + "name": "键盘控制", + "uri": "navigationKit/quickStart/keyboard" + }, + { + "name": "2DSLAM建图", + "uri": "navigationKit/quickStart/2dSlam" + }, + { + "name": "3DSLAM建图", + "uri": "navigationKit/quickStart/3dSlam" + }, + { + "name": "RTK循迹", + "items": [ + { + "name": "安装设置", + "uri": "navigationKit/quickStart/rtk/install" + }, + { + "name": "使用步骤", + "uri": "navigationKit/quickStart/rtk/use" + }, + { + "name": "工作原理", + "uri": "navigationKit/quickStart/rtk/principle" + }, + { + "name": "开发引导", + "uri": "navigationKit/quickStart/rtk/develop" + }, + { + "name": "常见问题", + "uri": "navigationKit/quickStart/rtk/faq" + } + ] + }, + { + "name": "深度相机", + "items": [ + { + "name": "简介", + "uri": "navigationKit/quickStart/vzense/intro" + }, + { + "name": "使用", + "uri": "navigationKit/quickStart/vzense/use" + } + ] + }, + { + "name": "远程连接", + "items": [ + { + "name": "远程连接", + "uri": "navigationKit/quickStart/remote/remoteConnect" + }, + { + "name": "远程控制-键盘插件", + "uri": "navigationKit/quickStart/remote/keyboardPlugin" + }, + { + "name": "常见问题", + "uri": "navigationKit/quickStart/remote/qa" + } + ] + }, + { + "name": "里程计标定", + "uri": "navigationKit/quickStart/robotCalibration" + } + ] + }, + { + "name": "二次开发", + "items": [ + { + "name": "系统目录", + "uri": "navigationKit/development/osIntro" + }, + { + "name": "激光SLAM", + "uri": "navigationKit/development/slamintro" + }, + { + "name": "激光SLAM-多点导航", + "uri": "navigationKit/development/multiGoalintro" + }, + { + "name": "RTK循迹", + "uri": "navigationKit/development/rtkintro" + }, + { + "name": "视觉SLAM", + "uri": "navigationKit/development/vslamintro" + }, + { + "name": "YOLO识别", + "uri": "navigationKit/development/yolo" + } + ] + }, + { + "_remark": "TODO deviceInfo", + "name": "设备资料", + "items": [ + ] + } + ] + }, + { + "name": "Autolabor M1底盘", + "items": [ + { + "name": "产品概述", + "uri": "chassis/overview" + }, + { + "name": "产品参数", + "uri": "chassis/intro" + }, + { + "name": "产品使用", + "uri": "chassis/use" + }, + { + "name": "串口协议", + "uri": "chassis/protocolRule" + }, + { + "name": "串口指令", + "uri": "chassis/controlRule" + }, + { + "name": "ROS驱动", + "uri": "chassis/sendCommand" + }, + { + "name": "里程计标定", + "uri": "chassis/odomCalibration" + } + ] + } + ] + } +} \ No newline at end of file diff --git a/mulu.md b/mulu.md new file mode 100644 index 0000000..c37e2d9 --- /dev/null +++ b/mulu.md @@ -0,0 +1,57 @@ +#Autolabor M1(navigationKit) + + +##收货指南(receivingGuide) +###检查(receipt) +###清点 + +##组装测试 +###组装 +###测试 + +##快速开始(quickStart) +###手柄控制(handle) +###键盘控制(keyboard) +###2DSLAM建图(2dSlam) +###3DSLAM建图(3dSlam) +###RTK循迹(rtk) +安装设置(install) + +使用步骤(use) + +工作原理(principle) + +开发引导(develop) + +常见问题(faq) + +###深度相机(vzense) +简介(intro) + +使用(use) +###远程连接(remote) +远程连接(remoteConnect) + +远程控制-键盘插件(keyboardPlugin) + +常见问题(qa) +###里程计标定(robotCalibration) +##二次开发(development) +###系统目录(OSintro) +###激光SLAM(slamintro) +###激光SLAM-多点导航(multiGoalintro) +###RTK循迹(rtkintro) +###视觉SLAM(vslamintro) +###YOLO识别(yolo) +##设备资料 + +#Autolabor M1底盘(chassis) +##产品概述(overview) +##产品参数(intro) +##产品使用(use) +##串口协议(protocolRule) +##串口指令(controlRule) +##ROS驱动(sendCommand) +##里程计标定(odomCalibration) + + diff --git a/navigationKit/development/Tree.txt b/navigationKit/development/Tree.txt new file mode 100644 index 0000000..f3f7681 --- /dev/null +++ b/navigationKit/development/Tree.txt @@ -0,0 +1,202 @@ +. +├── script +│   ├── 3d_suit +│   ├── box_suit +│   ├── common +│   ├── simulation +│   ├── test +│   └── track_suit +└── src + ├── autolabor_description + │   ├── launch + │   ├── meshes + │   ├── rviz + │   └── urdf + ├── driver + │   ├── car + │   │   ├── autolabor_canbus_driver + │   │   └── autolabor_pro1_driver + │   ├── depth_camera + │   │   ├── pico_zense_driver + │   │   └── zed_wrapper + │   ├── imu + │   │   ├── ah100b + │   │   ├── ch104m //ch104m IMU 驱动 + │   │   ├── rviz_imu_plugin + │   │   └── tl740d + │   ├── lidar + │   │   ├── ldlidar_stl_ros + │   │   ├── rslidar_sdk + │   │   └── wr_fslidar + │   └── location + │   ├── al_rtk_ros_driver + │   └── marvelmind + │   + ├── launch + │   ├── autolabor_navigation_launch + │   │   ├── cmake-build-debug + │   │   ├── launch + │   │   ├── map + │   │   ├── params + │   │   └── rviz + │   ├── autolabor_test_launch + │   │   ├── launch + │   │   └── rviz + │   └── rtk_tracking + │   ├── log + │   └── resources + ├── mapping + │   ├── cartographer //cartographer GPU 加速版本 + │   │   ├── bazel + │   │   ├── cartographer + │   │   ├── cmake + │   │   ├── configuration_files + │   │   ├── docs + │   │   └── scripts + │   └── cartographer_ros + │   ├── cartographer_ros + │   ├── cartographer_ros_msgs + │   ├── cartographer_rviz + │   ├── docs + │   └── scripts + ├── navigation + │   ├── amcl + │   │   ├── cfg + │   │   ├── examples + │   │   ├── include + │   │   ├── src + │   │   └── test + │   ├── base_local_planner + │   │   ├── cfg + │   │   ├── include + │   │   ├── msg + │   │   ├── src + │   │   └── test + │   ├── carrot_planner + │   │   ├── include + │   │   └── src + │   ├── clear_costmap_recovery + │   │   ├── include + │   │   ├── src + │   │   └── test + │   ├── costmap_2d + │   │   ├── cfg + │   │   ├── include + │   │   ├── launch + │   │   ├── msg + │   │   ├── plugins + │   │   ├── src + │   │   └── test + │   ├── dwa_local_planner + │   │   ├── cfg + │   │   ├── include + │   │   └── src + │   ├── fake_localization + │   ├── global_planner + │   │   ├── cfg + │   │   ├── include + │   │   └── src + │   ├── location_fusion + │   │   ├── include + │   │   └── src + │   ├── loop_path_planner + │   │   ├── include + │   │   └── src + │   ├── map_server + │   │   ├── include + │   │   ├── scripts + │   │   ├── src + │   │   └── test + │   ├── move_base + │   │   ├── cfg + │   │   ├── include + │   │   └── src + │   ├── move_slow_and_clear + │   │   ├── include + │   │   └── src + │   ├── nav_core + │   │   └── include + │   ├── navfn + │   │   ├── include + │   │   ├── src + │   │   ├── srv + │   │   └── test + │   ├── navigation + │   ├── path_rviz_plugin + │   │   ├── include + │   │   └── src + │   ├── path_server + │   │   ├── include + │   │   ├── path_data + │   │   ├── src + │   │   └── srv + │   ├── record_path_planner + │   │   ├── include + │   │   └── src + │   ├── rotate_recovery + │   │   ├── include + │   │   └── src + │   ├── teb_local_planner + │   │   ├── cfg + │   │   ├── cmake_modules + │   │   ├── include + │   │   ├── launch + │   │   ├── msg + │   │   ├── scripts + │   │   ├── src + │   │   └── test + │   └── voxel_grid + │   ├── include + │   ├── src + │   └── test + ├── simulation + │   ├── autolabor_simulation_base + │   │   ├── include + │   │   ├── launch + │   │   ├── rviz + │   │   ├── script + │   │   └── src + │   ├── autolabor_simulation_lidar + │   │   ├── include + │   │   ├── launch + │   │   ├── rviz + │   │   └── src + │   ├── autolabor_simulation_location + │   │   ├── include + │   │   └── src + │   ├── autolabor_simulation_object + │   │   ├── include + │   │   ├── launch + │   │   ├── rviz + │   │   └── src + │   └── autolabor_simulation_stage + │   ├── include + │   ├── launch + │   ├── map + │   ├── src + │   └── srv + └── tool + ├── autolabor_keyboard_control + │   ├── include + │   └── src + ├── cartographer_initialpose + │   ├── include + │   └── src + ├── joy_to_twist + │   └── src + ├── laser_proc + │   ├── include + │   └── src + ├── navi_multi_goals_pub_rviz_plugin + │   └── src + ├── rviz_autolabor_calibration + │   ├── include + │   └── src + ├── rviz_keyboard_twist + │   ├── include + │   └── src + └── rviz_navigation_tools + ├── include + └── src + +206 directories diff --git a/navigationKit/development/imgs/multi1.png b/navigationKit/development/imgs/multi1.png new file mode 100644 index 0000000..2f827ad Binary files /dev/null and b/navigationKit/development/imgs/multi1.png differ diff --git a/navigationKit/development/imgs/multi2.jpeg b/navigationKit/development/imgs/multi2.jpeg new file mode 100644 index 0000000..bb0a97a Binary files /dev/null and b/navigationKit/development/imgs/multi2.jpeg differ diff --git a/navigationKit/development/imgs/multi3.png b/navigationKit/development/imgs/multi3.png new file mode 100644 index 0000000..5cd393f Binary files /dev/null and b/navigationKit/development/imgs/multi3.png differ diff --git a/navigationKit/development/imgs/rtk_intro_1.png b/navigationKit/development/imgs/rtk_intro_1.png new file mode 100644 index 0000000..b8244d1 Binary files /dev/null and b/navigationKit/development/imgs/rtk_intro_1.png differ diff --git a/navigationKit/development/imgs/rtk_intro_2.png b/navigationKit/development/imgs/rtk_intro_2.png new file mode 100644 index 0000000..31f7ab8 Binary files /dev/null and b/navigationKit/development/imgs/rtk_intro_2.png differ diff --git a/navigationKit/development/imgs/slamintro1.jpg b/navigationKit/development/imgs/slamintro1.jpg new file mode 100644 index 0000000..a975948 Binary files /dev/null and b/navigationKit/development/imgs/slamintro1.jpg differ diff --git a/navigationKit/development/imgs/slamintro2.png b/navigationKit/development/imgs/slamintro2.png new file mode 100644 index 0000000..98068f3 Binary files /dev/null and b/navigationKit/development/imgs/slamintro2.png differ diff --git a/navigationKit/development/imgs/slamintro3.png b/navigationKit/development/imgs/slamintro3.png new file mode 100644 index 0000000..30b64ee Binary files /dev/null and b/navigationKit/development/imgs/slamintro3.png differ diff --git a/navigationKit/development/imgs/slamintro4.gif b/navigationKit/development/imgs/slamintro4.gif new file mode 100644 index 0000000..f6df65a Binary files /dev/null and b/navigationKit/development/imgs/slamintro4.gif differ diff --git a/navigationKit/development/imgs/software_intro_1.jpg b/navigationKit/development/imgs/software_intro_1.jpg new file mode 100644 index 0000000..892e472 Binary files /dev/null and b/navigationKit/development/imgs/software_intro_1.jpg differ diff --git a/navigationKit/development/imgs/software_intro_2.jpg b/navigationKit/development/imgs/software_intro_2.jpg new file mode 100644 index 0000000..7879ec8 Binary files /dev/null and b/navigationKit/development/imgs/software_intro_2.jpg differ diff --git a/navigationKit/development/imgs/software_intro_3.jpg b/navigationKit/development/imgs/software_intro_3.jpg new file mode 100644 index 0000000..4781171 Binary files /dev/null and b/navigationKit/development/imgs/software_intro_3.jpg differ diff --git a/navigationKit/development/imgs/software_intro_4.jpg b/navigationKit/development/imgs/software_intro_4.jpg new file mode 100644 index 0000000..c57bf08 Binary files /dev/null and b/navigationKit/development/imgs/software_intro_4.jpg differ diff --git a/navigationKit/development/imgs/software_intro_5.jpg b/navigationKit/development/imgs/software_intro_5.jpg new file mode 100644 index 0000000..3bc3c6e Binary files /dev/null and b/navigationKit/development/imgs/software_intro_5.jpg differ diff --git a/navigationKit/development/imgs/software_intro_6.png b/navigationKit/development/imgs/software_intro_6.png new file mode 100644 index 0000000..b35ea86 Binary files /dev/null and b/navigationKit/development/imgs/software_intro_6.png differ diff --git a/navigationKit/development/imgs/software_intro_7.png b/navigationKit/development/imgs/software_intro_7.png new file mode 100644 index 0000000..e1b70c7 Binary files /dev/null and b/navigationKit/development/imgs/software_intro_7.png differ diff --git a/navigationKit/development/imgs/software_intro_8.png b/navigationKit/development/imgs/software_intro_8.png new file mode 100644 index 0000000..747f0e9 Binary files /dev/null and b/navigationKit/development/imgs/software_intro_8.png differ diff --git a/navigationKit/development/imgs/vslam1.gif b/navigationKit/development/imgs/vslam1.gif new file mode 100644 index 0000000..d4ac3b9 Binary files /dev/null and b/navigationKit/development/imgs/vslam1.gif differ diff --git a/navigationKit/development/imgs/vslam2.png b/navigationKit/development/imgs/vslam2.png new file mode 100644 index 0000000..42931c3 Binary files /dev/null and b/navigationKit/development/imgs/vslam2.png differ diff --git a/navigationKit/development/imgs/vslam3.png b/navigationKit/development/imgs/vslam3.png new file mode 100644 index 0000000..d681ef0 Binary files /dev/null and b/navigationKit/development/imgs/vslam3.png differ diff --git a/navigationKit/development/imgs/vslam4.jpg b/navigationKit/development/imgs/vslam4.jpg new file mode 100644 index 0000000..9b84789 Binary files /dev/null and b/navigationKit/development/imgs/vslam4.jpg differ diff --git a/navigationKit/development/imgs/vslam5.jpg b/navigationKit/development/imgs/vslam5.jpg new file mode 100644 index 0000000..6d9b803 Binary files /dev/null and b/navigationKit/development/imgs/vslam5.jpg differ diff --git a/navigationKit/development/imgs/vslam6.jpg b/navigationKit/development/imgs/vslam6.jpg new file mode 100644 index 0000000..1a5c2a8 Binary files /dev/null and b/navigationKit/development/imgs/vslam6.jpg differ diff --git a/navigationKit/development/imgs/yolo.jpeg b/navigationKit/development/imgs/yolo.jpeg new file mode 100644 index 0000000..e070aab Binary files /dev/null and b/navigationKit/development/imgs/yolo.jpeg differ diff --git a/navigationKit/development/multiGoalintro.md b/navigationKit/development/multiGoalintro.md new file mode 100644 index 0000000..92052af --- /dev/null +++ b/navigationKit/development/multiGoalintro.md @@ -0,0 +1,602 @@ +# 激光SLAM-多点导航 + +本文介绍SLAM导航中*多点导航功能包*的开发思路。 + + +### 开发背景: + +在使用 ROS Navigation & RViz 进行 2D Nav Goal 导航的时候,我们会遇到这些情况: + +1. 给定导航的目标点只能设置一个,当有多点任务时需要等待一个个任务结束后,再次手动给目标 +2. 无法暂停或取消任务 +3. 任务不可循环 + +### 开发目的: + +完成多目标点导航,可以对导航环节进行操控,如可循环、取消、重置任务等。 + +### 开发思路: + +1. 2D Nav Goal 的单点导航是如何实现的? + +我们可以知道导航目标是通过 RViz 工具栏中 2D Nav Goal发布出去的。 + +通过查看 RViz的配置文件或者 Panels->Add New Panel-> Tool Property ,可以了解当使用2D Nav Goal 在地图上拉了一个箭头(给定目标点时),其实是向话题 /move_base_simple/goal 发布了 [geometry_msgs/PoseStamped](http://docs.ros.org/en/api/geometry_msgs/html/msg/PoseStamped.html) 类型的消息,这个是目标点的位姿,包含坐标点与朝向。 + +根据 NodeGraph 可以看到话题 /move_base_simple/goal 被导航包的节点 /move_base 订阅了,进而发给 Navigation 中的各个话题,完成导航。 + +![](./imgs/multi1.png) + + +2. 如何基于单点实现多点导航? + +要在单点基础上实现多目标点导航的话,就要设计一个关于多个导航目标点消息geometry_msgs/PoseStamped的数据结构,并对多个目标点进行处理,完成导航。 + +实现多点的方法有多种,在不打破 ROS Navigation 包的完整性的前提下,我选择在2D Nav Goal的 RViz节点和 /move_base 节点中间添加了一个话题 /move_base_simple/goal_temp,将原本发送给 /move_base_simple/goal 的消息,转发给/move_base_simple/goal_temp,通过此话题来积攒多个 2D Nav Goal(任务队列),并根据任务完成的状态反馈,按顺序将每个导航目标点消息 geometry_msgs/PoseStamped 再发送给话题/move_base_simple/goal,以完成多任务中的单次目标点的导航(如下图示)。 + +![](./imgs/multi2.jpeg) + + +3. 如何来发布多点任务? + +像 2D Nav Goal 一样,我们也可以在 RViz 中开发可视化的操作栏,这要使用到 RViz plugin , ROS中的可视化工具绝大部分都是基于Qt进行开发的,此前古月居有过详细介绍,可参考[这篇文章](https://zhuanlan.zhihu.com/p/39390512)。 + +### 最终效果 + +首先,我们来看一下最终的实现效果。 + +MultiNaviGoalsPanel是多点SLAM导航任务的可视化操作区,包括任务点列表、循环、重置、取消、开始任务。 + +通过 RViz plugin 设计的Mark Display,能够显示的目标点的标号及箭头(朝向)。 + +![](./imgs/multi3.png) + + +#### 代码实现 + +#### 1. 头文件 multi_navi_goal_panel.h + +Qt说明: + +* 文字编辑——QLineEdit +* 按键——QPushButton +* 列表——QTableWidget +* 复选框——QCheckBox +* 文字显示——QString + +ROS说明: + +Publisher: + +* 发送每个目标点消息给/move_base_simple/goal的goal_pub_ +* 发送取消指令消息给/move_base/cancel的cancel_pub_ +* 发送文字和箭头标记的mark_pub_。 + +Subsrciber: + +* 订阅来自rviz中2D Nav Goal的导航目标点消息的goal_sub_ +* 订阅目前导航状态的status_sub_ + + + +``` +#ifndef MULTI_NAVI_GOAL_PANEL_H +#define MULTI_NAVI_GOAL_PANEL_H + + +#include + +#include +#include +#include +#include + +#include //plugin基类的头文件 + +#include //Qt按钮 +#include //Qt表格 +#include //Qt复选框 + +#include +#include +#include +#include +#include +#include +#include +#include + + +namespace navi_multi_goals_pub_rviz_plugin { + + class MultiNaviGoalsPanel : public rviz::Panel { + Q_OBJECT + public: + explicit MultiNaviGoalsPanel(QWidget *parent = 0); + + virtual void load(const rviz::Config &config); + + virtual void save(rviz::Config config) const; + + public Q_SLOTS: + + void setMaxNumGoal(const QString &maxNumGoal);//设置最大可设置的目标点数量 + void writePose(geometry_msgs::Pose pose);//将目标点位姿写入任务列表 + void markPose(const geometry_msgs::PoseStamped::ConstPtr &pose);//在地图中标记目标位姿 + void deleteMark();//删除标记 + + protected Q_SLOTS: + + void updateMaxNumGoal(); // 更新最大可设置的目标点数量 + void initPoseTable(); // 初始化目标点表格 + + void updatePoseTable(); // 更新目标点表格 + void startNavi(); // 开始第一个目标点任务导航 + void cancelNavi(); // 取消现在进行中的导航 + void addPose(); + + void goalCntCB(const geometry_msgs::PoseStamped::ConstPtr &pose); // 目标数量子回调函数 + + void statusCB(const actionlib_msgs::GoalStatusArray::ConstPtr &statuses); // 状态子回调函数 + + void checkCycle(); // 确认循环 + + void completeNavi(); // 第一个任务到达后,继续进行剩下任务点的导航任务 + void cycleNavi(); + + bool checkGoal(std::vector status_list); // 检查是否到达目标点 + + static void startSpin(); // 启用ROS订阅 + protected: + QLineEdit *output_maxNumGoal_editor_; + QPushButton *output_maxNumGoal_button_, *output_reset_button_, *output_startNavi_button_, *output_cancel_button_, *output_addPoint_button_; + QTableWidget *poseArray_table_; + QCheckBox *cycle_checkbox_; + + QString output_maxNumGoal_; + + // The ROS node handle. + ros::NodeHandle nh_; + ros::Publisher goal_pub_, cancel_pub_, marker_pub_, init_goal_pub_; + ros::Subscriber goal_sub_, status_sub_; + + tf2_ros::Buffer tfBuffer_; + tf2_ros::TransformListener tfListener_; + // 多目标点任务栏定义 + int maxNumGoal_; + int curGoalIdx_ = 0, cycleCnt_ = 0; + bool permit_ = false, cycle_ = false, arrived_ = false; + geometry_msgs::PoseArray pose_array_; + + actionlib_msgs::GoalID cur_goalid_; + + + }; + +} // end namespace navi-multi-goals-pub-rviz-plugin + +#endif // MULTI_NAVI_GOAL_PANEL_H + +``` + +#### 2. cpp文件 multi_navi_goal_panel.cpp + +``` +#include + +#include + +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include + + +#include "multi_navi_goal_panel.h" + +namespace navi_multi_goals_pub_rviz_plugin { + + + MultiNaviGoalsPanel::MultiNaviGoalsPanel(QWidget *parent) + : rviz::Panel(parent), nh_(), maxNumGoal_(1), tfListener_(tfBuffer_) { + + goal_sub_ = nh_.subscribe("move_base_simple/goal_temp", 100, + boost::bind(&MultiNaviGoalsPanel::goalCntCB, this, _1)); + + status_sub_ = nh_.subscribe("move_base/status", 1, + boost::bind(&MultiNaviGoalsPanel::statusCB, this, + _1)); + + goal_pub_ = nh_.advertise("move_base_simple/goal", 1); + + init_goal_pub_ = nh_.advertise("move_base_simple/goal_temp", 1); + + cancel_pub_ = nh_.advertise("move_base/cancel", 1); + + marker_pub_ = nh_.advertise("visualization_marker", 1); + + QVBoxLayout *root_layout = new QVBoxLayout; + // create a panel about "maxNumGoal" + QHBoxLayout *maxNumGoal_layout = new QHBoxLayout; + maxNumGoal_layout->addWidget(new QLabel("目标最大数量")); + output_maxNumGoal_editor_ = new QLineEdit; + maxNumGoal_layout->addWidget(output_maxNumGoal_editor_); + output_maxNumGoal_button_ = new QPushButton("确定"); + maxNumGoal_layout->addWidget(output_maxNumGoal_button_); + root_layout->addLayout(maxNumGoal_layout); + + QHBoxLayout *second_row_layout = new QHBoxLayout; + cycle_checkbox_ = new QCheckBox("循环"); + second_row_layout->addWidget(cycle_checkbox_); + output_addPoint_button_ = new QPushButton("添加机器人当前位置"); + second_row_layout->addWidget(output_addPoint_button_); + root_layout->addLayout(second_row_layout); + + // creat a QTable to contain the poseArray + poseArray_table_ = new QTableWidget; + initPoseTable(); + root_layout->addWidget(poseArray_table_); + //creat a manipulate layout + QHBoxLayout *manipulate_layout = new QHBoxLayout; + output_reset_button_ = new QPushButton("重置"); + manipulate_layout->addWidget(output_reset_button_); + output_cancel_button_ = new QPushButton("取消"); + manipulate_layout->addWidget(output_cancel_button_); + output_startNavi_button_ = new QPushButton("开始导航!"); + manipulate_layout->addWidget(output_startNavi_button_); + root_layout->addLayout(manipulate_layout); + + setLayout(root_layout); + // set a Qtimer to start a spin for subscriptions + QTimer *output_timer = new QTimer(this); + output_timer->start(200); + + // 设置信号与槽的连接 + connect(output_maxNumGoal_button_, SIGNAL(clicked()), this, + SLOT(updateMaxNumGoal())); + connect(output_maxNumGoal_button_, SIGNAL(clicked()), this, + SLOT(updatePoseTable())); + connect(output_reset_button_, SIGNAL(clicked()), this, SLOT(initPoseTable())); + connect(output_cancel_button_, SIGNAL(clicked()), this, SLOT(cancelNavi())); + connect(output_startNavi_button_, SIGNAL(clicked()), this, SLOT(startNavi())); + connect(output_addPoint_button_, SIGNAL(clicked()), this, SLOT(addPose())); + connect(cycle_checkbox_, SIGNAL(clicked(bool)), this, SLOT(checkCycle())); + connect(output_timer, SIGNAL(timeout()), this, SLOT(startSpin())); + + + } + +// 更新maxNumGoal命名 + void MultiNaviGoalsPanel::updateMaxNumGoal() { + setMaxNumGoal(output_maxNumGoal_editor_->text()); + } + +// set up the maximum number of goals + void MultiNaviGoalsPanel::setMaxNumGoal(const QString &new_maxNumGoal) { + // 检查maxNumGoal是否发生改变. + if (new_maxNumGoal != output_maxNumGoal_) { + output_maxNumGoal_ = new_maxNumGoal; + + // 如果命名为空,不发布任何信息 + if (output_maxNumGoal_ == "") { + nh_.setParam("maxNumGoal_", 1); + maxNumGoal_ = 1; + } else { +// velocity_publisher_ = nh_.advertise(output_maxNumGoal_.toStdString(), 1); + nh_.setParam("maxNumGoal_", output_maxNumGoal_.toInt()); + maxNumGoal_ = output_maxNumGoal_.toInt(); + } + Q_EMIT configChanged(); + } + } + + // initialize the table of pose + void MultiNaviGoalsPanel::initPoseTable() { + ROS_INFO("Initialize"); + curGoalIdx_ = 0, cycleCnt_ = 0; + permit_ = false, cycle_ = false; + poseArray_table_->clear(); + pose_array_.poses.clear(); + deleteMark(); + poseArray_table_->setRowCount(maxNumGoal_); + poseArray_table_->setColumnCount(3); + poseArray_table_->setEditTriggers(QAbstractItemView::NoEditTriggers); + poseArray_table_->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch); + QStringList pose_header; + pose_header << "x" << "y" << "yaw"; + poseArray_table_->setHorizontalHeaderLabels(pose_header); + cycle_checkbox_->setCheckState(Qt::Unchecked); + + } + + // delete marks in the map + void MultiNaviGoalsPanel::deleteMark() { + visualization_msgs::Marker marker_delete; + marker_delete.action = visualization_msgs::Marker::DELETEALL; + marker_pub_.publish(marker_delete); + } + + //update the table of pose + void MultiNaviGoalsPanel::updatePoseTable() { + poseArray_table_->setRowCount(maxNumGoal_); +// pose_array_.poses.resize(maxNumGoal_); + QStringList pose_header; + pose_header << "x" << "y" << "yaw"; + poseArray_table_->setHorizontalHeaderLabels(pose_header); + poseArray_table_->show(); + } + + // call back function for counting goals + void MultiNaviGoalsPanel::goalCntCB(const geometry_msgs::PoseStamped::ConstPtr &pose) { + if (pose_array_.poses.size() < maxNumGoal_) { + pose_array_.poses.push_back(pose->pose); + pose_array_.header.frame_id = pose->header.frame_id; + writePose(pose->pose); + markPose(pose); + } else { + ROS_ERROR("Beyond the maximum number of goals: %d", maxNumGoal_); + } + } + + // write the poses into the table + void MultiNaviGoalsPanel::writePose(geometry_msgs::Pose pose) { + + poseArray_table_->setItem(pose_array_.poses.size() - 1, 0, + new QTableWidgetItem(QString::number(pose.position.x, 'f', 2))); + poseArray_table_->setItem(pose_array_.poses.size() - 1, 1, + new QTableWidgetItem(QString::number(pose.position.y, 'f', 2))); + poseArray_table_->setItem(pose_array_.poses.size() - 1, 2, + new QTableWidgetItem( + QString::number(tf::getYaw(pose.orientation) * 180.0 / 3.14, 'f', 2))); + + } + + // when setting a Navi Goal, it will set a mark on the map + void MultiNaviGoalsPanel::markPose(const geometry_msgs::PoseStamped::ConstPtr &pose) { + if (ros::ok()) { + visualization_msgs::Marker arrow; + visualization_msgs::Marker number; + arrow.header.frame_id = number.header.frame_id = pose->header.frame_id; + arrow.ns = "navi_point_arrow"; + number.ns = "navi_point_number"; + arrow.action = number.action = visualization_msgs::Marker::ADD; + arrow.type = visualization_msgs::Marker::ARROW; + number.type = visualization_msgs::Marker::TEXT_VIEW_FACING; + arrow.pose = number.pose = pose->pose; + number.pose.position.z += 1.0; + arrow.scale.x = 1.0; + arrow.scale.y = 0.2; + number.scale.z = 1.0; + arrow.color.r = number.color.r = 1.0f; + arrow.color.g = number.color.g = 0.98f; + arrow.color.b = number.color.b = 0.80f; + arrow.color.a = number.color.a = 1.0; + arrow.id = number.id = pose_array_.poses.size(); + number.text = std::to_string(pose_array_.poses.size()); + marker_pub_.publish(arrow); + marker_pub_.publish(number); + } + } + + // check whether it is in the cycling situation + void MultiNaviGoalsPanel::checkCycle() { + cycle_ = cycle_checkbox_->isChecked(); + } + + void MultiNaviGoalsPanel::addPose() { + std::string target_frame = "map"; + std::string child_frame = "base_link"; + if (tfBuffer_.canTransform(target_frame, child_frame, ros::Time(0), ros::Duration(4.0))) { + geometry_msgs::TransformStamped transformStamped = tfBuffer_.lookupTransform(target_frame, child_frame, + ros::Time(0), + ros::Duration(4.0)); + geometry_msgs::PoseStamped pose; + pose.header.frame_id = target_frame; + pose.header.stamp = transformStamped.header.stamp; + pose.pose.position.x = transformStamped.transform.translation.x; + pose.pose.position.y = transformStamped.transform.translation.y; + pose.pose.position.z = transformStamped.transform.translation.z; + pose.pose.orientation = transformStamped.transform.rotation; + + init_goal_pub_.publish(pose); + } + + } + + // start to navigate, and only command the first goal + void MultiNaviGoalsPanel::startNavi() { + curGoalIdx_ = curGoalIdx_ % pose_array_.poses.size(); + if (!pose_array_.poses.empty() && curGoalIdx_ < maxNumGoal_) { + geometry_msgs::PoseStamped goal; + goal.header = pose_array_.header; + goal.pose = pose_array_.poses.at(curGoalIdx_); + goal_pub_.publish(goal); + ROS_INFO("Navi to the Goal%d", curGoalIdx_ + 1); + poseArray_table_->item(curGoalIdx_, 0)->setBackgroundColor(QColor(255, 69, 0)); + poseArray_table_->item(curGoalIdx_, 1)->setBackgroundColor(QColor(255, 69, 0)); + poseArray_table_->item(curGoalIdx_, 2)->setBackgroundColor(QColor(255, 69, 0)); + curGoalIdx_ += 1; + permit_ = true; + } else { + ROS_ERROR("Something Wrong"); + } + } + + // complete the remaining goals + void MultiNaviGoalsPanel::completeNavi() { + if (curGoalIdx_ < pose_array_.poses.size()) { + geometry_msgs::PoseStamped goal; + goal.header = pose_array_.header; + goal.pose = pose_array_.poses.at(curGoalIdx_); + goal_pub_.publish(goal); + ROS_INFO("Navi to the Goal%d", curGoalIdx_ + 1); + poseArray_table_->item(curGoalIdx_, 0)->setBackgroundColor(QColor(255, 69, 0)); + poseArray_table_->item(curGoalIdx_, 1)->setBackgroundColor(QColor(255, 69, 0)); + poseArray_table_->item(curGoalIdx_, 2)->setBackgroundColor(QColor(255, 69, 0)); + curGoalIdx_ += 1; + permit_ = true; + } else { + ROS_ERROR("All goals are completed"); + permit_ = false; + } + } + + // command the goals cyclically + void MultiNaviGoalsPanel::cycleNavi() { + if (permit_) { + geometry_msgs::PoseStamped goal; + goal.header = pose_array_.header; + goal.pose = pose_array_.poses.at(curGoalIdx_ % pose_array_.poses.size()); + goal_pub_.publish(goal); + ROS_INFO("Navi to the Goal%lu, in the %dth cycle", curGoalIdx_ % pose_array_.poses.size() + 1, + cycleCnt_ + 1); + bool even = ((cycleCnt_ + 1) % 2 != 0); + QColor color_table; + if (even) color_table = QColor(255, 69, 0); else color_table = QColor(100, 149, 237); + poseArray_table_->item(curGoalIdx_ % pose_array_.poses.size(), 0)->setBackgroundColor(color_table); + poseArray_table_->item(curGoalIdx_ % pose_array_.poses.size(), 1)->setBackgroundColor(color_table); + poseArray_table_->item(curGoalIdx_ % pose_array_.poses.size(), 2)->setBackgroundColor(color_table); + curGoalIdx_ += 1; + cycleCnt_ = curGoalIdx_ / pose_array_.poses.size(); + } + } + + // cancel the current command + void MultiNaviGoalsPanel::cancelNavi() { + if (!cur_goalid_.id.empty()) { + cancel_pub_.publish(cur_goalid_); + ROS_ERROR("Navigation have been canceled"); + } + } + + // call back for listening current state + void MultiNaviGoalsPanel::statusCB(const actionlib_msgs::GoalStatusArray::ConstPtr &statuses) { + bool arrived_pre = arrived_; + arrived_ = checkGoal(statuses->status_list); +// if (arrived_) { ROS_ERROR("%d,%d", int(arrived_), int(arrived_pre)); } + if (arrived_ && arrived_ != arrived_pre && ros::ok() && permit_) { + if (cycle_) cycleNavi(); + else completeNavi(); + } + } + + //check the current state of goal + bool MultiNaviGoalsPanel::checkGoal(std::vector status_list) { + bool done; + if (!status_list.empty()) { + for (auto &i : status_list) { + if (i.status == 3) { + done = true; +// ROS_INFO("completed Goal%d", curGoalIdx_); + } else if (i.status == 4) { +// ROS_ERROR("Goal%d is Invalid, Navi to Next Goal%d", curGoalIdx_, curGoalIdx_ + 1); + return false; + } else if (i.status == 0) { + done = true; + } else if (i.status == 1) { + cur_goalid_ = i.goal_id; + done = false; + } else done = false; + } + } else { +// ROS_INFO("Please input the Navi Goal"); + done = false; + } + return done; + } + +// spin for subscribing + void MultiNaviGoalsPanel::startSpin() { + if (ros::ok()) { + ros::spinOnce(); + } + } + //读取目标点 + void MultiNaviGoalsPanel::load(const rviz::Config &config) { + Panel::load(config); + QString goal_number; + if (config.mapGetString("multi_goal_panel_number", &goal_number)) { + output_maxNumGoal_editor_->setText(goal_number); + updateMaxNumGoal(); + updatePoseTable(); + + QString goal_var; + if (config.mapGetString("multi_goal_panel_data", &goal_var)) { + QStringList goal_list = goal_var.split("|"); + for (int i = 0; i < goal_list.size(); i++) { + QStringList goal = goal_list.at(i).split(","); + + geometry_msgs::PoseStamped pose; + pose.header.frame_id = "map"; + pose.header.stamp = ros::Time::now(); + pose.pose.position.x = goal.at(0).toDouble(); + pose.pose.position.y = goal.at(1).toDouble(); + pose.pose.position.z = 0.0; + + pose.pose.orientation = tf::createQuaternionMsgFromYaw(goal.at(2).toDouble() / 180 * 3.14); + init_goal_pub_.publish(pose); + } + } + + bool cycle_flag; + if (config.mapGetBool("multi_goal_panel_cycle", &cycle_flag)) { + if (cycle_flag) { + cycle_checkbox_->setCheckState(Qt::CheckState::Checked); + } else { + cycle_checkbox_->setCheckState(Qt::CheckState::Unchecked); + } + checkCycle(); + } + + } + } + + //保存目标点 + void MultiNaviGoalsPanel::save(rviz::Config config) const { + Panel::save(config); + config.mapSetValue("multi_goal_panel_cycle", cycle_checkbox_->isChecked()); + if (!output_maxNumGoal_editor_->text().isEmpty()) { + int goal_number = output_maxNumGoal_editor_->text().toInt(); + if (goal_number > 0) { + config.mapSetValue("multi_goal_panel_number", goal_number); + + QString *goal_list = new QString(); + for (int i = 0; i < pose_array_.poses.size(); i++) { + for (int j = 0; j < 3; j++) { + goal_list->append(poseArray_table_->item(i, j)->text()); + if (j != 2) { + goal_list->append(","); + } + } + if (i != goal_number - 1) { + goal_list->append("|"); + } + } + + if (!goal_list->isEmpty()) { + config.mapSetValue("multi_goal_panel_data", *goal_list); + } + + } + } + } + +} // end namespace navi-multi-goals-pub-rviz-plugin + +// 声明此类是一个rviz的插件 + +#include + +PLUGINLIB_EXPORT_CLASS(navi_multi_goals_pub_rviz_plugin::MultiNaviGoalsPanel, rviz::Panel) + + +``` + + diff --git a/navigationKit/development/osIntro.md b/navigationKit/development/osIntro.md new file mode 100644 index 0000000..8aa2237 --- /dev/null +++ b/navigationKit/development/osIntro.md @@ -0,0 +1,256 @@ +# Autolabor M1 系统目录 + +## 简介 + +Autolabor M1 搭载的是 Autolabor 推出的Autolabor OS机器人操作系统,基于 ubuntu20.04 与 ROS Noetic 开发而成,包含 ROS Noetic 、常用 +ROS包(Cartographer、Gmapping、Navigation ···),机器人底盘与传感器驱动包,机器人仿真应用,以及激光SLAM导航、自动巡迹导航应用等。 + +解决了繁琐的 ROS 环境安装问题,节省时间成本,降低技术壁垒。使用该系统学习ROS、开发机器人、实现自己的算法,做一些有趣的事情。 + +秉持小而实用的原则,对原生的Ubuntu系统的功能模块进行了精简,在原有的基础上增加了ROS开发中使用到的常见功能包。 + +既保证了简洁性,又增加了实用性。按需构建,有非常良好的可扩展性。 + +OS在M1上已经实现了机器人自主导航(2D/3D SLAM 单目标/多目标)、RTK自动循迹、远程遥控等功能。 + +## 系统目录 + + +``` +catkin_ws +├── script //执行脚本 +├── src //源码 + +catkin_ws/src/driver/ +├── car +│ ├── autolabor_canbus_driver //PM1底盘驱动 +│ └── autolabor_pro1_driver //AP1/M1底盘驱动 +├── depth_camera +│ ├── zed_wrapper //ZED 相机驱动 +│ └── pico_zense_driver //Vzense DCAM710 相机驱动 +├── imu +│ ├── ah100b //ah100b,ah200c 惯导驱动 +│ ├── ch104m //ch104m IMU 驱动 +│ ├── rviz_imu_plugin //rviz 惯导可视化插件,显示惯导图像 +│ └── tl740d //tl740d 转角仪驱动 +├── lidar +│ ├── ldlidar_stl_ros //乐动19 雷达驱动 +│ ├── rslidar //速腾RS16、RS-Helios雷达驱动 +│ └── wr_fslidar // 砝石FS-D10 雷达驱动 +└── location + └── al_rtk_ros_driver // RTK570 接收机驱动 + └── marvelmind // marvelmind 定位标签驱动 + +catkin_ws/src/launch/ +├── autolabor_navigation_launch //导航launch +│ ├── launch +│ │ ├── real_environment //实车launch +│ │ │ ├── first_generation_base.launch //单雷达版本-传感器驱动 +│ │ │ ├── first_generation_mapping.launch //单雷达版本-建图 +│ │ │ ├── first_generation_navigation.launch //单雷达版本-导航 +│ │ │ ├── rtk_tracking_basic_base.launch//RTK版本-传感器驱动 +│ │ │ ├── rtk_tracking.launch //RTK版本-循迹 +│ │ │ ├── second_generation_advanced_base.launch //双雷达版本-传感器驱动(含定位标签) +│ │ │ ├── second_generation_basic_base.launch //双雷达版本-传感器驱动 +│ │ │ ├── second_generation_mapping.launch //双雷达版本-建图 +│ │ │ ├── second_generation_multigoal_navigation.launch //双雷达版本-多点导航 +│ │ │ ├── second_generation_navigation.launch //双雷达版本-导航 +│ │ │ ├── second_generation_tracking.launch //双雷达版本-循迹 +│ │ │ ├── third_generation_base.launch //多线雷达版本-传感器驱动 +│ │ │ ├── third_generation_cartographer_3d.launch //多线雷达版本-建图 +│ │ │ └── third_generation_navigation_3d.launch //多线雷达版本-导航 +│ │ └── simulated_environment //模拟器launch +│ │ ├── common_stage_simulation.launch //模拟场景地图 +│ │ ├── first_generation_base_simulation.launch +│ │ ├── first_generation_mapping_simulation.launch +│ │ ├── first_generation_navigation_simulation.launch +│ │ ├── second_generation_advanced_base_simulation.launch +│ │ ├── second_generation_basic_base_simulation.launch +│ │ ├── second_generation_driver_simulation.launch +│ │ ├── second_generation_mapping_simulation.launch +│ │ ├── second_generation_multicar_following_simulation.launch //多车跟随 +│ │ ├── second_generation_multicar_navigation_simulation.launch //多车导航 +│ │ ├── second_generation_multigoal_navigation_simulation.launch //多目标导航 +│ │ ├── second_generation_navigation_simulation.launch +│ │ └── second_generation_tracking_simulation.launch +│ ├── map //建图保存的地图文件 +│ │ ├── map_3d.pbstream //3d slam 地图文件,用于定位,不可修改(保存地图后生成) +│ │ ├── map_3d.pgm //3d slam 地图文件,用于导航,可修改(保存地图后生成) +│ │ ├── map_3d.yaml //map_3d.pgm 的解释文件(保存地图后生成) +│ │ ├── map.pbstream //2d slam 地图文件,用于定位导航,不可修改 +│ │ ├── map_simulation.pbstream //模拟器地图文件 +│ │ ├── simulation_stage.png //模拟器环境地图 +│ │ └── simulation_stage.yaml //simulation_stage.png 的解释文件 +│ ├── params //配置文件 +│ │ ├── cartographer +│ │ │ ├── first_generation_location.lua //单雷达版本-定位 +│ │ │ ├── first_generation_mapping.lua //单雷达版本-建图 +│ │ │ ├── map_builder.lua //cartographer 配置文件 +│ │ │ ├── map_builder_server.lua //cartographer 配置文件 +│ │ │ ├── pose_graph.lua //cartographer 配置文件 +│ │ │ ├── second_generation_location.lua //双雷达版本-定位 +│ │ │ ├── second_generation_mapping.lua //双雷达版本-建图 +│ │ │ ├── second_generation_multicar_location.lua //双雷达版本-多车定位(模拟器) +│ │ │ ├── third_generation_location.lua //多线雷达版本-定位 +│ │ │ ├── third_generation_mapping.lua //多线雷达版本-建图 +│ │ │ ├── trajectory_builder_2d.lua //cartographer 配置文件 +│ │ │ ├── trajectory_builder_3d.lua //cartographer 配置文件 +│ │ │ └── trajectory_builder.lua //cartographer 配置文件 +│ │ ├── common +│ │ │ ├── back_lidar_config.yaml //后雷达过滤配置文件 +│ │ │ └── front_lidar_config.yaml //前雷达过滤配置文件 +│ │ └── navigation +│ │ ├── costmap //代价地图配置文件 +│ │ │ ├── 3d_global_costmap_params.yaml //3d slam 全局代价地图 +│ │ │ ├── 3d_local_costmap_params.yaml //3d slam 局部代价地图 +│ │ │ ├── one_laser_global_costmap_params.yaml //单雷达版本-全局代价地图 +│ │ │ ├── one_laser_local_costmap_params.yaml //单雷达版本-局部代价地图 +│ │ │ ├── two_laser_global_costmap_params_for_tracking.yaml //双雷达版本-循迹-全局代价地图 +│ │ │ ├── two_laser_global_costmap_params.yaml //双雷达版本-全局代价地图 +│ │ │ └── two_laser_local_costmap_params.yaml //双雷达版本-局部代价地图 +│ │ ├── global_planer //全局规划配置文件 +│ │ │ ├── global_planner_params.yaml //用于导航 +│ │ │ ├── navfn_params.yaml //用于多车(模拟器) +│ │ │ └── tracking_planner_params.yaml //用于循迹 +│ │ ├── local_planer //局部规划配置文件 +│ │ │ ├── navigation_teb_local_planner_params.yaml //用于导航 +│ │ │ └── tracking_teb_local_planner_params.yaml //用于循迹 +│ │ └── move_base //ROS Navigation 配置文件 +│ │ ├── navigation_move_base.yaml //用于导航 +│ │ └── tracking_move_base.yaml //用于循迹 +│ └── rviz //rviz配置文件 +│ ├── 3d_mapping.rviz //3d slam-建图 +│ ├── 3d_navigation.rviz //3d slam-导航 +│ ├── first_generation_create_map.rviz //单雷达版本-建图 +│ ├── first_generation_navigation.rviz //单雷达版本-导航 +│ ├── second_generation_create_map.rviz //双雷达版本-建图 +│ ├── second_generation_multicar_navigation.rviz //双雷达版本-多车导航(模拟器) +│ ├── second_generation_multigoal_navigation.rviz //双雷达版本-多点导航 +│ ├── second_generation_navigation.rviz //双雷达版本-导航 +│ └── second_generation_tracking.rviz //双雷达版本-循迹 +└── autolabor_test_launch //测试 + ├── launch + │ ├── car_test.launch //键盘遥控 + │ ├── 2dlidar_test.launch //单线激光雷达测试 + │ ├── 3dlidar_test.launch //多线激光雷达测试 + │ ├── imu_test.launch //惯导测试 + │ ├── kinect2_test.launch //深度相机测试 + │ ├── robot_calibration.launch //AP1标定 + │ └── rtk_test.launch //RTK测试 + │ └── tag_test.launch //定位标签测试 + └── rviz //rviz配置文件 + ├── 3dlidar.rviz //多线激光雷达测试 + ├── car.rviz //键盘遥控 + ├── fslidar.rviz //单线雷达测试 + ├── robot_calibration.rviz //AP1标定 + └── rtk_test.rviz //RTK测试 + └── tag.rviz //定位标签测试 + + +catkin_ws/src/mapping/ //建图源码 +├── cartographer //cartographer GPU 加速版本 +├── cartographer_ros//cartographer算法源码-适配ROS + + + +catkin_ws/src/navigation/ //ROS Navigation 源码 +├── amcl //粒子滤波定位 +├── base_local_planner //局部规划 +├── carrot_planner //全局规划 +├── clear_costmap_recovery //恢复行为 +├── costmap_2d //障碍物地图 +├── dwa_local_planner //dwa局部规划 +├── fake_localization //OS中未使用 +├── global_planner //全局规划 +├── location_fusion //定位融合(定位标签/RTK+里程计) +├── loop_path_planner //循迹全局规划 +├── map_server //地图服务 +├── move_base //movebase +├── move_slow_and_clear //恢复行为 +├── multi_car_goal //多车-前车向后车发目标(模拟器) +├── nav_core //导航核心接口 +├── navfn //全局规划 +├── navigation //ROS Navigation元 +├── path_rviz_plugin //循迹rviz插件,功能按钮组 +├── path_server //用于循迹中录制路线 +│ ├── path_data +│ │ ├── default_path.path //循迹中保存的路径数据 +├── record_path_planner //循迹全局规划 +├── rotate_recovery //恢复行为 +├── teb_local_planner //局部规划 +└── voxel_grid //用于障碍物地图 + + +catkin_ws/src/simulation/ //模拟器 +├── autolabor_description //机器人模型 +│ ├── launch +│ │ ├── display_autolabor_mini.launch +│ │ └── display_autolabor_pro1.launch +│ ├── meshes +│ │ ├── autolabor_mini.stl +│ │ ├── pro1_body_color.dae //AP1模型文件-主体 +│ │ └── pro1_wheel_color.dae //AP1模型文件-轮子 +│ ├── rviz +│ │ └── urdf.rviz +│ └── urdf +│ ├── autolabor_mini.urdf +│ ├── second_generation_model.xacro //双雷达版本-机器人描述(类似urdf) +│ └── third_generation_model.xacro //多线雷达版本-机器人描述(类似urdf) +├── autolabor_simulation_base //机器人底盘模拟 +├── autolabor_simulation_lidar //雷达模拟 +├── autolabor_simulation_location //定位标签模拟 +├── autolabor_simulation_object //运动物体模拟 +└── autolabor_simulation_stage //场景模拟 + + +catkin_ws/src/tool/ +├── autolabor_keyboard_control //键盘控制(必须要插实体键盘) +├── cartographer_initialpose //cartographer初始化定位 +├── laser_proc //雷达驱动 +├── joy_to_twist //手柄转速度驱动包 +├── navi_multi_goals_pub_rviz_plugin //rviz插件-多点导航 +├── rviz_autolabor_calibration //rviz插件-AP1标定 +├── rviz_keyboard_twist //rviz插件-键盘控制 +└── rviz_navigation_tools //rviz插件-多车导航工具,切换机器人(模拟器) + + + +script //执行脚本 +├── 3d_suit //多线雷达版本 +│ ├── create_map_start +│ ├── create_map_stop +│ ├── navigation_start +│ └── navigation_stop +├── box_suit //单雷达版本 +│ ├── create_map_start +│ ├── create_map_stop +│ ├── navigation_start +│ └── navigation_stop +├── common +│ ├── add_keyboard_udev //用于键盘控制,加键盘权限 +│ └── rebuild //工作空间编译脚本 +├── simulation //模拟器 +│ ├── create_map_start +│ ├── create_map_stop +│ ├── navigation_start +│ ├── navigation_stop +│ ├── tracking_start +│ └── tracking_stop +├── test //测试 +│ ├── car_test +│ ├── fslidar_test +│ ├── imu_test +│ ├── kinect2_test +│ ├── pico_test +│ ├── robot_calibration +│ ├── rplidar_test +│ ├── rslidar_test +│ └── tag_test +└── track_suit //双雷达版本 + ├── create_map_start + ├── create_map_stop + ├── navigation_start + ├── navigation_stop + ├── tracking_start //开始循迹 + └── tracking_stop //停止循迹 +``` diff --git a/navigationKit/development/rtkintro.md b/navigationKit/development/rtkintro.md new file mode 100644 index 0000000..ba4e0ae --- /dev/null +++ b/navigationKit/development/rtkintro.md @@ -0,0 +1,100 @@ +# RTK循迹 + +## 目录 + +* 功能介绍 +* 传感器介绍 +* 实现原理 + +## 功能介绍 + +RTK循迹是机器人循着用户提前录好的轨迹自主行走,行走过程中机器人能够自动躲避障碍物,自动规划路线,达到目标点。 + +RTK循迹要求配置好RTK接收机,然后控制车端完成循迹。 + +RTK接收机的数据与里程计的数据融合定位,得到M1在环境中的坐标点,控制M1运动,边走边记录当前坐标点的位置,将这些坐标点记录为文件保存下来,得到路径文件。 + +在开始循迹的时候,程序加载路径文件,RTK接收机定位数据与里程计融合定位匹配路径数据,机器人按照指定路径行走。 + +## 传感器介绍 + +RTK循迹 用到的传感器有: + + +* 单线激光雷达x2,安装在M1车内前后底部 +* RTK接收机,安装在M1套件内 +* 编码器/轮速里程计x2,安装在车体内部前侧 +* 电机x2,安装在车体内部中间位置 + +![](imgs/rtk_intro_1.png) + + +## 实现原理 + + + +![](imgs/rtk_intro_2.png) + +| 步骤 | 输入数据 | 操作 | 输出数据 | 使用ROS包 | +|-----|------------------|--------------------------------------------|----------------|-------------------------------------------------------------------------------------------------------| +| 1 | | RTK接收机 | 定位数据 | marvelmind驱动包(catkin_ws\src\driver\location\al_rtk_ros_driver) | +| 2 | 里程计数据 定位数据 | 定位融合 | 当前机器人在环境中的位姿 | location_fusion(catkin_ws\src\navigation\location_fusion) | +| 3 | 当前机器人位姿 | 控制机器人运动,录制路径 | 路径数据 | path_server(catkin_ws\src\navigation\path_server) | +| 4 | 路径数据 | 读取录制的路径数据,执行循迹操作 | 目标机器人位姿 | path_server(catkin_ws\src\navigation\path_server) [move_base](http://wiki.ros.org/move_base/) | +| 5 | 当前机器人位姿 目标机器人位姿 | 根据机器人当前位姿,进行全局规划路线 | 路径数据(初步预估导航路线) | [global_planner(dijkstra) ](http://wiki.ros.org/global_planner) | +| 6 | 路径数据 前雷达数据 后雷达数据 | 根据规划路径开始导航,进行过程中随着实际环境、障碍物变化,进行局部路径规划,实时避障 | 局部路径规划 避障 | [costmap_2d ](http://wiki.ros.org/cost_map)[teb_local_planner](http://wiki.ros.org/teb_local_planner) | +| 7 | 速度信息 /cmd_vel | 向底层发送速度命令 | | [move_base](http://wiki.ros.org/move_base/) | + +定位循迹 launch配置示例 + +``` + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +``` diff --git a/navigationKit/development/slamintro.md b/navigationKit/development/slamintro.md new file mode 100644 index 0000000..d2a1add --- /dev/null +++ b/navigationKit/development/slamintro.md @@ -0,0 +1,246 @@ +# 激光SLAM + +## 目录 + +* SLAM介绍 +* 基于激光SLAM的机器人自主导航 +* Autolabor M1 SLAM 导航功能详解 + * 2D SLAM 实现原理 + * 3D SLAM 实现原理 + + +## SLAM介绍 + +**SLAM**,全称是 Simultaneous Localization and Mapping,同时定位与地图构建。 + +SLAM 技术解决的是,我在哪里?(**定位**Localization )我周围是什么样?(**建图**Mapping)这两个问题。 + +移动设备从未知环境中的某一点开始运动,根据传感器获取到的数据,即时计算获取传感器的位置并绘制周围的环境。 + +![](imgs/slamintro1.jpg) + +SLAM 的应用很广泛,有扫地机器人、无人驾驶汽车、无人机,三维场景重建等。 + +根据使用传感器不同,SLAM的可分为激光SLAM和视觉SLAM(VSLAM),本文介绍的是激光SLAM,对视觉SLAM相关知识感兴趣的可以[看这里](/usedoc/navigationKit2/version_two/development/vslamintro)。 + + +## 基于激光SLAM的机器人自主导航 + +激光SLAM导航,指的是使用激光雷达采集的数据进行建图与定位(SLAM),并在构建的环境地图中自动导航(规划+控制)。 + +![](imgs/slamintro2.png) + +地图构建完成后,给出目标点,根据当前位置信息与已知环境地图规划出可行走路径,控制机器人运动,最终达到目标点。 + +![](imgs/slamintro3.png) + +以上只是简单概述了机器人导航的流程,但 SLAM 与 路径规划/Planning 都是很复杂的内容,在此不做过多的探讨。 + + +## Autolabor M1 SLAM 导航功能详解 + +Autolabor SLAM 导航使用的是谷歌开源的 [Cartographer](https://github.com/googlecartographer/cartographer_ros),支持多平台和传感器配置,提供2D和3D实时同步定位与建图,使用回环检测消除建图产生的累积误差,建图效果更好,在国内外众多机器人应用上得到了广泛使用。 + +> Cartographer is a system that provides real-time simultaneous localization and mapping (SLAM) in 2D and 3D across multiple platforms and sensor configurations. + + +![](imgs/slamintro4.gif) + + + +### 2D SLAM 实现原理 + + +#### 传感器介绍 + +2D SLAM 用到的传感器有: + + +* 单线激光雷达x2,安装在M1内部前后位置 +* 编码器/轮速里程计x2,安装在车体内部前侧 + + +![](imgs/software_intro_6.png) + +#### 2D SLAM 建图 + +![](imgs/software_intro_1.jpg) + +| 步骤 | 输入数据 | 操作 | 输出数据 | 使用ROS包 | +|-----|------------------|--------------------------------------------|----------------|-------------------------------------------------------------------------------------------------------| +|1 | 左编码器数据 右编码器数据 | 使用运动模型计算编码器数据,得到符合ROS标准的里程计数据| 里程计数据| [autolabor_pro_driver](http://www.autolabor.com.cn/usedoc/ap1/sendCommand)| +|2 | 前雷达数据 后雷达数据 | 过滤并融合前后激光雷达采集的数据,得到机器人周围环境点云数据| 雷达点云数据 | [cartographer_ros](https://google-cartographer-ros.readthedocs.io/en/latest/) [laser_filters](http://wiki.ros.org/laser_filters) | +|3 | 里程计数据 点云数据 | 点云匹配| 相对位姿数据 子地图数据 | [cartographer_ros](https://google-cartographer-ros.readthedocs.io/en/latest/)| +|4 | 相对位姿数据 子地图数据 | 回环检测,得到子地图拼接的全地图数据 | 地图数据 | [cartographer_ros](https://google-cartographer-ros.readthedocs.io/en/latest/)| + + +Cartographer 2D 建图 launch配置示例 + +``` + + + + + + + + +``` + +#### 2D SLAM 导航 + +![](imgs/software_intro_2.jpg) + +| 步骤 | 输入数据 | 操作 | 输出数据 | 使用ROS包 | +|-----|------------------|--------------------------------------------|----------------|-------------------------------------------------------------------------------------------------------| +|1 | 左编码器数据 右编码器数据 | 使用运动模型计算编码器数据,得到符合ROS标准的里程计数据| 里程计数据| [autolabor_pro_driver](http://www.autolabor.com.cn/usedoc/ap1/sendCommand)| +|2|前雷达数据 后雷达数据 里程计数据 地图数据|将机器人的实时数据与已构建的地图进行匹配|当前机器人在环境中的位姿| [cartographer_ros](https://google-cartographer-ros.readthedocs.io/en/latest/)| +|3| 目标机器人位姿| 给机器人制定一个目标点| |[move_base](http://wiki.ros.org/move_base/)| +|4| 当前机器人位姿 地图数据 目标机器人位姿| 根据机器人当前位姿与地图数据,进行全局规划路线| 路径数据(初步预估导航路线) |[global_planner(dijkstra) ](http://wiki.ros.org/global_planner)| +|5| 路径数据 地图数据 前雷达数据 后雷达数据 | 根据规划路径开始导航,进行过程中随着实际环境、障碍物变化,进行局部路径规划,实时避障| 局部路径规划 避障 |[costmap_2d ](http://wiki.ros.org/cost_map)[teb_local_planner](http://wiki.ros.org/teb_local_planner)| +|6| 速度信息 /cmd_vel | 向底层发送速度命令 | |[move_base](http://wiki.ros.org/move_base/)| + +说明: + + 1. move_base, global_planner(dijkstra), costmap_2d 这些功能包(package)都从属于 + Navigation 导航这个大的功能包集,teb_local_planner 是navigation包的一个插件。 + 2. 机器人导航过程中,会按照周围环境、实时障碍物做调整不断规划调整路径,向底层发布指令,步骤五和六是一个多次的过程,并非一次就结束了。 + +Cartographer 2D 导航 launch配置示例 + +``` + + + + + + + + + + + + + + + + + + + + + +``` + + + +### 3D SLAM 实现原理 + + +#### 传感器介绍 + +3D SLAM 用到的传感器有: + +* 多线激光雷达,安装在M1套件内 +* 单线激光雷达x2,安装在M1内部前后位置 +* 编码器/轮速里程计x2,安装在车体内部前侧 +* 惯导,安装在M1套件内 + + + +![](imgs/software_intro_7.png) + +#### 3D SLAM 建图 + +![](imgs/software_intro_4.jpg) + +| 步骤 | 输入数据 | 操作 | 输出数据 | 使用ROS包 | +|-----|------------------|--------------------------------------------|----------------|-------------------------------------------------------------------------------------------------------| +|1 | 左编码器数据 右编码器数据 | 使用运动模型计算编码器数据,得到符合ROS标准的里程计数据| 里程计数据| [autolabor_pro_driver](http://www.autolabor.com.cn/usedoc/ap1/sendCommand)| +|2 | 多线雷达数据 惯导数据 里程计数据 | 点云匹配| 相对位姿数据 子地图数据 | [cartographer_ros](https://google-cartographer-ros.readthedocs.io/en/latest/)| +|3 | 相对位姿数据 子地图数据 | 回环检测,得到子地图拼接的全地图数据 | 地图数据 | [cartographer_ros](https://google-cartographer-ros.readthedocs.io/en/latest/)| + + + +Cartographer 3D 建图 launch配置示例 + +``` + + + + + + + + +``` + +#### 3D SLAM 导航 + +![](imgs/software_intro_5.jpg) + +| 步骤 | 输入数据 | 操作 | 输出数据 | 使用ROS包 | +|-----|------------------|--------------------------------------------|----------------|-------------------------------------------------------------------------------------------------------| +|1 | 左编码器数据 右编码器数据 | 使用运动模型计算编码器数据,得到符合ROS标准的里程计数据| 里程计数据| [autolabor_pro_driver](http://www.autolabor.com.cn/usedoc/ap1/sendCommand)| +|2|多线雷达数据 惯导数据 里程计数据 地图数据|将机器人的实时数据与已构建的地图进行匹配|当前机器人在环境中的位姿| [cartographer_ros](https://google-cartographer-ros.readthedocs.io/en/latest/)| +|3| 目标机器人位姿| 给机器人制定一个目标点| |[move_base](http://wiki.ros.org/move_base/)| +|4| 当前机器人位姿 地图数据 目标机器人位姿| 根据机器人当前位姿与地图数据,进行全局规划路线| 路径数据(初步预估导航路线) |[global_planner(dijkstra) ](http://wiki.ros.org/global_planner)| +|5| 路径数据 地图数据 前雷达数据 后雷达数据 多线雷达数据 | 根据规划路径开始导航,进行过程中随着实际环境、障碍物变化,进行局部路径规划,实时避障| 局部路径规划 避障 |[costmap_2d ](http://wiki.ros.org/cost_map)[teb_local_planner](http://wiki.ros.org/teb_local_planner)| +|6| 速度信息 /cmd_vel | 向底层发送速度命令 | |[move_base](http://wiki.ros.org/move_base/)| + +说明: + + 1. move_base, global_planner(dijkstra), costmap_2d 这些功能包(package)都从属于 + Navigation 导航这个大的功能包集,teb_local_planner 是navigation包的一个插件。 + 2. 机器人导航过程中,会按照周围环境、实时障碍物做调整不断规划调整路径,向底层发布指令,步骤五和六是一个多次的过程,并非一次就结束了。 + + +Cartographer 3D 导航 launch配置示例 + +``` + + + + + + + + + + + + + + + + + + + + + + + +``` \ No newline at end of file diff --git a/navigationKit/development/vslamintro.md b/navigationKit/development/vslamintro.md new file mode 100644 index 0000000..0303983 --- /dev/null +++ b/navigationKit/development/vslamintro.md @@ -0,0 +1,106 @@ +# 视觉SLAM + +>本文主要对SLAM技术进行介绍,叙述了VSLAM的框架及关键技术和方法,并总结了目前已有的VSLAM系统和相关资料。 + +## 目录 + +1. SLAM技术介绍 +2. VSLAM系统及相关资料介绍 +3. SLAM框架 + 1. SLAM的基本过程 + 2. VSLAM的主要模块 + + +## 1.SLAM技术介绍 + +**SLAM**,全称是Simultaneous Localization and Mapping,即**同时定位与建图**,指机器人在自身位置不确定的条件下,在完全未知环境中创建地图,同时利用地图进行自主定位和导航。因此可知SLAM的主要工作是**定位**以及**建图**。 + + +![](./imgs/slamintro1.jpg) + +目前SLAM有很多实现方法,根据使用传感器不同,主要分为: + +**(1)激光雷达传感器;** +**(2)视觉传感器;** + +**视觉SLAM**(Visual SLAM 简称VSLAM)包括使用**单目SLAM**、**双目SLAM**和以**Kinect**为代表的深度摄像头的**RGB-D SLAM**。相比使用激光雷达传感器,视觉传感器的成本更低,因此也越来越受青睐。 + +目前SLAM被广泛应用于无人驾驶汽车、无人机、VR和AR等领域。 + +下面是宾大的教授kumar做的特别有名的一个demo,是在无人机上利用二维激光雷达做的SLAM。 + +![](./imgs/vslam1.gif) + +## 2.VSLAM系统及相关资料介绍 + +目前在VSLAM领域实现较好的SLAM系统有: + +- 单目、双目SLAM: + +(1).**PTAM**(Parallel Tracking And Mapping):2007年很流行的SLAM项目,是**第一个**使用BA完成**实时SLAM**的系统。但其缺乏**回环检测和重定位等功能**,只能作用于小规模的场景,且稳定性也不是很高。(http://www.robots.ox.ac.uk/~gk/PTAM/) + +(2).**DTAM**(Dense tracking and mapping in real-time):2011年,Direct SLAM方法的**鼻祖**; + +(3).**LSD-SLAM**(Large-Scale Direct Monocular SLAM):2014年一个半稠密SLAM系统。(http://vision.in.tum.de/research/vslam/lsdslam) + +(4).**ORB-SLAM**:2015年一个比较完整的基于特征点的SLAM系统。 +(http://webdiis.unizar.es/~raulmur/orbslam/) + +- RGB-D SLAM: + +(1).**KinectFusion** 2011 +(http://www.microsoft.com/en-us/research/project/kinectfusion-project-page/) + +(2).**RGBD-SLAM2** 2014 (http://felixendres.github.io/rgbdslam_v2/) + +(3).**ElasticFusion** 2015 (http://www.imperial.ac.uk/dyson-robotics-lab/downloads/elastic-fusion/) + +当然除了上述项目的学习外,对于slam的学习入门,有一些经典教材如: +**Multiple View Geometry in Computer Vision (Second Edition)** +(http://www.robots.ox.ac.uk/~vgg/hzbook/)也有中文版为《计算机视觉中的多视图几何》。 + +**Robotics Vision and Control**(http://www.petercorke.com/RVC/) 本书是面向实践的,详细介绍了机器人和机器视觉。也有了中文版,叫做《机器人学、机器视觉与控制》。 +此外,对于slam入门学习推荐高博的**一起做RGB-D SLAM**其博客为半闲居士(http://www.cnblogs.com/gaoxiang12/p/4633316.html) + +## 3.SLAM框架 + +### 3.1 SLAM的基本过程 + +描述为:机器人在未知环境中从一个未知位置开始移动,在移动过程中根据位置估计和传感器数据进行自身定位,同时建造增量式地图。 + +(1)**定位(localization)**:机器人必须知道自己在环境中位置。 + +(2)**建图(mapping)**:机器人必须记录环境中特征的位置(如果知道自己的位置) + +(3)**SLAM**:机器人在定位的同时建立环境地图。其基本原理是运过概率统计的方法,通过多特征匹配来达到定位和减少定位误差的。 + +![](./imgs/vslam2.png) + +### 3.2 VSLAM的主要模块 + + 视觉SLAM主要分为几个模块:**数据采集、视觉里程计(Visual Odometry)、后端优化、建图(Mapping)、闭环检测(Loop closure detection)**。如下图所示: + +![](./imgs/vslam3.png) + +#### 3.2.1 视觉里程计 + +视觉里程计是利用一个图像序列或者一个视频流,计算摄像机的方向和位置的过程。一般包括图像获取后、畸变校正、特征检测匹配或者直接匹配对应像素、通过对极几何原理估计相机的旋转矩阵和平移向量。 + + +![](./imgs/vslam4.jpg) + +#### 3.2.2 后端优化 + +理论上来说,如果视觉里程计模块估计的相机的旋转矩阵R和平移向量t都正确,就能得到完美的定位和建图了。但实际试验中,我们得到的数据往往有很多噪声,且由于传感器的精度、错误的匹配等,都对造成结果有误差。并且由于我们是只把新的一帧与前一个关键帧进行比较,当某一帧的结果有误差时,就会对后面的结果产生**累计误差**,导致误差越来越大。**为了解决这个问题,引入后端优化**。 + +后端优化一般采用捆集调整(BA)、卡尔曼滤波(EKF)、图优化等方式来解决。其中**基于图优化的后端优化**,效果最好。Graph-based SLAM一般使用g2o求解器,进行图优化计算。 + +![](./imgs/vslam5.jpg) + +#### 3.2.3 闭环检测 + +后端优化可能得到一个比较优的解,但当运动回到某一个之前去过的地方,如果能认出这个地方,找到并与当时的关键帧进行比较,就可以得到比单用后端优化更准确更高效的结果。闭环检测就是要解决这个问题。 + +闭环检测有两种方式,一是根据估计出来的相机的位置,看是否与之前否个位置邻近;**另外一种是根据图像,自动识别出来这个场景之前到过,并找到当时的关键帧**。目前常用的后一种方法,其实是一个非监督的模式识别问题。比较常用的方法是采用Bag-of-Words(BOW),**ORB-SLAM**就是使用这个方法来进行**闭环检测**。 + +![](./imgs/vslam6.jpg) diff --git a/navigationKit/development/yolo.md b/navigationKit/development/yolo.md new file mode 100644 index 0000000..6c13a2e --- /dev/null +++ b/navigationKit/development/yolo.md @@ -0,0 +1,45 @@ +## YOLO V5 +## 简介 +YOLOv5 是革命性的“You Only Look Once”物体检测模型的第五次迭代,旨在实时提供高速、高精度的结果。 + +这个强大的深度学习框架基于 PyTorch 构建,因其多功能性、易用性和高性能而广受欢迎。我们的文档将指导您完成安装过程,解释模型的架构细微差别,展示各种用例,并提供一系列详细的教程。这些资源将帮助您在计算机视觉项目中充分发挥 YOLOv5 的潜力。让我们开始吧! + +![](imgs/yolo.jpeg) + +## 教程 + +这是综合教程的汇编,将指导您了解 YOLOv5 的不同方面。 + +[快速入门](https://docs.ultralytics.com/yolov5/quickstart_tutorial/) + +[训练自定义数据](https://docs.ultralytics.com/yolov5/tutorials/train_custom_data/) 推荐:了解如何在自定义数据集上训练 YOLOv5 模型。 + +[获得最佳训练结果的技巧](https://docs.ultralytics.com/yolov5/tutorials/tips_for_best_training_results/):发现优化模型训练过程的实用技巧。 + +[多 GPU 训练](https://docs.ultralytics.com/yolov5/tutorials/multi_gpu_training/):了解如何利用多个 GPU 来加快训练速度。 + +[PyTorch Hub](https://docs.ultralytics.com/yolov5/tutorials/pytorch_hub_model_loading/):学习通过 PyTorch Hub 加载预训练模型。 + +[TFLite、ONNX、CoreML、TensorRT 导出](https://docs.ultralytics.com/yolov5/tutorials/model_export/):了解如何将模型导出为不同的格式。 + +[NVIDIA Jetson 平台部署](https://docs.ultralytics.com/yolov5/tutorials/running_on_jetson_nano/):了解如何在 NVIDIA Jetson 平台上部署 YOLOv5 模型。 + +[测试时间增强 (TTA)](https://docs.ultralytics.com/yolov5/tutorials/test_time_augmentation/):探索如何使用 TTA 来提高模型的预测准确性。 + +[模型集成](https://docs.ultralytics.com/yolov5/tutorials/model_ensembling/):学习组合多个模型以提高性能的策略。 + +[模型剪枝/稀疏性](https://docs.ultralytics.com/yolov5/tutorials/model_pruning_and_sparsity/):了解剪枝和稀疏性概念,以及如何创建更有效的模型。 + +[超参数演化](https://docs.ultralytics.com/yolov5/tutorials/hyperparameter_evolution/):探索自动超参数调整的过程,以获得更好的模型性能。 + +[使用冻结层进行迁移学习](https://docs.ultralytics.com/yolov5/tutorials/transfer_learning_with_frozen_layers/):了解如何通过冻结 YOLOv5 中的层来实现迁移学习。 + +[架构总结](https://docs.ultralytics.com/yolov5/tutorials/architecture_description/) 深入研究 YOLOv5 模型的结构细节。 + +[Roboflow数据集](https://docs.ultralytics.com/yolov5/tutorials/roboflow_datasets_integration/):了解如何利用 Roboflow 进行数据集管理、标记和主动学习。 + +[ClearML 日志记录](https://docs.ultralytics.com/yolov5/tutorials/clearml_logging_integration/) :了解如何集成 ClearML 以在模型训练期间进行高效日志记录。 + +[YOLOv5 与 Neural Magic](https://docs.ultralytics.com/yolov5/tutorials/neural_magic_pruning_quantization/):了解如何使用 Neural Magic 的 Deepsparse 来修剪和量化您的 YOLOv5 模型。 + +[Comet 日志记录](https://docs.ultralytics.com/yolov5/tutorials/comet_logging_integration/) 新功能:探索如何利用 Comet 改进模型训练日志记录。 diff --git a/navigationKit/deviceInfo/doc.md b/navigationKit/deviceInfo/doc.md new file mode 100644 index 0000000..1ea60b7 --- /dev/null +++ b/navigationKit/deviceInfo/doc.md @@ -0,0 +1,119 @@ +# 规格参数 + +## 上位机(Orin NX) +| 项目 | 规格 | +|-----|-----------| +|算力 | 100TOPS | +|GPU | 32个Tensor核心1024核 | +|CPU|8核Arm Cortex-A78 2GHz| +|内存|16GB 128位LPDDR5 102.4GB/s| +|存储|128GB| +|视频编解码|H.265| +|PCIe|1X4+3X1 PCIe4.0| +|显示接口|HDMI2. 1 1x8K30DP| +|网卡|内置| +|I/O|USB3.0/SCI/I2C/CAN/DMIC/ DSPK/I2S/GPIOs| + + +## 显示器 + +| 项目 | 规格 | +|-----|-----------| +| 尺寸 | 13.3 英寸 | +| 比例 | 16: 9 | +| 分辨率 | 1920*1080 | +| 亮度 | 300 cd/m² | +| 对比度 | 800: 1 | +| 触摸 | 否 | + +##多线激光雷达(RS-Helios-16p) + +| 项目 | 规格 | +|----------|--------------------------| +| 线数 | 16 | +| 激光波长 | 905nm | +| 激光安全等级 | Class 1 人眼安全 | +| 测距能力 | 150m(90m@10% NIST) | +| 盲区 | ≤0.2m | +| 精度(典型值) | ±2cm(1m to 100m)
±3cm(0.1m to 1m)
±3cm(100m to 150m) | +| 水平视场角 | 360° | +| 垂直视场角 | 30°(-15°~+15°) | +| 水平角分辨率 | 0.2°/0.4° | +| 垂直角分辨率 | 均匀 2° | +| 帧率 | 10Hz/20 Hz | +| 转速 | 600/1200rpm (10/20Hz) | +| 出点数 | ~288,000pts/s(单回波)
~576,000pts/s(双回波) | +| UDP数据包内容 | 三维空间坐标
反射强度
时间戳等 | +| 输出数据协议 | UDP packets over Ethernet | +| 时间同步 | ≈ GPRMC with 1PPS,PTP&gPTP | + +##卫星接收机(RTK580) + +| 项目 | 规格 | +|----------|--------------------------| +| 通道 | 1408 通道 | +| 频点 | 5星多频
BDS、GPS、QZSS、GLONASS、Galileo | +| 单点定位 (RMS) | 平面 1.5m 高程 2.5m | +| RTK(RMS) |平面 0.8cm+1ppm ;高程 1.5cm+1ppm | +| 冷启动 |<30s | +| RTK 初始化时间 | <5s( 典型值 ) | +| 初始化可靠性 | >99.9% | +|差分通讯方式| 免DTU模块| +| 差分数据 | RTCM 3.X | +| 数据格式 | NMEA 0183 Unicore | +| 定位测向数据更新率 | 20Hz | +| 原始观测量数据更新率 | 20Hz | +| 定向精度 (RMS) | 0.1° /1m 基线 | +| 时间精度 (RMS) |20ns | +| 速度精度 (RMS) | 0.03m/s | +| 双天线接口 | SMA公头外螺内孔 * 2 | +| 通讯接口 | USB-Type-C | +| 供电接口 | USB-Type-C/XT-30 | +| 供电电压 | 5-15V | +| 功耗 |2.4W | +| 尺寸 | 93mmx69mmx37mm | +| 重量 | 153g | + +##惯导(CH104M) +| 项目 | 规格 | +|----------|--------------------------| +|姿态角 | 横滚/俯仰:0.2°
偏航(静态):0.2°°
偏航(动态):3° | +|陀螺仪 |测量范围:±2000°/s
分辨率:0.01°/s
零偏稳定性:1.76°/hr | +|加速度计|测量范围:±8G
分辨率:1uG
零偏稳定性:30uG | +|磁传感器|测量范围:±8G(Gauss)
非线性度:±0.1%
分辨率:0.25mG| + +## 激光雷达(LD19) + + +| 参数名称 | 单位 | 最小值 | 典型值 | 最大值 | 备注 | +|:------|:-----|:------|:-----|:----|:-----------------------------------------| +| 测距范围 | m | 0.02 | - | 12 | 70%目标反射率 | +| 扫描频率 | Hz | 5 | 10 | 13 | 外部提供PWM 控速 | +| 测距频率 | Hz | - | 4500 | - | 固定频率 | +| 测距精度 | mm | - | - | - | 测距小于0.3m时,有数据输出。
测距数据变化趋势与实际距离变化趋势一致 | +| 测距精度 | m | -45 | - | 45 | 测距范围在300mm到12000mm时,测量100次的平均值(70%漫反射面) | +| 测距标准差 | mm | - | 10 | - | 测距范围在300mm到12000mm时 | +| 测量分辨率 | mm | - | 15 | - | | +| 角度误差 | ° | - | - | 2 | | +| 角度分辨率 | ° | - | 1 | - | | +| 抗环境光 | KLux | - | - | 30 | | +| 整机寿命 | h | 10000 | - | - | | + + + +## 深度相机(Vzense DCAM710) + +| 项目 | 规格 | +|----------|--------------------------| +| 尺寸 | 103mmx33mmx22mm | +| 传感器 | ToF CCD+RGB | +| 激光发射器 | 940nm VCSEL | +| ToF分辨率帧率 | 640X480, Max.30fps | +| RGB分辨率帧率 | 1920X1080, 30fps | +| ToF FOV | 69°(H) × 51°(V) | +| RGB FOV | 73°(H)X42°(V) | +| 输出格式 | RAW12(深度,IR), MJPEG(RGB) | +| 检测距离 | 0.35m~4.4m | +| 工作温度 | -10℃~50℃ | + + diff --git a/navigationKit/quickStart/2dSlam.md b/navigationKit/quickStart/2dSlam.md new file mode 100644 index 0000000..2be8319 --- /dev/null +++ b/navigationKit/quickStart/2dSlam.md @@ -0,0 +1,131 @@ +# 建图导航 + + + +## 操作步骤 + +### 一、连接键鼠 +鼠标键盘建议使用普通成套的无线键鼠,避免使用机械键盘、游戏鼠标,请不要同时使用有线、无线鼠标或键盘。 + +### 二、启动系统 +打开电源,打开工控机,等待 Autolabor OS 系统启动,输入密码 autolabor,字母全部是小写,回车。 + +![](imgs/login.png) + +### 三、建图导航 + + +#### 准备工作: +1. 将 M1 控制模式切换到上位机控制,右转打开急停开关,确保急停开关没有被按下 +2. 禁用工控机无线功能 + 在建图过程中,如果工控机连接了无线网络,当M1走出无线网络的覆盖区域后,网络连接会自动断开,这将导致M1控制失控,所以在开始建图之前,为了避免失控,需要将工控机的无线网络连接关闭。 +3. 进入桌面 SLAM建图导航 - > 2d 文件夹,首次使用时文件如下图,双击打开后点击 trust and launch,程序第一次打开后会重命名。 + + ![](imgs/slam-8.png) + + ![](imgs/slam-9.png) + + +#### 1. 点击【开始建图】 + + +RVIZ工具打开,能够看到地图中的 M1。 + +使用键盘的上下左右控制 M1 行走,边走边建图,可以看到环境地图随着 M1 的行走不断被构建更新。 + +地图中,红色是前置激光雷达实时数据,黄色是后置激光雷达实时数据,颜色从白至黑为障碍物的几率是0%~100%。 + +![](imgs/slam-3.png) + + +##### 键盘控制说明 + +键盘控制功能在系统中已经安装好,无需安装可直接使用。 + +有2种键盘控制的方式: + +一、直接在电脑上插上键鼠,直接控制机器人(默认模式) + +数字键【1/2】线速度增加/减少,数字键【3/4】角速度增加/减少,数字键【9】启用,数字键【0】禁用。 + +二、使用键盘插件,用另一台电脑远程控制机器人 + +![](imgs/key_control.png) + +如使用该插件,则需将机器人上的键鼠拔掉,否则远程给出的速度指令会被机器人上的键鼠指令覆盖,如插上了不使用键鼠控制,程序默认向底盘发送速度指令为0,机器人会停止不动。 + +如想远程操控机器人,请查看[这里](/usedoc/navigationKit2/version_two/network/setting)。 + + +#### 2. 建图完毕,点击【保存并停止建图】 + + +最终建图结果示意: + + + +完成建图后,一定要点击【保存并停止建图】关闭窗口,不能直接关闭RVIZ窗口或者关闭终端,否则地图文件无法正确保存,导航时会报错。 + +地图文件存储路径为catkin_ws\src\launch\autolabor_navigation_launch\map + +2D SLAM 地图文件: + +``` +map.pbstream: 地图文件,用于定位导航,不可修改 +``` + +如有多个环境,想保存不同的地图,在不同的环境使用: +1. 最后一次成功保存的地图会自动存储为以上的名称,而过去建好的地图会用时间戳重命名,备份在同一路径下,地图的名称可以自定义。 +2. 如果要切换地图,可以将现有地图重命名,将要替换的地图文件分别修改为以上文件的名称,之后需要再次切换的时候,依然更换地图名称即可。 + +注:如修改文件名,请务必保证名称正确无误。 + +#### 3. 点击【开始导航】 +RVIZ工具打开,建好的地图会自动加载。 + + + + +##### 初始化定位 + +导航之前,要对机器人做初始化定位,设置方式有两种: + +一、使用键盘控制机器人走到初始建图位置,注意车头、车尾方向与之前基本保持一致; + +二、使用2D Pose Estimate,点击 2D Pose Estimate(2D nav goal左边),根据机器人现在的所在位置,对比地图,找到机器人在地图中大概的位置,根据真实车头的朝向,方向指向车头朝向的方向,拉动鼠标。 + +设置后控制机器人行走一段距离,当激光雷达的数据与实时的环境匹配成功时,即为机器人找到在地图中的初始定位。 + + + +如上图所示,进行初始化定位操作后,机器人突然跳到了一个新地点,并且地图中的地点与真实环境中机器人位置一致,即为初始化成功,可进行下一步操作。 + +##### 关闭键盘控制 + +点击数字键【0】关闭键盘控制功能(非小键盘0),控制方式将切换至导航程序控制,如不切换机器人接收到目标点命令后将不会自动导航行走。 + +##### 给定目标点 + +点击 2D Nav Goal,指定目标位置,拉动鼠标,箭头方向是最终车辆运行至目标的车头朝向,鼠标松开,这样就完成了目标点的指定。 + +目标点给定后在地图中我们能看到一条线,这是规划好的路径。根据这个规划好的路径,M1 向目标点行走。 + +当M1已经到达目标点后,再一次使 2D Nav Goal 设置目标位置,M1将去到下一个目标点。 + + + + + +### 四、点击【终止导航】,停止导航功能,导航结束。 + +之后在同一环境中需要再次使用导航功能时,无须重复建图,点击【开始导航】即可。 + + +[>>常见问题](/usedoc/navigationKit2/common/q_a/doc2) + +## 附录 - 软件功能图 + + +![](imgs/software_intro_1.jpg) + +![](imgs/software_intro_2.jpg) diff --git a/navigationKit/quickStart/3dSlam.md b/navigationKit/quickStart/3dSlam.md new file mode 100644 index 0000000..b6ef981 --- /dev/null +++ b/navigationKit/quickStart/3dSlam.md @@ -0,0 +1,150 @@ +# 建图导航 + + +## 操作步骤 + +### 一、连接键鼠 +鼠标键盘建议使用普通成套的无线键鼠,避免使用机械键盘、游戏鼠标,请不要同时使用有线、无线鼠标或键盘。 + +### 二、启动系统 +打开电源,打开工控机,等待 Autolabor OS 系统启动,输入密码 autolabor,字母全部是小写,回车。 + +![](imgs/login.png) + +### 三、建图导航 + + +#### 准备工作: +1. 将 M1 控制模式切换到上位机控制,右转打开急停开关,确保急停开关没有被按下 +2. 禁用工控机无线功能 + 在建图过程中,如果工控机连接了无线网络,当M1走出无线网络的覆盖区域后,网络连接会自动断开,这将导致M1控制失控,所以在开始建图之前,为了避免失控,需要将工控机的无线网络连接关闭。 +3. 进入桌面 SLAM建图导航 - > 3d 文件夹,首次使用时文件如下图,双击打开后点击 trust and launch,程序第一次打开后会重命名。 + + ![](imgs/slam-8.png) + + ![](imgs/slam-9.png) + + +#### 1. 点击【开始建图】 + + +RVIZ工具打开,能够看到地图中的 M1。 + +使用键盘的上下左右控制 M1 行走,边走边建图,可以看到环境地图随着 AP1 的行走不断被构建更新。 + +地图中,黑色是障碍物,白色是可行走区域,彩色的激光点是激光雷达实时数据,颜色从白至黑为障碍物的几率是0%~100%。 + +![](imgs/3d_slam1.png) + + +##### 键盘控制说明 + +键盘控制功能在系统中已经安装好,无需安装可直接使用。 + +有2种键盘控制的方式: + +一、直接在电脑上插上键鼠,直接控制机器人(默认模式) + +数字键【1/2】线速度增加/减少,数字键【3/4】角速度增加/减少,数字键【9】启用,数字键【0】禁用。 + +二、使用键盘插件,用另一台电脑远程控制机器人 + +![](imgs/key_control.png) + +如使用该插件,则需将机器人上的键鼠拔掉,否则远程给出的速度指令会被机器人上的键鼠指令覆盖,如插上了不使用键鼠控制,程序默认向底盘发送速度指令为0,机器人会停止不动。 + +如想远程操控机器人,请查看[这里](/usedoc/navigationKit2/version_two/network/setting)。 + + +#### 2. 建图完毕,点击【保存并停止建图】 + +最终建图结果示意: + + +![](imgs/3d_slam3.png) + +完成建图后,一定要点击【保存并停止建图】关闭窗口,不能直接关闭RVIZ窗口或者关闭终端,否则地图文件无法正确保存,导航时会报错。 + +地图文件存储路径为catkin_ws\src\launch\autolabor_navigation_launch\map + +3D SLAM 地图文件: + +``` +map_3d.pbstream: 地图文件,用于定位,不可修改 +map_3d.pgm:地图文件,用于导航,可修改 +map_3d.yaml : pgm 文件的解释文件 +``` + +如有多个环境,想保存不同的地图,在不同的环境使用: +1. 最后一次成功保存的地图会自动存储为以上的名称,而过去建好的地图会用时间戳重命名,备份在同一路径下,地图的名称可以自定义。 +2. 如果要切换地图,可以将现有地图重命名,将要替换的地图文件分别修改为以上文件的名称,之后需要再次切换的时候,依然更换地图名称即可。 + +注:如修改文件名,请务必保证名称正确无误。 + +#### 3. 修地图 + + +注:此步骤非必须操作,如建图结果与真实环境基本一致,可跳至下一步。 + +建图完成后,对照真实的建图环境,对地图进行修改,涂抹掉临时障碍物,增加真实环境中实际存在的障碍物,也可以自定义机器人的行走区域。 + +为避免修改错误无法返回,建议在修改前对要文件做一个备份。 + +右键点击map_3d.pgm,选择Krita软件打开,选择画笔工具,白色涂掉障碍物,黑色新增障碍物。 + +![](imgs/3d_slam4.png) +![](imgs/3d_slam5.png) +![](imgs/3d_slam6.png) + +地图修改完毕后,保存关闭。 + + +#### 4. 点击【开始导航】 +RVIZ工具打开,建好的地图会自动加载。 + +![](imgs/3d_slam7.png) + + + +##### 初始化定位 + +导航之前,要对机器人做初始化定位,设置方式有两种: + +一、使用键盘控制机器人走到初始建图位置,注意车头、车尾方向与之前基本保持一致; + +二、使用2D Pose Estimate,点击 2D Pose Estimate(2D nav goal左边),根据机器人现在的所在位置,对比地图,找到机器人在地图中大概的位置,根据真实车头的朝向,方向指向车头朝向的方向,拉动鼠标。 + +设置后控制机器人行走一段距离,当激光雷达的数据与实时的环境匹配成功时,即为机器人找到在地图中的初始定位。 + +![](imgs/3d_slam8.gif) + +如上图所示,进行初始化定位操作后,机器人突然跳到了一个新地点,并且地图中的地点与真实环境中机器人位置一致,即为初始化成功,可进行下一步操作。 + +##### 关闭键盘控制 + +点击数字键【0】关闭键盘控制功能(非小键盘0),或取消键盘插件的【激活键盘控制】,关闭后控制方式将切换至导航程序,如不切换机器人接收到目标点命令后将不会自动导航行走。 + +##### 给定目标点 + +点击 2D Nav Goal,指定目标位置,拉动鼠标,箭头方向是最终车辆运行至目标的车头朝向,鼠标松开,这样就完成了目标点的指定。 + +目标点给定后在地图中我们能看到一条线,这是规划好的路径。根据这个规划好的路径,M1向目标点行走。 + +当M1已经到达目标点后,再一次使 2D Nav Goal 设置目标位置,M1将去到下一个目标点。 + + + +### 四、点击【终止导航】,停止导航功能,导航结束。 + +之后在同一环境中需要再次使用导航功能时,无须重复建图,点击【开始导航】即可。 + + + + + +## 附录 - 软件功能图 + + +![](imgs/software_intro_4.jpg) + +![](imgs/software_intro_5.jpg) diff --git a/navigationKit/quickStart/handle.md b/navigationKit/quickStart/handle.md new file mode 100644 index 0000000..04d82ec --- /dev/null +++ b/navigationKit/quickStart/handle.md @@ -0,0 +1,101 @@ +## 手柄控制 + +### 概述 + +我们配送一个控制手柄用于控制M1移动。 + +### 使用说明 + +M1出厂默认控制模式为手柄控制,在控制面板中可切换控制模式,将M1控制面板中的上位机控制按钮置于“手柄”方向切换到手柄控制模式,即可操作手柄的按键控制移动平台。 + +#### 手柄操作步骤 + +1. 打开手柄电源,切换至ON模式,手柄顶部POWER指示灯亮起 +2. 使用MODE键开启控制模式,顶部MODE LED指示灯为红色时,才能使用手柄进行控制 +3. 先按住手柄顶部两个【1】键,然后按照下文使用说明操作 + +![PS2 control](imgs/ps1.jpg) +![PS2 control](imgs/ps2.jpg) + +#### 手柄按键说明 + +我们对于M1的手柄控制设计有几种速度档位,如下表。 + + + + + + + + + + + + + + + + +
档位0档1档2档3档
速度25%50%75%100%
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
按键功能备注
左区4控制键前/后/左/右控制运动方向
SELECT/最低速度档设置运动速度为最低档位设置速度档位为0档
START/最高速度档设置运动速度为最高档位设置速度档位为3档
左侧摇杆键控制M1的运动方向和速度使用摇杆灵活的控制运动角度与速度,不必受限于正前/后/左/右,控制摇杆推动的力度来控制速度档位的调节,将摇杆向前方直接推到低,则直接是3档,向后方直接推到底,则直接设置为0档
右侧摇杆键无功能现阶段暂未使用
右区控制键-上线速度增加调整速度档位,每按一下,速度提高一档,最高不得高于最高档,如3档
右区控制键-下线速度减少每按一下,速度降低一档,最低不得高于最底档,如0档
右区控制键-左/右角速度增加/减少同线速度
顶部名为“1”的按键运动控制使能在遥控底盘运动、调整线速度、调整角速度的时候,这两个按钮应该处于被按下的状态
顶部名为“2”的按键配对测试按键当按下其中任意一个名为“2”的按键后,且配对的机器人为下位机模式,此时机器人会发出蜂鸣音提示
+ + + + diff --git a/navigationKit/quickStart/imgs/3d_slam1.png b/navigationKit/quickStart/imgs/3d_slam1.png new file mode 100644 index 0000000..1b2a66b Binary files /dev/null and b/navigationKit/quickStart/imgs/3d_slam1.png differ diff --git a/navigationKit/quickStart/imgs/3d_slam2.png b/navigationKit/quickStart/imgs/3d_slam2.png new file mode 100644 index 0000000..d76d9b0 Binary files /dev/null and b/navigationKit/quickStart/imgs/3d_slam2.png differ diff --git a/navigationKit/quickStart/imgs/3d_slam3.png b/navigationKit/quickStart/imgs/3d_slam3.png new file mode 100644 index 0000000..a22382c Binary files /dev/null and b/navigationKit/quickStart/imgs/3d_slam3.png differ diff --git a/navigationKit/quickStart/imgs/3d_slam4.png b/navigationKit/quickStart/imgs/3d_slam4.png new file mode 100644 index 0000000..eb88602 Binary files /dev/null and b/navigationKit/quickStart/imgs/3d_slam4.png differ diff --git a/navigationKit/quickStart/imgs/3d_slam5.png b/navigationKit/quickStart/imgs/3d_slam5.png new file mode 100644 index 0000000..397b4ae Binary files /dev/null and b/navigationKit/quickStart/imgs/3d_slam5.png differ diff --git a/navigationKit/quickStart/imgs/3d_slam6.png b/navigationKit/quickStart/imgs/3d_slam6.png new file mode 100644 index 0000000..6492a2d Binary files /dev/null and b/navigationKit/quickStart/imgs/3d_slam6.png differ diff --git a/navigationKit/quickStart/imgs/3d_slam7.png b/navigationKit/quickStart/imgs/3d_slam7.png new file mode 100644 index 0000000..ad385fb Binary files /dev/null and b/navigationKit/quickStart/imgs/3d_slam7.png differ diff --git a/navigationKit/quickStart/imgs/3d_slam8.gif b/navigationKit/quickStart/imgs/3d_slam8.gif new file mode 100644 index 0000000..737a445 Binary files /dev/null and b/navigationKit/quickStart/imgs/3d_slam8.gif differ diff --git a/navigationKit/quickStart/imgs/IMG_0685-2.jpg b/navigationKit/quickStart/imgs/IMG_0685-2.jpg new file mode 100644 index 0000000..2bd379f Binary files /dev/null and b/navigationKit/quickStart/imgs/IMG_0685-2.jpg differ diff --git a/navigationKit/quickStart/imgs/IMG_0685.jpg b/navigationKit/quickStart/imgs/IMG_0685.jpg new file mode 100644 index 0000000..0fedfe7 Binary files /dev/null and b/navigationKit/quickStart/imgs/IMG_0685.jpg differ diff --git a/navigationKit/quickStart/imgs/desktop.png b/navigationKit/quickStart/imgs/desktop.png new file mode 100644 index 0000000..4bbad65 Binary files /dev/null and b/navigationKit/quickStart/imgs/desktop.png differ diff --git a/navigationKit/quickStart/imgs/download-file.png b/navigationKit/quickStart/imgs/download-file.png new file mode 100644 index 0000000..188e893 Binary files /dev/null and b/navigationKit/quickStart/imgs/download-file.png differ diff --git a/navigationKit/quickStart/imgs/intro.png b/navigationKit/quickStart/imgs/intro.png new file mode 100644 index 0000000..421641c Binary files /dev/null and b/navigationKit/quickStart/imgs/intro.png differ diff --git a/navigationKit/quickStart/imgs/intro1.png b/navigationKit/quickStart/imgs/intro1.png new file mode 100644 index 0000000..123fb77 Binary files /dev/null and b/navigationKit/quickStart/imgs/intro1.png differ diff --git a/navigationKit/quickStart/imgs/intro10.png b/navigationKit/quickStart/imgs/intro10.png new file mode 100644 index 0000000..cda0d81 Binary files /dev/null and b/navigationKit/quickStart/imgs/intro10.png differ diff --git a/navigationKit/quickStart/imgs/intro11.png b/navigationKit/quickStart/imgs/intro11.png new file mode 100644 index 0000000..ed408a3 Binary files /dev/null and b/navigationKit/quickStart/imgs/intro11.png differ diff --git a/navigationKit/quickStart/imgs/intro12.png b/navigationKit/quickStart/imgs/intro12.png new file mode 100644 index 0000000..df3cc77 Binary files /dev/null and b/navigationKit/quickStart/imgs/intro12.png differ diff --git a/navigationKit/quickStart/imgs/intro13.png b/navigationKit/quickStart/imgs/intro13.png new file mode 100644 index 0000000..f927521 Binary files /dev/null and b/navigationKit/quickStart/imgs/intro13.png differ diff --git a/navigationKit/quickStart/imgs/intro14.png b/navigationKit/quickStart/imgs/intro14.png new file mode 100644 index 0000000..1fff463 Binary files /dev/null and b/navigationKit/quickStart/imgs/intro14.png differ diff --git a/navigationKit/quickStart/imgs/intro15.png b/navigationKit/quickStart/imgs/intro15.png new file mode 100644 index 0000000..3c14c6e Binary files /dev/null and b/navigationKit/quickStart/imgs/intro15.png differ diff --git a/navigationKit/quickStart/imgs/intro16.png b/navigationKit/quickStart/imgs/intro16.png new file mode 100644 index 0000000..46658ad Binary files /dev/null and b/navigationKit/quickStart/imgs/intro16.png differ diff --git a/navigationKit/quickStart/imgs/intro2.png b/navigationKit/quickStart/imgs/intro2.png new file mode 100644 index 0000000..8873868 Binary files /dev/null and b/navigationKit/quickStart/imgs/intro2.png differ diff --git a/navigationKit/quickStart/imgs/intro3.png b/navigationKit/quickStart/imgs/intro3.png new file mode 100644 index 0000000..487e748 Binary files /dev/null and b/navigationKit/quickStart/imgs/intro3.png differ diff --git a/navigationKit/quickStart/imgs/intro4.png b/navigationKit/quickStart/imgs/intro4.png new file mode 100644 index 0000000..5281e22 Binary files /dev/null and b/navigationKit/quickStart/imgs/intro4.png differ diff --git a/navigationKit/quickStart/imgs/intro5.png b/navigationKit/quickStart/imgs/intro5.png new file mode 100644 index 0000000..97ab6b3 Binary files /dev/null and b/navigationKit/quickStart/imgs/intro5.png differ diff --git a/navigationKit/quickStart/imgs/intro6.png b/navigationKit/quickStart/imgs/intro6.png new file mode 100644 index 0000000..99c767f Binary files /dev/null and b/navigationKit/quickStart/imgs/intro6.png differ diff --git a/navigationKit/quickStart/imgs/intro7.png b/navigationKit/quickStart/imgs/intro7.png new file mode 100644 index 0000000..b2bb4a8 Binary files /dev/null and b/navigationKit/quickStart/imgs/intro7.png differ diff --git a/navigationKit/quickStart/imgs/intro8.png b/navigationKit/quickStart/imgs/intro8.png new file mode 100644 index 0000000..587640e Binary files /dev/null and b/navigationKit/quickStart/imgs/intro8.png differ diff --git a/navigationKit/quickStart/imgs/intro9.png b/navigationKit/quickStart/imgs/intro9.png new file mode 100644 index 0000000..7c513df Binary files /dev/null and b/navigationKit/quickStart/imgs/intro9.png differ diff --git a/navigationKit/quickStart/imgs/key_control.png b/navigationKit/quickStart/imgs/key_control.png new file mode 100644 index 0000000..09f066a Binary files /dev/null and b/navigationKit/quickStart/imgs/key_control.png differ diff --git a/navigationKit/quickStart/imgs/keyboard_control.png b/navigationKit/quickStart/imgs/keyboard_control.png new file mode 100644 index 0000000..d4973a1 Binary files /dev/null and b/navigationKit/quickStart/imgs/keyboard_control.png differ diff --git a/navigationKit/quickStart/imgs/login.png b/navigationKit/quickStart/imgs/login.png new file mode 100644 index 0000000..6c15c1e Binary files /dev/null and b/navigationKit/quickStart/imgs/login.png differ diff --git a/navigationKit/quickStart/imgs/ps1.jpg b/navigationKit/quickStart/imgs/ps1.jpg new file mode 100644 index 0000000..919de8a Binary files /dev/null and b/navigationKit/quickStart/imgs/ps1.jpg differ diff --git a/navigationKit/quickStart/imgs/ps2.jpg b/navigationKit/quickStart/imgs/ps2.jpg new file mode 100644 index 0000000..1b4184a Binary files /dev/null and b/navigationKit/quickStart/imgs/ps2.jpg differ diff --git a/navigationKit/quickStart/imgs/receipt-0-1.JPG b/navigationKit/quickStart/imgs/receipt-0-1.JPG new file mode 100644 index 0000000..666a888 Binary files /dev/null and b/navigationKit/quickStart/imgs/receipt-0-1.JPG differ diff --git a/navigationKit/quickStart/imgs/receipt-0.JPG b/navigationKit/quickStart/imgs/receipt-0.JPG new file mode 100644 index 0000000..465916d Binary files /dev/null and b/navigationKit/quickStart/imgs/receipt-0.JPG differ diff --git a/navigationKit/quickStart/imgs/receipt-1.JPG b/navigationKit/quickStart/imgs/receipt-1.JPG new file mode 100644 index 0000000..8bc1029 Binary files /dev/null and b/navigationKit/quickStart/imgs/receipt-1.JPG differ diff --git a/navigationKit/quickStart/imgs/receipt-1.png b/navigationKit/quickStart/imgs/receipt-1.png new file mode 100644 index 0000000..37611a2 Binary files /dev/null and b/navigationKit/quickStart/imgs/receipt-1.png differ diff --git a/navigationKit/quickStart/imgs/receipt-2.jpg b/navigationKit/quickStart/imgs/receipt-2.jpg new file mode 100644 index 0000000..07cce89 Binary files /dev/null and b/navigationKit/quickStart/imgs/receipt-2.jpg differ diff --git a/navigationKit/quickStart/imgs/receipt-2.png b/navigationKit/quickStart/imgs/receipt-2.png new file mode 100644 index 0000000..0a2b591 Binary files /dev/null and b/navigationKit/quickStart/imgs/receipt-2.png differ diff --git a/navigationKit/quickStart/imgs/receipt-3-1.jpg b/navigationKit/quickStart/imgs/receipt-3-1.jpg new file mode 100644 index 0000000..74fd592 Binary files /dev/null and b/navigationKit/quickStart/imgs/receipt-3-1.jpg differ diff --git a/navigationKit/quickStart/imgs/receipt-3-2.jpg b/navigationKit/quickStart/imgs/receipt-3-2.jpg new file mode 100644 index 0000000..4be9189 Binary files /dev/null and b/navigationKit/quickStart/imgs/receipt-3-2.jpg differ diff --git a/navigationKit/quickStart/imgs/receipt-4.jpg b/navigationKit/quickStart/imgs/receipt-4.jpg new file mode 100644 index 0000000..ef1fbd6 Binary files /dev/null and b/navigationKit/quickStart/imgs/receipt-4.jpg differ diff --git a/navigationKit/quickStart/imgs/receipt-4.png b/navigationKit/quickStart/imgs/receipt-4.png new file mode 100644 index 0000000..2aabee0 Binary files /dev/null and b/navigationKit/quickStart/imgs/receipt-4.png differ diff --git a/navigationKit/quickStart/imgs/receipt-5.jpg b/navigationKit/quickStart/imgs/receipt-5.jpg new file mode 100644 index 0000000..06ba757 Binary files /dev/null and b/navigationKit/quickStart/imgs/receipt-5.jpg differ diff --git a/navigationKit/quickStart/imgs/receipt-5.png b/navigationKit/quickStart/imgs/receipt-5.png new file mode 100644 index 0000000..2fc0412 Binary files /dev/null and b/navigationKit/quickStart/imgs/receipt-5.png differ diff --git a/navigationKit/quickStart/imgs/receipt-6.jpg b/navigationKit/quickStart/imgs/receipt-6.jpg new file mode 100644 index 0000000..ee18c1a Binary files /dev/null and b/navigationKit/quickStart/imgs/receipt-6.jpg differ diff --git a/navigationKit/quickStart/imgs/receipt-6.png b/navigationKit/quickStart/imgs/receipt-6.png new file mode 100644 index 0000000..ed56c3a Binary files /dev/null and b/navigationKit/quickStart/imgs/receipt-6.png differ diff --git a/navigationKit/quickStart/imgs/receipt-7.jpg b/navigationKit/quickStart/imgs/receipt-7.jpg new file mode 100644 index 0000000..67d92b7 Binary files /dev/null and b/navigationKit/quickStart/imgs/receipt-7.jpg differ diff --git a/navigationKit/quickStart/imgs/receipt-7.png b/navigationKit/quickStart/imgs/receipt-7.png new file mode 100644 index 0000000..5ccac40 Binary files /dev/null and b/navigationKit/quickStart/imgs/receipt-7.png differ diff --git a/navigationKit/quickStart/imgs/receipt-8.jpg b/navigationKit/quickStart/imgs/receipt-8.jpg new file mode 100644 index 0000000..393e6d7 Binary files /dev/null and b/navigationKit/quickStart/imgs/receipt-8.jpg differ diff --git a/navigationKit/quickStart/imgs/receipt-8.png b/navigationKit/quickStart/imgs/receipt-8.png new file mode 100644 index 0000000..6a594a8 Binary files /dev/null and b/navigationKit/quickStart/imgs/receipt-8.png differ diff --git a/navigationKit/quickStart/imgs/receipt-new-1.JPG b/navigationKit/quickStart/imgs/receipt-new-1.JPG new file mode 100644 index 0000000..107afd3 Binary files /dev/null and b/navigationKit/quickStart/imgs/receipt-new-1.JPG differ diff --git a/navigationKit/quickStart/imgs/receipt-new-2.JPG b/navigationKit/quickStart/imgs/receipt-new-2.JPG new file mode 100644 index 0000000..3896126 Binary files /dev/null and b/navigationKit/quickStart/imgs/receipt-new-2.JPG differ diff --git a/navigationKit/quickStart/imgs/receipt-new-3.JPG b/navigationKit/quickStart/imgs/receipt-new-3.JPG new file mode 100644 index 0000000..8bea429 Binary files /dev/null and b/navigationKit/quickStart/imgs/receipt-new-3.JPG differ diff --git a/navigationKit/quickStart/imgs/receipt-new-4.JPG b/navigationKit/quickStart/imgs/receipt-new-4.JPG new file mode 100644 index 0000000..1d05018 Binary files /dev/null and b/navigationKit/quickStart/imgs/receipt-new-4.JPG differ diff --git a/navigationKit/quickStart/imgs/receipt-new-5.JPG b/navigationKit/quickStart/imgs/receipt-new-5.JPG new file mode 100644 index 0000000..1a54831 Binary files /dev/null and b/navigationKit/quickStart/imgs/receipt-new-5.JPG differ diff --git a/navigationKit/quickStart/imgs/receipt-new-6.jpg b/navigationKit/quickStart/imgs/receipt-new-6.jpg new file mode 100644 index 0000000..455546e Binary files /dev/null and b/navigationKit/quickStart/imgs/receipt-new-6.jpg differ diff --git a/navigationKit/quickStart/imgs/receipt-new-8.jpg b/navigationKit/quickStart/imgs/receipt-new-8.jpg new file mode 100644 index 0000000..1d7550f Binary files /dev/null and b/navigationKit/quickStart/imgs/receipt-new-8.jpg differ diff --git a/navigationKit/quickStart/imgs/robot_calibration1.png b/navigationKit/quickStart/imgs/robot_calibration1.png new file mode 100644 index 0000000..c265205 Binary files /dev/null and b/navigationKit/quickStart/imgs/robot_calibration1.png differ diff --git a/navigationKit/quickStart/imgs/slam-1.png b/navigationKit/quickStart/imgs/slam-1.png new file mode 100644 index 0000000..92c251b Binary files /dev/null and b/navigationKit/quickStart/imgs/slam-1.png differ diff --git a/navigationKit/quickStart/imgs/slam-2.png b/navigationKit/quickStart/imgs/slam-2.png new file mode 100644 index 0000000..e96ae87 Binary files /dev/null and b/navigationKit/quickStart/imgs/slam-2.png differ diff --git a/navigationKit/quickStart/imgs/slam-3.png b/navigationKit/quickStart/imgs/slam-3.png new file mode 100644 index 0000000..b9ba841 Binary files /dev/null and b/navigationKit/quickStart/imgs/slam-3.png differ diff --git a/navigationKit/quickStart/imgs/slam-4.png b/navigationKit/quickStart/imgs/slam-4.png new file mode 100644 index 0000000..4bb611d Binary files /dev/null and b/navigationKit/quickStart/imgs/slam-4.png differ diff --git a/navigationKit/quickStart/imgs/slam-5.png b/navigationKit/quickStart/imgs/slam-5.png new file mode 100644 index 0000000..d2ed420 Binary files /dev/null and b/navigationKit/quickStart/imgs/slam-5.png differ diff --git a/navigationKit/quickStart/imgs/slam-6.gif b/navigationKit/quickStart/imgs/slam-6.gif new file mode 100644 index 0000000..55dc33d Binary files /dev/null and b/navigationKit/quickStart/imgs/slam-6.gif differ diff --git a/navigationKit/quickStart/imgs/slam-7.gif b/navigationKit/quickStart/imgs/slam-7.gif new file mode 100644 index 0000000..b039292 Binary files /dev/null and b/navigationKit/quickStart/imgs/slam-7.gif differ diff --git a/navigationKit/quickStart/imgs/slam-8.png b/navigationKit/quickStart/imgs/slam-8.png new file mode 100644 index 0000000..b8d17df Binary files /dev/null and b/navigationKit/quickStart/imgs/slam-8.png differ diff --git a/navigationKit/quickStart/imgs/slam-9.png b/navigationKit/quickStart/imgs/slam-9.png new file mode 100644 index 0000000..08d56f8 Binary files /dev/null and b/navigationKit/quickStart/imgs/slam-9.png differ diff --git a/navigationKit/quickStart/imgs/slamSet-label.png b/navigationKit/quickStart/imgs/slamSet-label.png new file mode 100644 index 0000000..11dcdda Binary files /dev/null and b/navigationKit/quickStart/imgs/slamSet-label.png differ diff --git a/navigationKit/quickStart/imgs/software_intro_1.jpg b/navigationKit/quickStart/imgs/software_intro_1.jpg new file mode 100644 index 0000000..995c016 Binary files /dev/null and b/navigationKit/quickStart/imgs/software_intro_1.jpg differ diff --git a/navigationKit/quickStart/imgs/software_intro_2.jpg b/navigationKit/quickStart/imgs/software_intro_2.jpg new file mode 100644 index 0000000..9692ca5 Binary files /dev/null and b/navigationKit/quickStart/imgs/software_intro_2.jpg differ diff --git a/navigationKit/quickStart/imgs/software_intro_4.jpg b/navigationKit/quickStart/imgs/software_intro_4.jpg new file mode 100644 index 0000000..8e2e031 Binary files /dev/null and b/navigationKit/quickStart/imgs/software_intro_4.jpg differ diff --git a/navigationKit/quickStart/imgs/software_intro_5.jpg b/navigationKit/quickStart/imgs/software_intro_5.jpg new file mode 100644 index 0000000..a77758d Binary files /dev/null and b/navigationKit/quickStart/imgs/software_intro_5.jpg differ diff --git a/navigationKit/quickStart/keyboard.md b/navigationKit/quickStart/keyboard.md new file mode 100644 index 0000000..956cdda --- /dev/null +++ b/navigationKit/quickStart/keyboard.md @@ -0,0 +1,30 @@ +# 键盘控制 + +## 操作步骤 + +### 一、连接键鼠 +鼠标键盘建议使用普通成套的无线键鼠,避免使用机械键盘、游戏鼠标,请不要同时使用有线、无线鼠标或键盘。 + +### 二、启动系统 +打开电源,打开工控机,等待 Autolabor OS 系统启动,输入密码 autolabor,字母全部是小写,回车。 + +![](imgs/login.png) + + +#### 准备工作: +1. 将 M1 控制模式切换到上位机控制,打开红色急停开关,确认是弹起非按下状态 +2. 禁用工控机无线功能 + 在建图过程中,如果工控机连接了无线网络,当M1走出无线网络的覆盖区域后,网络连接会自动断开,这将导致M1控制失控,所以在开始建图之前,为了避免失控,需要将工控机的无线网络连接关闭。 +3. 进入到系统后,可以在桌面上看到【键盘控制】这个图标 + +![](imgs/desktop.png) + +#### 三、点击【键盘控制】 + +程序启动,可以看到 RVIZ 中有黄色的M1车,使用键盘上下左右,车开始行走。 + +数字键【1/2】线速度增加/减少,数字键【3/4】角速度增加/减少,数字键【9】启用,数字键【0】禁用。 + +![](imgs/keyboard_control.png) + + diff --git a/navigationKit/quickStart/remote/imgs/connect.png b/navigationKit/quickStart/remote/imgs/connect.png new file mode 100644 index 0000000..0c70799 Binary files /dev/null and b/navigationKit/quickStart/remote/imgs/connect.png differ diff --git a/navigationKit/quickStart/remote/imgs/create_map.png b/navigationKit/quickStart/remote/imgs/create_map.png new file mode 100644 index 0000000..1518d88 Binary files /dev/null and b/navigationKit/quickStart/remote/imgs/create_map.png differ diff --git a/navigationKit/quickStart/remote/imgs/intro2.png b/navigationKit/quickStart/remote/imgs/intro2.png new file mode 100644 index 0000000..8503a69 Binary files /dev/null and b/navigationKit/quickStart/remote/imgs/intro2.png differ diff --git a/navigationKit/quickStart/remote/imgs/intro3.png b/navigationKit/quickStart/remote/imgs/intro3.png new file mode 100644 index 0000000..0334631 Binary files /dev/null and b/navigationKit/quickStart/remote/imgs/intro3.png differ diff --git a/navigationKit/quickStart/remote/imgs/intro4.png b/navigationKit/quickStart/remote/imgs/intro4.png new file mode 100644 index 0000000..09f066a Binary files /dev/null and b/navigationKit/quickStart/remote/imgs/intro4.png differ diff --git a/navigationKit/quickStart/remote/imgs/intro5.png b/navigationKit/quickStart/remote/imgs/intro5.png new file mode 100644 index 0000000..e9a1ceb Binary files /dev/null and b/navigationKit/quickStart/remote/imgs/intro5.png differ diff --git a/navigationKit/quickStart/remote/imgs/network-1.png b/navigationKit/quickStart/remote/imgs/network-1.png new file mode 100644 index 0000000..7548127 Binary files /dev/null and b/navigationKit/quickStart/remote/imgs/network-1.png differ diff --git a/navigationKit/quickStart/remote/imgs/network-10.png b/navigationKit/quickStart/remote/imgs/network-10.png new file mode 100644 index 0000000..30c345a Binary files /dev/null and b/navigationKit/quickStart/remote/imgs/network-10.png differ diff --git a/navigationKit/quickStart/remote/imgs/network-11.png b/navigationKit/quickStart/remote/imgs/network-11.png new file mode 100644 index 0000000..e5b9849 Binary files /dev/null and b/navigationKit/quickStart/remote/imgs/network-11.png differ diff --git a/navigationKit/quickStart/remote/imgs/network-12.png b/navigationKit/quickStart/remote/imgs/network-12.png new file mode 100644 index 0000000..9b108bb Binary files /dev/null and b/navigationKit/quickStart/remote/imgs/network-12.png differ diff --git a/navigationKit/quickStart/remote/imgs/network-16.png b/navigationKit/quickStart/remote/imgs/network-16.png new file mode 100644 index 0000000..360e5f4 Binary files /dev/null and b/navigationKit/quickStart/remote/imgs/network-16.png differ diff --git a/navigationKit/quickStart/remote/imgs/network-17.png b/navigationKit/quickStart/remote/imgs/network-17.png new file mode 100644 index 0000000..c7b58c8 Binary files /dev/null and b/navigationKit/quickStart/remote/imgs/network-17.png differ diff --git a/navigationKit/quickStart/remote/imgs/network-18.png b/navigationKit/quickStart/remote/imgs/network-18.png new file mode 100644 index 0000000..ff61fd8 Binary files /dev/null and b/navigationKit/quickStart/remote/imgs/network-18.png differ diff --git a/navigationKit/quickStart/remote/imgs/network-19.png b/navigationKit/quickStart/remote/imgs/network-19.png new file mode 100644 index 0000000..08c1906 Binary files /dev/null and b/navigationKit/quickStart/remote/imgs/network-19.png differ diff --git a/navigationKit/quickStart/remote/imgs/network-2.png b/navigationKit/quickStart/remote/imgs/network-2.png new file mode 100644 index 0000000..8e6410b Binary files /dev/null and b/navigationKit/quickStart/remote/imgs/network-2.png differ diff --git a/navigationKit/quickStart/remote/imgs/network-20.png b/navigationKit/quickStart/remote/imgs/network-20.png new file mode 100644 index 0000000..39280d1 Binary files /dev/null and b/navigationKit/quickStart/remote/imgs/network-20.png differ diff --git a/navigationKit/quickStart/remote/imgs/network-21.png b/navigationKit/quickStart/remote/imgs/network-21.png new file mode 100644 index 0000000..f0b982f Binary files /dev/null and b/navigationKit/quickStart/remote/imgs/network-21.png differ diff --git a/navigationKit/quickStart/remote/imgs/network-22.png b/navigationKit/quickStart/remote/imgs/network-22.png new file mode 100644 index 0000000..88d9c5f Binary files /dev/null and b/navigationKit/quickStart/remote/imgs/network-22.png differ diff --git a/navigationKit/quickStart/remote/imgs/network-23.png b/navigationKit/quickStart/remote/imgs/network-23.png new file mode 100644 index 0000000..9743ed9 Binary files /dev/null and b/navigationKit/quickStart/remote/imgs/network-23.png differ diff --git a/navigationKit/quickStart/remote/imgs/network-24.png b/navigationKit/quickStart/remote/imgs/network-24.png new file mode 100644 index 0000000..4eadb89 Binary files /dev/null and b/navigationKit/quickStart/remote/imgs/network-24.png differ diff --git a/navigationKit/quickStart/remote/imgs/network-25.png b/navigationKit/quickStart/remote/imgs/network-25.png new file mode 100644 index 0000000..91d9e29 Binary files /dev/null and b/navigationKit/quickStart/remote/imgs/network-25.png differ diff --git a/navigationKit/quickStart/remote/imgs/network-26.png b/navigationKit/quickStart/remote/imgs/network-26.png new file mode 100644 index 0000000..26818b9 Binary files /dev/null and b/navigationKit/quickStart/remote/imgs/network-26.png differ diff --git a/navigationKit/quickStart/remote/imgs/network-27.png b/navigationKit/quickStart/remote/imgs/network-27.png new file mode 100644 index 0000000..b6cbbe5 Binary files /dev/null and b/navigationKit/quickStart/remote/imgs/network-27.png differ diff --git a/navigationKit/quickStart/remote/imgs/network-28.png b/navigationKit/quickStart/remote/imgs/network-28.png new file mode 100644 index 0000000..4f2e302 Binary files /dev/null and b/navigationKit/quickStart/remote/imgs/network-28.png differ diff --git a/navigationKit/quickStart/remote/imgs/network-29.png b/navigationKit/quickStart/remote/imgs/network-29.png new file mode 100644 index 0000000..c175a15 Binary files /dev/null and b/navigationKit/quickStart/remote/imgs/network-29.png differ diff --git a/navigationKit/quickStart/remote/imgs/network-3.png b/navigationKit/quickStart/remote/imgs/network-3.png new file mode 100644 index 0000000..b01a5b5 Binary files /dev/null and b/navigationKit/quickStart/remote/imgs/network-3.png differ diff --git a/navigationKit/quickStart/remote/imgs/network-30.png b/navigationKit/quickStart/remote/imgs/network-30.png new file mode 100644 index 0000000..e4f5bde Binary files /dev/null and b/navigationKit/quickStart/remote/imgs/network-30.png differ diff --git a/navigationKit/quickStart/remote/imgs/network-31.png b/navigationKit/quickStart/remote/imgs/network-31.png new file mode 100644 index 0000000..c40110a Binary files /dev/null and b/navigationKit/quickStart/remote/imgs/network-31.png differ diff --git a/navigationKit/quickStart/remote/imgs/network-32.png b/navigationKit/quickStart/remote/imgs/network-32.png new file mode 100644 index 0000000..2fec587 Binary files /dev/null and b/navigationKit/quickStart/remote/imgs/network-32.png differ diff --git a/navigationKit/quickStart/remote/imgs/network-33.png b/navigationKit/quickStart/remote/imgs/network-33.png new file mode 100644 index 0000000..31dd139 Binary files /dev/null and b/navigationKit/quickStart/remote/imgs/network-33.png differ diff --git a/navigationKit/quickStart/remote/imgs/network-34.png b/navigationKit/quickStart/remote/imgs/network-34.png new file mode 100644 index 0000000..167eded Binary files /dev/null and b/navigationKit/quickStart/remote/imgs/network-34.png differ diff --git a/navigationKit/quickStart/remote/imgs/network-35.png b/navigationKit/quickStart/remote/imgs/network-35.png new file mode 100644 index 0000000..68641be Binary files /dev/null and b/navigationKit/quickStart/remote/imgs/network-35.png differ diff --git a/navigationKit/quickStart/remote/imgs/network-36.png b/navigationKit/quickStart/remote/imgs/network-36.png new file mode 100644 index 0000000..a374890 Binary files /dev/null and b/navigationKit/quickStart/remote/imgs/network-36.png differ diff --git a/navigationKit/quickStart/remote/imgs/network-37.png b/navigationKit/quickStart/remote/imgs/network-37.png new file mode 100644 index 0000000..45b5465 Binary files /dev/null and b/navigationKit/quickStart/remote/imgs/network-37.png differ diff --git a/navigationKit/quickStart/remote/imgs/network-38.png b/navigationKit/quickStart/remote/imgs/network-38.png new file mode 100644 index 0000000..9f7ba59 Binary files /dev/null and b/navigationKit/quickStart/remote/imgs/network-38.png differ diff --git a/navigationKit/quickStart/remote/imgs/network-39.png b/navigationKit/quickStart/remote/imgs/network-39.png new file mode 100644 index 0000000..86a40d8 Binary files /dev/null and b/navigationKit/quickStart/remote/imgs/network-39.png differ diff --git a/navigationKit/quickStart/remote/imgs/network-40.png b/navigationKit/quickStart/remote/imgs/network-40.png new file mode 100644 index 0000000..0d7915c Binary files /dev/null and b/navigationKit/quickStart/remote/imgs/network-40.png differ diff --git a/navigationKit/quickStart/remote/imgs/network-41.png b/navigationKit/quickStart/remote/imgs/network-41.png new file mode 100644 index 0000000..53b883a Binary files /dev/null and b/navigationKit/quickStart/remote/imgs/network-41.png differ diff --git a/navigationKit/quickStart/remote/imgs/network-42.png b/navigationKit/quickStart/remote/imgs/network-42.png new file mode 100644 index 0000000..1451bce Binary files /dev/null and b/navigationKit/quickStart/remote/imgs/network-42.png differ diff --git a/navigationKit/quickStart/remote/imgs/network-43.png b/navigationKit/quickStart/remote/imgs/network-43.png new file mode 100644 index 0000000..2587a73 Binary files /dev/null and b/navigationKit/quickStart/remote/imgs/network-43.png differ diff --git a/navigationKit/quickStart/remote/imgs/network-44.png b/navigationKit/quickStart/remote/imgs/network-44.png new file mode 100644 index 0000000..2c395e0 Binary files /dev/null and b/navigationKit/quickStart/remote/imgs/network-44.png differ diff --git a/navigationKit/quickStart/remote/imgs/network-45.png b/navigationKit/quickStart/remote/imgs/network-45.png new file mode 100644 index 0000000..83536c3 Binary files /dev/null and b/navigationKit/quickStart/remote/imgs/network-45.png differ diff --git a/navigationKit/quickStart/remote/imgs/network-46.png b/navigationKit/quickStart/remote/imgs/network-46.png new file mode 100644 index 0000000..5294f51 Binary files /dev/null and b/navigationKit/quickStart/remote/imgs/network-46.png differ diff --git a/navigationKit/quickStart/remote/imgs/network-47.png b/navigationKit/quickStart/remote/imgs/network-47.png new file mode 100644 index 0000000..fd1ed47 Binary files /dev/null and b/navigationKit/quickStart/remote/imgs/network-47.png differ diff --git a/navigationKit/quickStart/remote/imgs/network-48.png b/navigationKit/quickStart/remote/imgs/network-48.png new file mode 100644 index 0000000..2bdccad Binary files /dev/null and b/navigationKit/quickStart/remote/imgs/network-48.png differ diff --git a/navigationKit/quickStart/remote/imgs/network-49.png b/navigationKit/quickStart/remote/imgs/network-49.png new file mode 100644 index 0000000..7023b77 Binary files /dev/null and b/navigationKit/quickStart/remote/imgs/network-49.png differ diff --git a/navigationKit/quickStart/remote/imgs/network-50.png b/navigationKit/quickStart/remote/imgs/network-50.png new file mode 100644 index 0000000..103127e Binary files /dev/null and b/navigationKit/quickStart/remote/imgs/network-50.png differ diff --git a/navigationKit/quickStart/remote/imgs/network-53.png b/navigationKit/quickStart/remote/imgs/network-53.png new file mode 100644 index 0000000..d9a5850 Binary files /dev/null and b/navigationKit/quickStart/remote/imgs/network-53.png differ diff --git a/navigationKit/quickStart/remote/imgs/network-8.png b/navigationKit/quickStart/remote/imgs/network-8.png new file mode 100644 index 0000000..476ab25 Binary files /dev/null and b/navigationKit/quickStart/remote/imgs/network-8.png differ diff --git a/navigationKit/quickStart/remote/imgs/network-9.png b/navigationKit/quickStart/remote/imgs/network-9.png new file mode 100644 index 0000000..3f8d33c Binary files /dev/null and b/navigationKit/quickStart/remote/imgs/network-9.png differ diff --git a/navigationKit/quickStart/remote/imgs/slam.png b/navigationKit/quickStart/remote/imgs/slam.png new file mode 100644 index 0000000..7736fb7 Binary files /dev/null and b/navigationKit/quickStart/remote/imgs/slam.png differ diff --git a/navigationKit/quickStart/remote/imgs/企业微信截图_20200715112904.png b/navigationKit/quickStart/remote/imgs/企业微信截图_20200715112904.png new file mode 100644 index 0000000..242df9b Binary files /dev/null and b/navigationKit/quickStart/remote/imgs/企业微信截图_20200715112904.png differ diff --git a/navigationKit/quickStart/remote/keyboardPlugin.md b/navigationKit/quickStart/remote/keyboardPlugin.md new file mode 100644 index 0000000..cec5bd3 --- /dev/null +++ b/navigationKit/quickStart/remote/keyboardPlugin.md @@ -0,0 +1,112 @@ +# 远程控制-键盘插件 + +使用远程连接到 M1 上后,我们想要控制 M1 运动,发现键盘控制车不动。 + +在 OS 系统中程序默认识别的是插在车载电脑上的键盘外设,远程主机的键盘命令程序无法接收,键盘控制指令则无法执行。 + +为了解决远程连接控制的问题,我们为用户提供了键盘包,可获取远程主机键盘的按键指令,将控制命令发送到车载主机上。 + + +### 功能描述: + +该功能包为Autolabor 机器人远程连接时,提供用户端主机键盘控制功能。 + + + +### 要求: + +该插件与键盘鼠标不能同时使用,使用时需拔掉插在电脑上的键盘设备 + + +### 一、配置 + +以**SLAM建图**为例,演示该插件的配置方法。 + +#### 1. 远程连接 + +使用远程桌面工具,连接到车载电脑上。 + +#### 2. 点击【开始建图】 + +![](imgs/slam.png) + +程序启动,RVIZ打开。此时,在远程端我们用键盘控制,车无法运动。 + +![](imgs/create_map.png) + +#### 3. 加载插件 + +RViz 的左上角依次点击 Panels -> Add New Panel -> rviz_keyboard_twist -> KeyboardTwist + + + +
+ +*** + +**加载完毕:** + +![](imgs/intro4.png) + +*** + +**做完以上操作后 Ctrl + S 保存 RViz 配置,如忘记保存,则下次进来要重复操作。** + +### 二、使用 + + +#### 1. 激活键盘控制 + +鼠标勾选激活键盘控制 + +![](imgs/intro5.png) + + +#### 2. 键盘控制 + +使用键盘上下左右控制,此时车能够被远程控制。 + +#### 3. 取消键盘控制 + +键盘控制完成后,必须取消,否则键盘按键失灵无法使用。 + + +### 四、重要说明 + +1. 需要远程使用的应用都需要在 RViz 中单独添加该插件,单个RViz中添加的插件不会应用到全局程序。 +2. 使用该插件远程控制前,要求在本机确认机器人的键盘控制是正常的。 +3. 键盘控制使用完毕后,必须要取消键盘控制。 + + +### 附录:安装方法 + + +#### 1. 下载程序包 + +进入 /home/autolabor/catkin_ws/src 目录,执行 + +``` +git clone https://github.com/autolaborcenter/rviz_keyboard_plugin.git +``` + +或访问 https://github.com/autolaborcenter/rviz_keyboard_plugin.git 下载源代码,放入 /home/autolabor/catkin_ws/src 目录中 + +给新加入的文件添加操作权限,在/home/autolabor/catkin_ws 目录下,右键打开终端,执行 + +`sudo chmod -R 777 /home/autolabor/catkin_ws/src/` + +输入密码 `autolabor`,回车 + +#### 2. 编译 + +还是在 /home/autolabor/catkin_ws 目录下,终端执行 + +`sudo rm -rf build/ devel/ logs/ .catkin_tools/` + +输入密码 `autolabor`,回车,然后执行 + +`catkin build -j2` + + + + diff --git a/navigationKit/quickStart/remote/qa.md b/navigationKit/quickStart/remote/qa.md new file mode 100644 index 0000000..2b89d44 --- /dev/null +++ b/navigationKit/quickStart/remote/qa.md @@ -0,0 +1,93 @@ +# 常见问题 + +## 目录 + +#### 远程桌面软件 NoMachine + +1. 如何调整分辨率与画质 +2. 如何远程传输文件 +3. 报错:`The connection with the sever was lost` +4. 报错:`Could not connect to the sever. Error is 108: Connection reset by peer` +5. 报错:`A connection timeout has occurred while trying to connect ‘cloud.autolabor.com.cn' on port 'XXXXX'. The issue could either by a networking problem.....` +6. 远程连接成功后,一直显示 `NIVIDIA`的图标,卡住了 + + +*** + +## 远程桌面软件 NoMachine + +1. 如何调整分辨率与画质 + +入口一: + +进入系统后,在引导对话框修改。 + +![](imgs/network-48.png) + + +入口二: + +关闭对话框后,鼠标滑到右上角,显示出 “翻页效果”,点击 “翻页”。 + +![](imgs/network-40.png) + +![](imgs/network-37.png) + +进入修改页,调整到最低,`Done` 生效。 + +![](imgs/network-39.png) + +2. 如何远程传输文件 + +![](imgs/network-53.png) + + +3. 报错:`The connection with the sever was lost` + +请检查,是否连接上机器人 Wifi 。 + +![](imgs/network-23.png) + + +4. 报错:`Could not connect to the sever. Error is 108: Connection reset by peer` + +远程连接服务已断开,可能原因是: + +* 远程端口关闭 +* 机器人主机重启 +* 机器人电源关闭 + +操作: + +* 检查 Wifi 是否连接 + + +注:设备电源重启后远程连接自动断开,需重新请求远程地址 + +![](imgs/network-33.png) + + +5. 报错:`A connection timeout has occurred while trying to connect ‘cloud.autolabor.com.cn' on port 'XXXXX'. The issue could either by a networking problem.....` + +该端口无法连接,常见于: + +* 机器人主机重启 +* 机器人电源关闭 +* 重新启用了新端口 + +操作: + +重新获取远程连接地址与端口,如显示之前的端口未关闭,请关闭后重新开启。 +之后再用新端口尝试。 + + +![](imgs/network-50.png) + +6. 远程连接成功后,一直显示 `NIVIDIA`的图标,卡住了 + +![](imgs/network-51.png) + +远程桌面连接要求主机 HDMI 必须有连接,才能进行显示。 + +如想去掉套件上的显示器,可在网上购买HDMI虚拟插头。 + diff --git a/navigationKit/quickStart/remote/remoteConnect.md b/navigationKit/quickStart/remote/remoteConnect.md new file mode 100644 index 0000000..d374a77 --- /dev/null +++ b/navigationKit/quickStart/remote/remoteConnect.md @@ -0,0 +1,111 @@ +# 远程连接 + +## 内网连接 + +步骤: + +1. 连接无线网络 +2. 获得车载电脑IP地址 +3. 连接设备 + +### 一、连接无线网络 + + 1. 将车载电脑与用户端主机连接至同一无线网络 + + 2. 在系统终端中执行 `ipconfig`(windows) 或 `ifconfig` (linux) 查看车载与本机 IP 是否在同一网段,例以 `192.168.18.XX` 开头,最末的`XX`为不同数值,这样确保两个主机在同一网络中。 + + +### 二、获得远程连接地址 + +根据远程操作界面的不同,可选择 远程桌面软件 或 远程命令访问/SSH 两种方式。 + +在车载电脑的terminal中执行 `ifconfig`,获取 IP 地址,假设获取到的IP为 `192.168.188.1` + +内网远程桌面访问地址: 192.168.188.1 端口:4000 + +内网 SSH 访问地址:192.168.188.1 端口:22 + +用户名:autolabor + +密码:autolabor + +推荐用户使用 `远程桌面`,有图形化界面操作更方便,还可直接与用户端主机传输文件。 + +### 三、连接设备 + +#### 远程桌面 + +远程桌面使用的是 NoMachine,这是一个多平台的远程桌面访问工具,图形化操作界面,支持 Windows/Mac/Linux,同一时间仅限 1 人连接(可理解为teamviewer)。 + +**注:用户端主机与机器人端主机,都需要安装 NoMachine。** + +#### 下载NoMachine + +[Windows](http://download.autolabor.com.cn/software/nomachine_6.11.2_1.exe)/[OS X](http://download.autolabor.com.cn/software/nomachine_6.11.2_13.dmg)/[Ubuntu](http://download.autolabor.com.cn/software/nomachine_6.11.2_1_amd64.deb) + + +#### 安装 + +![](imgs/network-16.png) + +![](imgs/network-17.png) + +#### 启动 + +1. 打开 NoMachine 软件,会弹出引导页面,点击 `continue` + +![](imgs/network-18.png) + +2. NoMachine 会将同一局域网中所有设备列出,与机器人在同一网络时,可直接看到机器人设备,右键点击设置图标,选择 `Edit Connection` 按钮,确认IP地址是否正确。 + +![](imgs/network-19.png) + +![](imgs/network-20.png) + +3. 点击 `OK` `continue`,开始连接 + +![](imgs/network-21.png) + +4. 输入 用户名: autolabor 密码: autolabor + +![](imgs/network-22.png) + +5. 点击 `OK`,成功连接到机器人上。 + + 此时桌面上弹出了一个对话框,是远程桌面软件的设置窗口,左下角勾选之后会不再显示,点击 `OK` 关闭。 + + 注:如果连接的时候显示白屏,此时系统图形化界面加载中,请等待片刻。 + + ![](imgs/network-24.png) + +*** + + +#### SSH + +此处用 windows 下的 putty 介绍,SSH 的连接方式。 + +1. 打开 putty 软件,Host: `获取到的IP地址` Port: `22`,`open` 打开。 + +![](imgs/network-44.png) + +2. 选择 `是` + +![](imgs/network-45.png) + +3. 输入 用户名:autolabor 密码:autolabor,回车连接 + +![](imgs/network-46.png) + +4. 登录成功 + +![](imgs/network-47.png) + + + + + + + + + diff --git a/navigationKit/quickStart/robotCalibration.md b/navigationKit/quickStart/robotCalibration.md new file mode 100644 index 0000000..13af748 --- /dev/null +++ b/navigationKit/quickStart/robotCalibration.md @@ -0,0 +1,123 @@ +# 里程计标定 + + + + +*** + +里程计标定也叫里程计校准,即在当前运行环境下重新计算运动模型,得到里程计的运动模型参数,此教程**只适用于使用ROS控制AP1机器人**的用户。 + +Autolabor M1 出厂时已做过标定了,在一般运行环境下(地毯、水泥、普通瓷砖等平坦路面)不用重新做标定,但如果您的运行环境是非一般环境,机器人可能就需要重新做标定,比如【经过打磨过的】并且还有【镜面效果】的水泥路面,或摩擦力较大路面,如果您觉得建图导航时效果不佳,也可以进行标定。 + +准备工作: +给M1车轮打满气,规格:胎压250kpa/36psi/2.5bar + + +## 操作步骤 + +### 一、简介 + +#### 1. 打开软件 + +进入 AutolaborOS -> 桌面 -> 测试 -> 标定 + +![](./imgs/robot_calibration1.png) + +#### 2. 功能区介绍 + + +①:车轮半径标定 + +②:转向运动系数标定 + +③:键盘控制 + +④:标定预览 + +wheel_diameter:车轮半径 + +model_param_cw:顺时针旋转运动模型参数 + +model_param_acw:逆时针旋转运动模型参数 + +标定文件中的底盘参数,数值更改后程序立即更新(暂存在内存,无法存储至实体文件中)。 + +### 二、使用 + +#### (一)车轮标定 + + +操作步骤: + +1. 在机器人【前轮】处标记此时车的位置为A +2. 点击【开始标定】 +3. 点击【激活键盘控制】,控制机器人向前【直行】约2米,此时机器人位置为B,取消勾选【激活键盘控制】 +4. 使用尺子量从A前轮至B前轮的距离S +5. 将S填写到①中距离(米)框里,点【计算结果】,得到计算后的车轮直径d' +6. 将d'填入到④中wheel_diameter处 + + +#### (二) 运动转向模型标定 + +操作步骤: + +1. 对机器人的四个轮子做标记,标记此时车的位置 +2. 点击【开始标定】 +3. 点击【激活键盘控制】,控制机器人原地360度顺时针旋转一圈,控制机器人回到刚刚标记的位置(重合),保持机器人与标记的初始位置方向一致,取消勾选【激活键盘控制】 +4. 点【计算结果】,得到计算后的转向参数m',将m'填入到④中model_param_cw处 +5. 重复执行步骤1-4,控制机器人逆时针旋转,则将m'填入到④中model_param_acw处 + +#### (三) 验证 + +此时填入④中的结果为第一次标定的结果,将得到的结果填入到①中直径框里、②中系数框里,再重复一次(一)(二)的标定步骤,如果得到的结果接近,表示标定完成。 + +记住此次的结果,将数值修改至对应的传感器驱动launch中。 + +##### 文件路径: + +``` +catkin_ws/src/launch/ +├── autolabor_navigation_launch //导航launch +│ ├── launch +│ │ ├── real_environment //实车launch +│ │ │ ├── first_generation_base.launch //单雷达版本-传感器驱动 +│ │ │ ├── second_generation_advanced_base.launch //双雷达版本-传感器驱动(含定位标签) +│ │ │ ├── second_generation_basic_base.launch //双雷达版本-传感器驱动 +│ │ │ ├── third_generation_base.launch //多线雷达版本-传感器驱动 +``` + +##### 修改参数: + +* wheel_diameter +* model_param_cw +* model_param_acw + +``` + + + + + + + + + + + + + + + + + + + + + +``` + + + + + + diff --git a/navigationKit/quickStart/rtk/develop.md b/navigationKit/quickStart/rtk/develop.md new file mode 100644 index 0000000..0a7bf30 --- /dev/null +++ b/navigationKit/quickStart/rtk/develop.md @@ -0,0 +1,93 @@ +# RTK循迹模块使用说明 +## 开发引导 + +实现RTK定位功能的软件包含两部分 RTK RAW 驱动和 RTK ROS包 + +位于src/driver/location/al_rtk_ros_driver + +rtk + +#### RTK RAW驱动 + +raw 驱动部分包含从串口获取RTK的数据进行解析 ,并包含支持千寻服务的nrtip client。 可通过配置账号和密码直接获得Fixed解的位置, 其输出格式为WGS84坐标。 + + +#### RTK ROS包 + +ROS驱动包除实现与ROS的接口外,实现了WGS84坐标系到ENU坐标的转换。ENU的直角坐标可直接被路径规划等算法使用。由于ENU坐标需要参考原点,此软件包会根据设置在第一次获得Fixed解时将当前坐标作为ENU坐标系x=0,y=0点。 + +rtk + +RTK 驱动的所有功能都通过launch文件中的 rtk node 节点进行配置 具体功能如下 + +* map_frame 定义发布位置的坐标系,默认为map 无需修改 + +* serival_device 计算机连接RTK接收机的串口地址,对于AP1套件已固定为/dev/box_3 对应USB hub#3接口。 如需在其他环境使用修改为对应串口地址即可 + +* badurate 串口通讯速率 固定为115200 不能修改 + +* domain 千寻ntrip 服务域名 无需修改 + +* account 千寻ntrip 账号 + +* password 千寻ntrip密码 + +* publish_pos_fix_only 是否只在固定解情况下发布位置。 当设置为true时,尽在RTK接收机可以解算出固定解(即误差1-2cm的高精度位置)时发布位置话题的数据,如果无法获得固定解将不发布位置信息。设置为false将不考虑当前解的状态,可能输出误差10米左右的普通定位信息。 +* auto_use_first_fix_as_enu_origin 是否使用第一次收到的固定解位置作为ENU坐标系的原点。当设置为false时将不自动设置ENU坐标系原点,需要手动调用相应方法设置。默认为true,非必要无需修改 +* origin_config_file 保存enu原点WGS84坐标的文件,如果想清除已经设定的ENU坐标原点可手动编辑此文件或将其删除 +* log_dir LOG文件输出目录 +* stderrthreshold 日志输出级别,在调试过程中可将此级别设置为0 INFO,将输出驱动内部的详细工作信息。 + +### AutolaborOS平台编译 + +由于Autolabor OS 已经包含了RTK所有需要使用的库,使编译工作变得极为简单,仅需要进入驱动目录,使用catkin 编译即可 + +可输入如下命令 + +``` +cd ~/catkin_ws/src/driver/location/al_rtk_ros_driver/ +catkin build --this +``` + +在编译前,强烈建议您清空已编译版本,并修改swap大小,进行一次完整的工作空间编译,以防止编译缓存造成的编译错误。 + +清空已编译的内容可通过如下命令实现 + +``` +cd ~/catkin_ws +catkin clean -y +``` + +由于编译过程中需要使用大量的内存,通常物理内存不能满足要求,可能出现因为内存空间不足导致的编译失败。通常编译过程会通过使用swap空间的方式确保有足够的内存,我们已经提供了自动化修改swap空间的工具 您可通过 如下命令启动,并将swap空间设置15G以上通常可以满足编译的要求。 + +``` +sudo ~/Tools/modifyswap.sh +``` + +进行整个工作空间的编译 + +``` +cd ~/catkin_ws +catkin build +``` + + + +### 自行安装ROS编译 + +al_rtk_raw_driver 依赖于[libevent](https://libevent.org/) ,编译前请确保已经安装。 + +在Ubuntu 18.04 可利用apt工具进行安装 + +``` +sudo apt update +sudo apt install libevent-dev +``` + +al_rtk_ros_driver 所依赖的库都已在源代码目录包含,可直接在项目目录编译。 + +``` +catkin build --this +``` + + diff --git a/navigationKit/quickStart/rtk/faq.md b/navigationKit/quickStart/rtk/faq.md new file mode 100644 index 0000000..4d21374 --- /dev/null +++ b/navigationKit/quickStart/rtk/faq.md @@ -0,0 +1,104 @@ +# RTK循迹模块使用说明 +## 常见问题 + +最常见导致故障有以下几种 + +- 未正确配置NRTIP服务账号密码 +- 主机没有互联网连接 +- USB接口插错 +- 主天线未连接或未连接在ANT1接口 +- 所处位置接收卫星信号不佳 + +通常启动rtk测试功能或循迹功能将会在控制台输出出错信息,通过此信息可以排除大部分故障。 + +例如: + +### 没有互联网连接 + +当出现此提示时,表示ntrip client 程序无法连接ntrip server,代表本机没有互联网连接。当出现此提示时,可打开浏览器访问常见网站,以检查是否网络连接正常。 + +![](imgs/nointernet.png) + +### USB口接口插错 + + + +当出现如下图提示时,代表驱动程序没有检测到卫星接收机硬件,造成这种情况通常时卫星接收的没有插在AP1套件USB HUB对应的#3接口上,如果您使用的不是AP1套件要确保将launch 文件中串口地址修改为您的接口地址, 通常为/dev/ttyUSB0 或者 /dev/ttyUSB1 可通过ls /dev/tty* 查看。 + +除此以外,另外一端的type-c插头要确保插在 卫星接收机的UART1 接口上, 插在UART2、UART3接口无法正常工作,如果需要使用UART2、UART3接口请修改驱动程序启用相应接口。 + + + +![](imgs/wrongusb.png) + +### 主天线未连接/连接错误 + +正常情况下,在遮挡不是极为严重的环境卫星接收机都会收到定位信息,即GPGGA消息。驱动程序会将第一包GPGGA信息发送给NTRIP服务以获取后续的差分数据。但是当主天线未连接或者未连接到ANT1接口时,卫星接收机将完全无法收到GPGGA数据,这将导致NTRIP服务等待过长时间超时,出现如下错误。 + +(当然当网络不佳的情况下,也有可能出现同样的超时错误。) + + + +![](imgs/noant1.png) + + + +### 判断故障的工具 + +#### ROS 话题 + +多数情况下,您可以通过rostopic 工具将卫星接收机的输出显示出来,以协助判断。 + +首先,您需要引入当前工作空间的环境变量,通过 + +``` +source ~/catkin_ws/devel/setup.bash +``` + +其次您可以通过 rostopic list命令显示所有的话题,确认驱动程序是否已经运行。 + +``` +rostopic list +``` + + + +![](imgs/topiclist.png) + +如果出现了/al_ros_driver/gpgga /al_ros_driver/location_pos 代表卫星接收机驱动已经工作正常。 + +/al_ros_driver/gpgga 代表卫星接收机原始的gpgga数据,即未解算的收星数据,通过如下命令可进行显示 + +``` +rostopic echo /al_ros_driver/gpgga +``` + +![](imgs/gpgga.png) + +其中包含经纬度,utc时间,收星数量,高度等信息。此为卫星接收机的原始数据,如此信息输出正常,代表卫星接收机的 USB口、主天线都连接正确。 + +/al_ros_driver/localtion_pos 话题输出的是固定解位置经ENU坐标系转换后的坐标, 此话题的数据仅仅在卫星接收机处于输出高精度固定解的时候输出。 如果此话题输出数据意味着nrtip 服务配置正确、互联网连接正常、卫星收星数量优秀,可以进行无人导航使用。 + +![](/Users/zyh/CLionProjects/AutolaborOS-ROS/catkin_ws/src/launch/rtk_tracking/imgs/rtkpos.png) + + + +#### 日志文件 + +al_rtk_raw_driver 会将所有过程以日志形式存储在 rtk_tracking/log 目录下, 通过查看日志文件可以判断卫星接收机的工作状态,可通过如下命令分别查看INFO日志和ERROR日志 + +``` +tail -f ~/catkin_ws/src/launch/rtk_tracking/log/al_rtk_driver.INFO +``` + + + +![](imgs/log_info.png) + + + +``` +tail -f ~/catkin_ws/src/launch/rtk_tracking/log/al_rtk_driver.ERROR +``` + +![](imgs/log_error.png) diff --git a/navigationKit/quickStart/rtk/imgs/account.png b/navigationKit/quickStart/rtk/imgs/account.png new file mode 100644 index 0000000..63d783c Binary files /dev/null and b/navigationKit/quickStart/rtk/imgs/account.png differ diff --git a/navigationKit/quickStart/rtk/imgs/gpgga.png b/navigationKit/quickStart/rtk/imgs/gpgga.png new file mode 100644 index 0000000..65f24a3 Binary files /dev/null and b/navigationKit/quickStart/rtk/imgs/gpgga.png differ diff --git a/navigationKit/quickStart/rtk/imgs/huawei4g.jpeg b/navigationKit/quickStart/rtk/imgs/huawei4g.jpeg new file mode 100644 index 0000000..474510d Binary files /dev/null and b/navigationKit/quickStart/rtk/imgs/huawei4g.jpeg differ diff --git a/navigationKit/quickStart/rtk/imgs/launch.png b/navigationKit/quickStart/rtk/imgs/launch.png new file mode 100644 index 0000000..77aea09 Binary files /dev/null and b/navigationKit/quickStart/rtk/imgs/launch.png differ diff --git a/navigationKit/quickStart/rtk/imgs/location_fusion.png b/navigationKit/quickStart/rtk/imgs/location_fusion.png new file mode 100644 index 0000000..df142e2 Binary files /dev/null and b/navigationKit/quickStart/rtk/imgs/location_fusion.png differ diff --git a/navigationKit/quickStart/rtk/imgs/log_error.png b/navigationKit/quickStart/rtk/imgs/log_error.png new file mode 100644 index 0000000..0886384 Binary files /dev/null and b/navigationKit/quickStart/rtk/imgs/log_error.png differ diff --git a/navigationKit/quickStart/rtk/imgs/log_info.png b/navigationKit/quickStart/rtk/imgs/log_info.png new file mode 100644 index 0000000..b43a16c Binary files /dev/null and b/navigationKit/quickStart/rtk/imgs/log_info.png differ diff --git a/navigationKit/quickStart/rtk/imgs/noant1.png b/navigationKit/quickStart/rtk/imgs/noant1.png new file mode 100644 index 0000000..1747de9 Binary files /dev/null and b/navigationKit/quickStart/rtk/imgs/noant1.png differ diff --git a/navigationKit/quickStart/rtk/imgs/nointernet.png b/navigationKit/quickStart/rtk/imgs/nointernet.png new file mode 100644 index 0000000..39a6ae2 Binary files /dev/null and b/navigationKit/quickStart/rtk/imgs/nointernet.png differ diff --git a/navigationKit/quickStart/rtk/imgs/nortk.png b/navigationKit/quickStart/rtk/imgs/nortk.png new file mode 100644 index 0000000..45ac2ce Binary files /dev/null and b/navigationKit/quickStart/rtk/imgs/nortk.png differ diff --git a/navigationKit/quickStart/rtk/imgs/project.png b/navigationKit/quickStart/rtk/imgs/project.png new file mode 100644 index 0000000..6f663a6 Binary files /dev/null and b/navigationKit/quickStart/rtk/imgs/project.png differ diff --git a/navigationKit/quickStart/rtk/imgs/rtk_run1.png b/navigationKit/quickStart/rtk/imgs/rtk_run1.png new file mode 100644 index 0000000..82fdcf3 Binary files /dev/null and b/navigationKit/quickStart/rtk/imgs/rtk_run1.png differ diff --git a/navigationKit/quickStart/rtk/imgs/rtk_run2.png b/navigationKit/quickStart/rtk/imgs/rtk_run2.png new file mode 100644 index 0000000..faf617c Binary files /dev/null and b/navigationKit/quickStart/rtk/imgs/rtk_run2.png differ diff --git a/navigationKit/quickStart/rtk/imgs/rtkpos.png b/navigationKit/quickStart/rtk/imgs/rtkpos.png new file mode 100644 index 0000000..1f076e7 Binary files /dev/null and b/navigationKit/quickStart/rtk/imgs/rtkpos.png differ diff --git a/navigationKit/quickStart/rtk/imgs/rtktest_success.png b/navigationKit/quickStart/rtk/imgs/rtktest_success.png new file mode 100644 index 0000000..b609b5c Binary files /dev/null and b/navigationKit/quickStart/rtk/imgs/rtktest_success.png differ diff --git a/navigationKit/quickStart/rtk/imgs/rtktesticon.png b/navigationKit/quickStart/rtk/imgs/rtktesticon.png new file mode 100644 index 0000000..ced8323 Binary files /dev/null and b/navigationKit/quickStart/rtk/imgs/rtktesticon.png differ diff --git a/navigationKit/quickStart/rtk/imgs/rtktesticon2.png b/navigationKit/quickStart/rtk/imgs/rtktesticon2.png new file mode 100644 index 0000000..2a4b6c0 Binary files /dev/null and b/navigationKit/quickStart/rtk/imgs/rtktesticon2.png differ diff --git a/navigationKit/quickStart/rtk/imgs/rtktestmove.gif b/navigationKit/quickStart/rtk/imgs/rtktestmove.gif new file mode 100644 index 0000000..bae7c68 Binary files /dev/null and b/navigationKit/quickStart/rtk/imgs/rtktestmove.gif differ diff --git a/navigationKit/quickStart/rtk/imgs/saler.png b/navigationKit/quickStart/rtk/imgs/saler.png new file mode 100644 index 0000000..a6ddd68 Binary files /dev/null and b/navigationKit/quickStart/rtk/imgs/saler.png differ diff --git a/navigationKit/quickStart/rtk/imgs/topiclist.png b/navigationKit/quickStart/rtk/imgs/topiclist.png new file mode 100644 index 0000000..5c54a73 Binary files /dev/null and b/navigationKit/quickStart/rtk/imgs/topiclist.png differ diff --git a/navigationKit/quickStart/rtk/imgs/wrongusb.png b/navigationKit/quickStart/rtk/imgs/wrongusb.png new file mode 100644 index 0000000..a624a7e Binary files /dev/null and b/navigationKit/quickStart/rtk/imgs/wrongusb.png differ diff --git a/navigationKit/quickStart/rtk/install.md b/navigationKit/quickStart/rtk/install.md new file mode 100644 index 0000000..ac6e04c --- /dev/null +++ b/navigationKit/quickStart/rtk/install.md @@ -0,0 +1,84 @@ +# RTK循迹模块使用说明 +## 安装设置 +### 互联网连接 +由于RTK定位的原理需要使用通过网络分发的差分信号,首先要确保您的AP1套件已经连接互联网,考虑到信号质量和工作范围建议您使用4G网络。如果您手头没有4G路由器和数据卡可从京东等渠道购买。 + + +我们建议采用USB接口的华为4G随身WIFI,此设备经过我们验证可正常工作。在京东等渠道有包含数据卡的套装出售。 + +华为4G随身WIFI +华为4G随身WIFI + + +检查物联网连接的方式可通过使用Firefox浏览器访问qq.com 等常见网站,如网站可正常显示则互联网连接已经可用。 + +### NTRIP服务账号 + +RTK接收,差分信号有几种形式,可自建基站,也可使用已有的差分服务。NTRIP是一种差分服务的协议,目前是服务商提供服务的主流。Autolabor RTK驱动中内置了差分服务商[千寻™](https://www.qxwz.com/)的支持,可直接去其官网购买NTRIP账号。 当然也可以通过我们的商务人员通过折扣价购买。 + +销售人员 +Autolabor商务人员 + + +目前Autolabor RTK 驱动程序仅支持互联网差分服务和千寻服务商。之后会通过软件升级的方式支持其他互联网服务商和自建基站的模式。 + + +#### 配置账号 + +位于桌面的硬件测试快捷方式和RTK循迹快捷方式会启动不同的launch文件,需要分别配置账号。 + +####硬件测试launch文件 + +1.通过Ctrl+Alt+T 打开控制台 + +2.输入如下命令 + +> sudo gedit ~/catkin_ws/src/launch/rtk_tracking/rtk_tracking.launch + +3.编辑 account 和 passsword 节点的value字段内容, 输入您的账号和密码。 + + + +请仔细核对账号内容和双引号正确,否则一旦工作不正常难以查找原因。 + +4.点击 Save按钮,保存退出 + +####RTK巡线launch文件 +1.通过Ctrl+Alt+T 打开控制台 + +2.输入如下命令 + +> sudo gedit ~/catkin_ws/src/launch/rtk_tracking/rtk_test.launch + +3.编辑 account 和 passsword 节点的value字段内容, 输入您的账号和密码。 + + + +请仔细核对账号内容和双引号正确,否则一旦工作不正常难以查找原因。 + +4.点击 Save按钮,保存退出 + +####RTK巡线脚本 + +### 电气连接 + +#### 天线 + +1.连接主信号线 + +随机附带有两根信号线,用于连接接收机和天线,其中较短的一根为主信号线。将其一端连接在RTK接收机的ANT1接口,并将另外一端连接位于雷达上方的天线。 + +2.连接次信号线 +将较长一根信号线连接与接收机ANT2接口,并将另一端连接位于车尾处天线。 + +主天线用于获取定位的位置信息,次信息线用户获取方向信息。由于当前采用融合算法生成方向信息,次天线可以不接。 + +#### USB数据线 + +将Type-C USB接口一端连接在RTK接收机的UART1接口。 另一端连接在USB HUB的3#接口。 + +注意,由于软件绑定了相应的接口,两端接口不可改变。 + + + + diff --git a/navigationKit/quickStart/rtk/principle.md b/navigationKit/quickStart/rtk/principle.md new file mode 100644 index 0000000..2fdbff2 --- /dev/null +++ b/navigationKit/quickStart/rtk/principle.md @@ -0,0 +1,43 @@ +# RTK循迹模块使用说明 +## 工作原理 + +卫星接收接收到的WGS84坐标(即经纬度),并不能直接提供给导航和路径规划使用,需要将其转换为平面直角坐标系的坐标。因此al_rtk_ros_driver 将 WGS84坐标转换为ENU坐标后输出。 在转化过程中需要指定一个ENU坐标系的原点坐标,即ENU坐标系的x=0,y=0 对应的经纬度是多少。 为了使用上的方便,al_rtk_ros_driver 会将第一次收到RTK固定解的经纬度坐标设置为ENU坐标系原点。当然您也可以通过参数关闭此功能手动设置。 + + + +获得平面直角坐标后,并不能直接用于导航定位,主要原因在于 + +1.卫星接收机的定位数据频率太低(1Hz) + +2.仅有位置无法获悉方向。 + +因此,需要将卫星的ENU坐标与里程计进行融合,输出频率更高的位姿以提供给定位导航算法。 + +这一过程是由Autolabor自行研发的一个简单位置融合算法实现的,源代码位于/src/navgation/location_fusion/simple_fusion.cpp + +在launch文件中相应配置为。 + +![](imgs/location_fusion.png) + + + +此融合算法的原理也很简单, 将里程计输出的一系列位置点与ENU的一系列位置点进行匹配。 并发布 odom 坐标系和 map 坐标系之间的变换(我们的卫星定位是绝对的,使用map坐标系)。 + +在进行路线录制时,按照里程计每一定间隔记录base_link 位于 map坐标系的坐标,作为路线的“路点”。 一系列路点组成了一条路线。 + +循迹过程中 path_server 会将路线从文件中读出,并作为/recorded_path 话题发布。 + +LoopPathPlanner 作为全局路径规划器在收到/recorded_path.的数据后,将结合机器人的位置决定将路线未走到的部分作为全局路径规划发布,并为局部路径规划器指定下一个目标。 + +在完成整条路线后,如果设置loop 和 round都设置为true, 则LoopPathPlanner则会路点顺序反转,实现从路线结尾走回到路线开始。 + +默认配置中,使用teb_local_planner作为局部路径规划器,以实现遇到障碍物灵活的绕行行为。 + +因为teb_local_planner主要使用优化的方法进行路径规划,其行为较为灵活的同时较不为可控,可能出现预期之外的行为。这种预期之外的行为不一定适应所有使用情景。 + +如果需要严格循线的效果,可将teb路径规划器更换为carrot_planner 或者自行开发局部路径规划算法。 + + + + + diff --git a/navigationKit/quickStart/rtk/use.md b/navigationKit/quickStart/rtk/use.md new file mode 100644 index 0000000..57cd266 --- /dev/null +++ b/navigationKit/quickStart/rtk/use.md @@ -0,0 +1,52 @@ +# RTK循迹模块使用说明 +## 使用步骤 + +### 硬件测试 + +请点击位于桌面硬件测试文件夹内RTK测试的图标 + +![](imgs/rtktesticon.png)-->![](imgs/rtktesticon2.png) + + + +等待若干秒后 rviz将自动启动, 静待几十秒钟待RTK达到收星数量,将会在地图中心显示一紫色圆形,代表卫星接收机已经达到足够的收星数量,并成功输出了固定解位置,即实现了高精度的RTK定位。此圆形代表WGS84经纬度坐标系转化到ENU坐标系的坐标。 + +获得RTK高精度定位的速度取决于测试环境的情况,测试环境越开阔无遮挡获得固定位置解的速度越快,通常可在1分钟之内完成。如周围有较高建筑或者山峰则可能无法达到获得固定解位置的收星数要求,无法获得固定解的位置。 + +如果测试环境良好但无法出现下图的情况,请参考[故障排除](## 故障排除)章节处理。 + +![](imgs/rtktest_success.png) + + + +小范围移动主天线的位置,界面紫点会同时移动,即表示工作正常,可以进行下一步RTK循线的测试。 + +![](imgs/rtktestmove.gif) + + + + + + + +### 录制RTK路线 + +请将AP1套件置于室外空阔卫星收星良好处,并确保已经正确配置nrtip 账号,具备互联网连接。在进行完RTK硬件测试,确认RTK接收机工作正常后,双击打开桌面北斗RTK室外循迹文件夹,点击运行 RTK循迹 + +![](imgs/rtk_run1.png)->![](imgs/rtk_run2.png) + + + +等待几十秒钟,待屏幕出现紫色原点,表明RTK已经获得固定解位置,出于差分工作状态。 + +使用键盘上下左右按钮,遥控机器人前进约1m,使里程计与卫星定位位置融合校准。在遥控过程中可观察到机器人位置突然跳了一下,即意味已经融合校准完成。 + +点击录制路径按钮,同时使用键盘遥控机器人行进,将看到一条白线绘制到小车经过区域,该线即为录制的路线。 + +遥控完成所有路线后,点击保存路线按钮,即将路线保存到 /src/navigation/path_server/path_data/default_path.path 中。 + +### 沿路线自动导航 + +启动RTK循迹功能,完成里程计与卫星定位融合校准后,使用键盘将机器人遥控到路线起点附近,点击“开始任务"即可。在循迹过程中机器人会根据障碍物情况进行绕行,在任何时刻点击“取消任务“可终止循线。 + + diff --git a/navigationKit/quickStart/vzense/imgs/vzense1.png b/navigationKit/quickStart/vzense/imgs/vzense1.png new file mode 100644 index 0000000..ed1d430 Binary files /dev/null and b/navigationKit/quickStart/vzense/imgs/vzense1.png differ diff --git a/navigationKit/quickStart/vzense/imgs/vzense2.jpg b/navigationKit/quickStart/vzense/imgs/vzense2.jpg new file mode 100644 index 0000000..ceba654 Binary files /dev/null and b/navigationKit/quickStart/vzense/imgs/vzense2.jpg differ diff --git a/navigationKit/quickStart/vzense/imgs/vzense3.png b/navigationKit/quickStart/vzense/imgs/vzense3.png new file mode 100644 index 0000000..87289e5 Binary files /dev/null and b/navigationKit/quickStart/vzense/imgs/vzense3.png differ diff --git a/navigationKit/quickStart/vzense/imgs/vzense4.png b/navigationKit/quickStart/vzense/imgs/vzense4.png new file mode 100644 index 0000000..2195c44 Binary files /dev/null and b/navigationKit/quickStart/vzense/imgs/vzense4.png differ diff --git a/navigationKit/quickStart/vzense/imgs/vzense5.png b/navigationKit/quickStart/vzense/imgs/vzense5.png new file mode 100644 index 0000000..fe9dc4a Binary files /dev/null and b/navigationKit/quickStart/vzense/imgs/vzense5.png differ diff --git a/navigationKit/quickStart/vzense/imgs/vzense6.png b/navigationKit/quickStart/vzense/imgs/vzense6.png new file mode 100644 index 0000000..2560b79 Binary files /dev/null and b/navigationKit/quickStart/vzense/imgs/vzense6.png differ diff --git a/navigationKit/quickStart/vzense/intro.md b/navigationKit/quickStart/vzense/intro.md new file mode 100644 index 0000000..f8eb2e0 --- /dev/null +++ b/navigationKit/quickStart/vzense/intro.md @@ -0,0 +1,42 @@ +# 简介 + +## Vzense DCAM710 + +![](./imgs/vzense1.png) +![](./imgs/vzense3.png) + + +## 结构图 + +![](./imgs/vzense2.jpg) + + +## 基本参数 + +| 项目 | 规格 | +| ------------------- | --------------- | +|尺寸 | 103mmx33mmx22mm| +| 传感器 | ToF CCD+RGB | +| 激光发射器 |940nm VCSEL | +| ToF分辨率帧率 | 640X480, Max.30fps| +|RGB分辨率帧率|1920X1080, 30fps| +| ToF FOV | 69°(H) × 51°(V) | +| RGB FOV | 73°(H)X42°(V) | +| 输出格式 | RAW12(深度,IR), MJPEG(RGB)| +|检测距离|0.35m~4.4m| +|工作温度|-10℃~50℃| + + + + + + + + + + + + + + + diff --git a/navigationKit/quickStart/vzense/use.md b/navigationKit/quickStart/vzense/use.md new file mode 100644 index 0000000..ccbc00e --- /dev/null +++ b/navigationKit/quickStart/vzense/use.md @@ -0,0 +1,127 @@ +# 使用 + +## 准备 + +1. 连接相机的数据线与电源线 +2. 相机亮起指示灯(绿色说明数据线连接正确,红色说明数据线与电源线均连接正确) +3. 指示灯亮起代表相机功能正常,可开始使用 + +## 测试 + +进入桌面 测试 - > pico 深度相机测试 + +![](./imgs/vzense4.png) + +## 启动驱动 + +步骤: + +1.进入工作空间,打开终端执行 + `cd catkin_ws` +2.配置环境变量,在终端执行 + `source devel/setup.bash` +3.启动驱动,在终端执行 + `roslaunch pico_zense_driver pico_driver.launch` +4.打开终端,执行 `rviz` ,打开RViz,可看到相机的点云数据 +![](./imgs/vzense5.png) +注:相机数据加载需要几秒钟 + +## ROS驱动包(ROS Driver Package) + +注:OS系统中使用的Vzense相机ROS驱动包是Autolabor根据相机厂家提供的SDK开发的,非相机厂家提供。 + + +### 发布的话题 +/pico\_camera/depth\_image ([sensor_msgs/Image](http://docs.ros.org/en/api/sensor_msgs/html/msg/Image.html)) +深度图像 + +/pico\_camera/color\_image([sensor_msgs/Image](http://docs.ros.org/en/api/sensor_msgs/html/msg/Image.html)) +rgb图像 + +/pico\_camera/point\_cloud([sensor_msgs/PointCloud](http://docs.ros.org/en/api/sensor_msgs/html/msg/PointCloud.html)) +点云 + + + +### 参数 + +| 参数 | 名称 | 备注 | +| :------------ | :------------ | :------------ | +| ~namespace (str, default: pico_camera) | 命名空间 | 多个同一传感器重命名 | +| ~frame_name (str, default: pico_camera) | frameId | | +| ~device_index (int, default: 0) | 设备索引 | | +| ~read_frame_interval (int, default: 100) | 输出时间间隔 | 单位:毫秒 | +| ~depth_range (int, default: 0) | 深度范围(参数:0/2/5) | 设置值越大看的越远 | +| ~background_filter_threshold (int, default: 20) | 滤波参数(最大100) | 设置值越大,去的点越多(噪音和非噪音都会被去掉) | +| ~skip_row (int, default: 0) | 每一行中跳过显示的点 | 如设置为1,则跳1个点选1个点显示,一行最多640个点 | +| ~skip_column (int, default: 0) | 每一列中跳过显示的点 | 如设置为1,则跳1个点选1个点显示,一列最多480个点 | +| ~output_depth_image (bool, default: false) | 输出深度图像 | 节约性能,默认不输出 | +| ~output_color_image (bool, default: false) | 输出rgb图像 | 节约性能,默认不输出 | +| ~output_point_cloud (bool, default: true) | 输出点云 | | +| ~depth_spatial_filter (bool, default: true) | 是否使用空间滤波 | | +| ~depth_time_filter (bool, default: true) | 是否使用时间滤波 | | +| ~depth_distortion_correction (bool, default: true) | 是否使用畸变矫正 | | +| ~depth_straighten_correction (bool, default: true) | 是否使用扭曲矫正 | | + +### 驱动示例 + + +``` + + + + + + + + + + + + + + + + + + + + + +``` + +## 查看rbg图像 + +1.找到相机驱动launch文件,修改参数 + +`catkin_ws\src\driver\depth_camera\pico_zense_driver\launch\pico_driver.launch` + +2.选择文件右键编辑,将 `output_color_image` 改为 `true` + +3.保存并关闭文件 + +4.进入工作空间,打开终端执行 + `cd catkin_ws` + +5.配置环境变量,在终端执行 + `source devel/setup.bash` + +6.启动驱动,在终端执行 + `roslaunch pico_zense_driver pico_driver.launch` + +7.打开终端,执行 `rviz` ,打开RViz +![](./imgs/vzense5.png) + +8.添加图像话题,点击左下角 `add`,选择 /pico_camera->color_image ,保存 +![](./imgs/vzense6.png) + + + + +## 资料 + +* [使用手册](https://cdn.yun.sooce.cn/4/62267/pdf/16361729745086d56be7b53bba3eb.pdf) +* 软件工具及SDK:[github](https://github.com/Vzense)/[gitee](https://gitee.com/Vzense) +* [固件](https://github.com/Vzense/DeviceFirmware-List/tree/master/DCAM710) +* [3D 模型](https://cdn.yun.sooce.cn/4/62267/zip/1636172974507357d659567a57bad.zip) +* [FAQ](https://zh.vzense.com/FAQ.html) \ No newline at end of file diff --git a/navigationKit/receivingGuide/imgs/slamSet-label.png b/navigationKit/receivingGuide/imgs/slamSet-label.png new file mode 100644 index 0000000..11dcdda Binary files /dev/null and b/navigationKit/receivingGuide/imgs/slamSet-label.png differ diff --git a/navigationKit/receivingGuide/inspection.md b/navigationKit/receivingGuide/inspection.md new file mode 100644 index 0000000..f34ccaf --- /dev/null +++ b/navigationKit/receivingGuide/inspection.md @@ -0,0 +1,42 @@ +# 收货指南 + + +Autolabor Pro1 机器人发货清单: + +| 序号 | 名称 | 发货数量(件) | 明细 | +| -------- | -------- | ---- |---- | +| 1 | Autolabor M1 3D+RTK版 | 3 | 机器人底盘 x1
导航套件 x1
显示器 x1 | +| 2 | Autolabor M1 RTK版 | 3 | 机机器人底盘 x1
导航套件 x1
显示器 x1 | +| 3 | Autolabor M1 3DSLAM版 | 3 | 机器人底盘 x1
导航套件 x1
显示器 x1 | +| 4 | Autolabor M1 底盘版 | 1 | 机器人底盘 x1 | + + +## 检查 + +收到货后请不要急于签收,先检查外包装有无破损,如包装破损或贴于外包装上的防震标签感应器显示为红色,请拍照为证,并与快递员一同开箱验货,确认无误后再签收,如需帮助可联系 Autolabor 客户服务平台。 + +![](imgs/slamSet-label.png) + +# 清点 + +温馨提示: + +* 收件后打开包装,对照产品装箱单进行清点,如有短缺请于三日内联系客服,过期不补。 +* 请保留原厂外包装箱用于售后。 +* 部分配件可能随版本升级有所改动,但不影响性能,恕不另行通知。 + +*** + +