matlab自动驾驶算法——R2020b:
检测 定位 跟踪&融合 规划 控制
道路建模 :RoadRunner导入,同时也支持OpenDrive与Open street map的 导入
交通参与者建模 传感器(毫米波雷达、激光雷达、IMU、GPS)、动力学建模
自适应巡航:前方没有车辆时会保持在该车道上继续进行行驶,当前方有车辆出现时,会与前方车辆保持一定距离,并且进行跟车行驶。
通过stateflow模拟信号灯传感器 地图
百度搜索open street map,下载该格式的
初始化工作空间
mkdir -p demo_ros/src
cd demo_ros/
catkin_make
创建功能包
catkin_create_pkg helloworld roscpp rospy std_msgs
注意:roscpp是使用c++实现的库,rospy是使用python实现的库,std_msgs是标准消息库
实际编程中,roscpp库旨在成为ROS的高性能库,rospy旨在提高开发效率,一般用于对性能无要求的场景
~/demo_ros/src/helloworld/src$ touch helloworld_c.cpp
写入以下内容
// 1.包含ros的头文件
#include "ros/ros.h"
// 2.编写main函数
int main(int argc,char *argv[]){
// 3.初始化ros节点,字符串中的hello_node为节点名称
ros::init(argc,argv,"hello_node");
// 4.输出日志
ROS_INFO("hello world!");
return 0;
}
CMakeLists.txt中写入内容:
其中hah为映射,可随意写,但实际应用中一般将其保持与源文件名称的一致性
add_executable(haha src/helloworld_c.cpp)
target_link_libraries(haha
${catkin_LIBRARIES}
)
接下来重新编译并运行
catkin_make
source ./devel/setup.bash
rosrun helloworld haha
其中helloworld为功能包名称,haha为helloworld_c.cpp的映射
配置环境变量中的./表示在当前目录下
针对不同终端下均需要重新配置环境变量的问题:
在主目录下,ctrl+H找到.bashrc,并在其中写入内容:
source ~/demo_ros/devel/setup.bash
或者使用
gedit ~/.bashrc
然后生效一下:
source .bashrc
在功能包中新建文件夹scripts,并新建文本文档helloworld_p.py
写入以下内容:
#! /usr/bin/env python
#coding:utf-8
# 指定解释器
# 1.导包
import rospy
# 2.编写主入口
if __name__ == "__main__":
# 3.初始化ROS节点
rospy.init_node("hello_p")
# 4.输出日志
rospy.loginfo("hello world! by python")
其中:#coding:utf-8必须加入,否则python中只要写入中文字体均会报错
为该python程序添加可执行权限
chmod +x *.py
catkin_install_python(PROGRAMS scripts/自定义文件名.py
DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION}
)
编写该配置文件的原因是:
(1)正确的安装python脚本;(2)定位合适的解释器去执行python脚本
4.运行程序:
rosrun helloworld helloworld_p.py
5.若python程序不进行CamkeList.txt 的配置——解决方案
其在调用python第三方库的时候可能需要用到,因此需要知道其解决方案
若不配置会抛出异常 : /usr/bin/env: “python”: 没有那个文件或目录
解决方案
(1)解决1:
#!/usr/bin/env python3
直接使用 python3 但存在问题: 不兼容之前的 ROS 相关 python 实现
(2)解决2:
创建一个链接符号到 python 命令:
sudo ln -s /usr/bin/python3 /usr/bin/python
sudo apt install terminator
第一部份:关于在同一个标签内的操作
Alt+Up //移动到上面的终端
Alt+Down //移动到下面的终端
Alt+Left //移动到左边的终端
Alt+Right //移动到右边的终端
Ctrl+Shift+O //水平分割终端
Ctrl+Shift+E //垂直分割终端
Ctrl+Shift+C //复制选中的内容到剪贴板
Ctrl+Shift+V //粘贴剪贴板的内容到此处
Ctrl+Shift+W //关闭当前终端
Ctrl+Shift+Q //退出当前窗口,当前窗口的所有终端都将被关闭
Ctrl+Shift+X //最大化显示当前终端
Ctrl+Shift+Z //最大化显示当前终端并使字体放大
Ctrl+Shift+N or Ctrl+Tab //移动到下一个终端
Ctrl+Shift+P or Ctrl+Shift+Tab //Crtl+Shift+Tab 移动到之前的一个终端
第二部份:有关各个标签之间的操作
F11 //全屏开关
Ctrl+Shift+T //打开一个新的标签
Ctrl+PageDown //移动到下一个标签
Ctrl+PageUp //移动到上一个标签
Ctrl+Shift+PageDown //将当前标签与其后一个标签交换位置
Ctrl+Shift+PageUp //将当前标签与其前一个标签交换位置
Ctrl+Plus (+) //增大字体
Ctrl+Minus (-) //减小字体
Ctrl+Zero (0) //恢复字体到原始大小
Ctrl+Shift+R //重置终端状态
Ctrl+Shift+G //重置终端状态并clear屏幕
Super+g //绑定所有的终端,以便向一个输入能够输入到所有的终端
Super+Shift+G //解除绑定
Super+t //绑定当前标签的所有终端,向一个终端输入的内容会自动输入到其他终端
Super+Shift+T //解除绑定
Ctrl+Shift+I //打开一个窗口,新窗口与原来的窗口使用同一个进程
Super+i //打开一个新窗口,新窗口与原来的窗口使用不同的进程
1.下载
vscode 下载:https://code.visualstudio.com/docs?start=true
历史版本下载链接: https://code.visualstudio.com/updates
2.vscode 安装
sudo dpkg -i xxxx.deb
(1)进入 xxx_ws 启动 vscode
cd xxx_ws
code .
(2)vscode 中编译 ros
快捷键 ctrl + shift + B 调用编译,选择:catkin_make:build
可以点击配置设置为默认,修改.vscode/tasks.json 文件
{
// 有关 tasks.json 格式的文档,请参见
// https://go.microsoft.com/fwlink/?LinkId=733558
"version": "2.0.0",
"tasks": [
{
"label": "catkin_make:debug", //代表提示的描述性信息
"type": "shell", //可以选择shell或者process,如果是shell代码是在shell里面运行一个命令,如果是process代表作为一个进程来运行
"command": "catkin_make",//这个是我们需要运行的命令
"args": [],//如果需要在命令后面加一些后缀,可以写在这里,比如-DCATKIN_WHITELIST_PACKAGES=“pac1;pac2”
"group": {"kind":"build","isDefault":true},
"presentation": {
"reveal": "always"//可选always或者silence,代表是否输出信息
},
"problemMatcher": "$msCompile"
}
]
}
(3)针对代码不自动补齐问题
修改 .vscode/c_cpp_properties.json
设置 “cppStandard”: “c++17”
完整代码如下所示:
{
"configurations": [
{
"browse": {
"databaseFilename": "",
"limitSymbolsToIncludedHeaders": true
},
"includePath": [
"/opt/ros/melodic/include/**",
"/home/lc/demo_ros/src/helloworld/include/**",
"/usr/include/**"
],
"name": "ROS",
"intelliSenseMode": "gcc-x64",
"compilerPath": "/usr/bin/gcc",
"cStandard": "gnu11",
"cppStandard": "c++17",
"compileCommands": "${workspaceFolder}/build/compile_commands.json",
"configurationProvider": "ms-vscode.cmake-tools"
}
],
"version": 4
}
(4)快捷键的使用
删除当行:ctrl+shift+k
注释:ctrl+/
显示与隐藏下方终端:ctrl+~
(5) 创建 ROS 功能包
选定 src 右击 —> create catkin package
设置包名 添加依赖
(6)c++程序编写问题:
当ROS__INFO 终端输出有中文时,会出现乱码
INFO: ???
c++乱码解决办法:在函数开头加入下面代码的任意一句
setlocale(LC_CTYPE, "zh_CN.utf8");
setlocale(LC_ALL, "");
如下所示:
#include"ros/ros.h"
int main(int argc,char *argv[]){
// 解决乱码问题
setlocale(LC_ALL,"");
// setlocale(LC_CTYPE,"zh_CN.utf8")
ros::init(argc,argv,"hello_node");
ROS_INFO("hello world,你好!");
return 0;
}
(7)python程序编写
#! /usr/bin/env python
#coding:utf-8
# 导包
import rospy
# 入口
if __name__=="__main__":
# 初始化ros节点
rospy.init_node("hello_p")
# 输出日志
rospy.loginfo("hello vscode! 这是python!")
rqt_graph
ROS是进程(也称为Nodelet)的分布式框架
ROS基本通信机制的三种实现策略:
话题通讯(发布通讯模式)—适用于不断更新的数据传输相关应用场景
服务通讯(请求响应模式)
参数服务器(参数共享模式)
rosrun plumbing_pub_sub demo02_sub
rosrun plumbing_pub_sub demo01_pub
roscore
rostopic echo /fang(此处写话题名称)
rqt_graph
python程序
赋予其可执行权限
=chmod +x *.py=
(2)自定义消息类型
1)首先建立文件夹写入msg——Person.msg
string name
int32 age
float32 height
2)编辑配置文件package.xml与CMakeLists.txt
3)ctrl+shift+B编译一下
4.1)c++需要调用的中间文件
然后将搜索到的路径添加到c_cpp_properties.json
"/home/lc/demo_ros/devel/include/**"
4.2) python需要调用的中间文件
然后将搜索到的路径添加到settings.json
"/home/lc/demo_ros/devel/lib/python2.7/dist-packages"
5.1)demo03_pub_person.cpp
加入头文件
#include"plumbing_pub_sub/Person.h"
其余正常编写
5.2)demo03_pub_person.py
加入头文件
from plumbing_pub_sub.msg import Person#发布的消息类型
其余正常编写
6)将.cpp文件在CMakeLists.txt中进行配置
add_executable(demo03_pub_person src/demo03_pub_person.cpp)
target_link_libraries(demo03_pub_person
${catkin_LIBRARIES}
)
此外为了防止编写好msh文件后未进行编译,而.cpp文件又需要导入其编译后的头文件,因此还需要配置一行来解决此遗忘问题——出错了
# 确保先编译完msg文件,再编译该cpp文件,但是其添加后出错了——原因尚未找到
add_dependencies(demo03_pub_person ${PROJECT_NAME}_generate_messages_cpp)
7.1)再次进行编译即可——cpp文件
rosrun plumbing_pub_sub demo03_pub_person
rosrun plumbing_pub_sub demo04_sub_person
source ./devel/setup.bash
rostopic echo /LiaoTian
rqt_graph
7.2)再次进行编译即可——python文件
rosrun plumbing_pub_sub demo04_sub_person_p.py
rosrun plumbing_pub_sub demo03_pub_person_p.py
请求响应模式——一种应答机制——适用于对实时性要求高,具有一定逻辑处理的场景
(1)服务器端程序编译执行
rosrun plumbing_server_client demo01_server
端口1中会同步显示端口2输入的结果值
端口2输入结果值,发现sum出错
改进方法——加入程序
response.sum=sum;
bool doNums(plumbing_server_client::Addints::Request &request,
plumbing_server_client::Addints::Response &response){
//1.处理请求
int num1=request.num1;
int num2=request.num2;
ROS_INFO("收到的请求数据是:num1=%d,num2=%d",num1,num2);
//2.组织响应
int sum=num1+num2;
response.sum=sum;
ROS_INFO("求得的结果是:sum=%d",sum);
return true;
}
(2)客户端程序编译执行
端口中动态输入数值,实现服务器端的动态响应。修改了开始在客户端中将两个参数数值写死的内容
(1)服务器端测试
rosrun plumbing_server_client demo01_server_p.py
概念:
用于实现不同节点间的数据共享——一般用于存在数据共享的一些应用场景
作用
存储一些多节点共享的数据,类似于全局变量
注意:
其不是为高性能而设计的,最好用于存储静态的非二进制的简单数据
需求:
实现参数服务器的增删改查操作
目的:熟悉、强化通信模式应用
(1)node节点替换
被替换节点:rosrun turtlesim turtle_teleop_key
(2)话题+消息——ros命令+计算图
话题与消息查看:
消息格式查看:
(3)编码
弧长=半径时,其所对应的角度为1rad
1)方式1:直接以命令方式控制其进行圆周运动——其有局限性,只能进行一些简单控制,不能进行复杂的逻辑控制
2)以程序方式控制乌龟运动
新建功能包,并添加依赖geometry_msgs、roscpp、 rospy、std_msgs
c++节点
rosrun plumbing_test test01_pub_twist
python节点
rosrun plumbing_test test01_pub_twist_p.py
追加节点turtlesim
package.xml
turtlesim
turtlesim
CMakeLists.txt
add_executable(test02_sub_pose src/test02_sub_pose.cpp)
target_link_libraries(test02_sub_pose
${catkin_LIBRARIES}
)
运行
rosrun plumbing_test test02_sub_pose
1)c++程序
rosrun plumbing_test test03_service_client
2)python程序
rosrun plumbing_test test03_service_client_p.py
(1)直接基于命令方式修改
注意:参数服务
(2)直接基于程序修改背景颜色
1)基于c++程序
先启动参数配置程序,再启动乌龟节点,此时会发现颜色改变了
rosrun plumbing_test test04_param
rosrun turtlesim turtlesim_node
2)基于python程序
rosrun plumbing_test test04_param_p.py
3)启动乌龟节点时,直接设置参数
rosrun turtlesim turtlesim_node _background_r:=100 _background_g=0 _background_b=0
4)通过launch文件传参
话题类型:/cmd_vel
消息类型:geometry_msgs::Twist
ros::Publisher pub=nh.advertise("/cmd_vel",10);
订阅的话题:/cmd_vel
发布的话题:/current 电流信息
/remaining_battery 剩余电池电量
/voltage 电压信息
/wheel_odom 轮速里程计
std_msgs/Header header // 数据的消息头
uint32 seq // 数据的序号
time stamp // 数据的时间戳
string frame_id // 数据的坐标系
float32 angle_min // 雷达数据的起始角度(最小角度)
float32 angle_max // 雷达数据的终止角度(最大角度)
float32 angle_increment // 雷达数据的角度分辨率(角度增量)
float32 time_increment // 雷达数据每个数据点的时间间隔
float32 scan_time // 当前帧数据与下一帧数据的时间间隔
float32 range_min // 雷达数据的最小值
float32 range_max // 雷达数据的最大值
float32[] ranges // 雷达数据每个点对应的在极坐标系下的距离值
float32[] intensities // 雷达数据每个点对应的强度值
每次扫描增加的角度:angle_increment=(angle_max-angle_min)/range size
(1)写头文件.h
(2) 通过pwd命令获取头文件位置,将其添加到 .vscode 下 c_cpp_properties.json 的 includepath属性。——此时添加的头文件便不再报错了
"/home/用户/工作空间/src/功能包/include/**"
(3)配置cmake
1)加入include
include_directories(
include
${catkin_INCLUDE_DIRS}
)
2)add_dependencies
add_dependencies(hello ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS})
3)常用cpp配置
add_executable(hello src/hello.cpp)
target_link_libraries(hello
${catkin_LIBRARIES}
)
(1)通过pwd命令获取头文件位置,将其添加到 .vscode 下 c_cpp_properties.json 的 includepath属性。——此时添加的头文件便不再报错了
(2)配置cmake
1)库的配置
include_directories(
include
${catkin_INCLUDE_DIRS}
)
#声明c++库
add_library(head_src
include/${PROJECT_NAME}/hello.h
src/hello.cpp
)
add_dependencies(head_src ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS})
target_link_libraries(head_src
${catkin_LIBRARIES}
)
2)可执行文件配置
target_link_libraries需要链接到之前的c++库
add_executable(use_hello src/use_hello.cpp)
add_dependencies(use_hello ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS})
target_link_libraries(use_hello
head_src
${catkin_LIBRARIES}
)
结果显示下边一行代码出错了,找不到use_hello ,将其注释掉就编译成功了
add_dependencies(use_hello ${${PROJECT_NAME}_EXPORTED_TARGETS}
pythonA调用pythonB中的变量
pythonB
import pythonA
然后直接使用该变量即可
元功能包是一个虚包,其没有任何实质性的内容,因此不需要添加依赖
navigation moveit turtlebot3
作用:基于一个包便可以将其他相关的软件包组织到一起安装
实现步骤:
(1)创建无任何依赖的功能包
(2)修改package.xml,添加所需要一块打包的功能包
plumbing_pub_sub
plumbing_server_client
plumbing_param_server
(3)修改CMakeLists.txt,仅添加这四行,其余全部删除
cmake_minimum_required(VERSION 3.0.2)
project(plumbing_my)
find_package(catkin REQUIRED)
catkin_metapackage()
如键盘节点2发布话题为/cmd_vel
sudo apt-get install ros-melodic-teleop-twist-keyboard
rosrun teleop_twist_keyboard teleop_twist_keyboard.py
1)下载
2)导出参数与删除参数
启动launch1后,另外建文件launch2进行导出,若直接写在launch1中会出错
1)静态传参
roslaunch plumbing_test arg.launch
2)动态传参
roslaunch plumbing_test arg.launch car_length:=0.7
(6)针对功能包重名问题
写入devel下的bash路径,基于pwd获取
sudo gedit ~/.bashrc
内容如下
source /opt/ros/melodic/setup.bash
source /home/lc/demo_ros/devel/setup.bash
source ~/.bashrc
实际运行中,其会按如下顺序进行查找,下一行的优先于上一行
填写环境变量时易出现的安全隐患:
功能包A,功能包B,C依赖于A,而B覆盖了A,此时就会报错
名称别名设置
// 可以同时启动多个节点名称相同的节点,其会自动加一个随机后缀时间戳
ros::init(argc,argv,"erGouZi",ros::init_options::AnonymousName);
命名空间设置
std::map map;
map["__ns"] = "xxxx";
ros::init(map,"wangqiang");
1)基于工作空间重命名
rosrun turtlesim turtlesim_node __ns:=ergouzi
rosrun turtlesim turtlesim_node __ns:=caihua
2)基于名称name重命名或名称与命名空间的叠加
rosrun turtlesim turtlesim_node __name:=lc __ns:=gou
rosrun turtlesim turtlesim_node __name:=cuihua __ns:=zhu
rosrun turtlesim turtlesim_node
rosrun teleop_twist_keyboard teleop_twist_keyboard.py
rosrun turtlesim turtlesim_node
rosrun teleop_twist_keyboard teleop_twist_keyboard.py /cmd_vel:=/turtle1/cmd_vel
或者
rosrun turtlesim turtlesim_node /turtle1/cmd_vel:=/cmd_vel
rosrun teleop_twist_keyboard teleop_twist_keyboard.py
运行节点
demo_ros$ rosrun pmbing_pub_sub topic_name __ns:=xxx
全局:/话题——与节点名称无关
// 1.全局----话题名称需要以/开头(也可以设置自己的命名空间),这种情况下和节点(命名空间和名称)没有关系
// ros::Publisher pub=nh.advertise("/chatter",1000);
// ros::Publisher pub=nh.advertise("/yyyy/chatter",1000);
// 2.相对---非/开头
ros::Publisher pub=nh.advertise("chatter",1000);
私有:/命名空间/节点/话题
//3.私有---- 需要创建特定NodeHandle nh("~")
ros::NodeHandle nh("~");
ros::Publisher pub=nh.advertise("chatter",1000);
// 注意:如果以私有的nh创建的话题以/开头(全局话题),生成的话题是全局的非私有
// 全局话题优先级更高
### 3.2)python实现
rosruplumbing_pub_sub topic_name_p.py __ns:=xxx