前言
之前的控制部分都是在单个drone或car的条件下进行控制的,本篇博客将基于多个drone进行控制
一、settings.json设置
多机的配置如下,其中如果要设置某一个drone的初始角度,则只需要修改Yaw的值即可。
Yaw的值一般取[0,90,-90,180]这4个值中的一个
这里的drone2的Yaw设置的为180,通过api获取的yaw为-3.14
1 | { |
二、代码部分
直接查看所有代码
2.1 API控制
connect_simulator.py
下面只展示一些比较核心的代码
1 | class Connect(object): |
2.1.1位置控制
Drone1控制
1 | from connect_simulator import Connect |
Drone2控制
和Drone1的控制代码基本完全一样,只是xyz的初始坐标值可能需要更换
1 | from connect_simulator import Connect |
2.1.2 速度控制
Drone1控制
关于下面代码中的坐标系转换问题,坐标转换参考
1 | NED = Body * A (yaw,直接获得的偏航角) |
1 | from connect_simulator import Connect |
Drone2控制
1 | from connect_simulator import Connect |
2.2 UDP控制
目前暂时不考虑两台机器间的UDP通信控制,和API控制差不多的思想
但在UDP的单机控制代码中,还没有将速度控制修改为2.1里面的坐标系转换和期望速度控制,这点需要注意
2.2.1 位置控制
2.2.2 速度控制
2.3 ROS控制
connect_simulator.py
更多的介绍和API控制中,稍微有些区别的地方,公共的地方将不再显示
1 | import threading |
drone1_pub_topic.py
1 | from connect_simulator import Connect |
drone1_sub_topic.py
1 | from connect_simulator import Connect |
drone2_pub_topic.py
1 | from connect_simulator import Connect |
drone2_sub_topic.py
1 | from connect_simulator import Connect |
ros_airsim.launch
1 | <launch> |
2.3.1 位置控制
drone1控制
1 | class Drone1Controller(object): |
drone2控制
1 | class Drone1Controller(object): |
2.3.2 速度控制
drone1控制
1 | class Drone1Controller(object): |
drone2控制
1 | class Drone1Controller(object): |
2.4 rviz显示多条轨迹
1 | #!/usr/bin/env python |
三、ros控制的路径显示
在下面的两种控制中,drone2的坐标位置为(4,0,0),drone1的坐标位置为(0,0,0)
不论是位置控制还是速度控制,都是先让drone2起飞一会,稍等几秒后,drone1再起飞。并且drone1和drone2的目标轨迹点完全相同
红色的为drone2的运动轨迹,绿色的为drone1的运动轨迹
3.1 位置控制
3.2 速度控制
总结
(1)在API控制这一块,其实是不需要考虑其下个指令的发布时间,直接发布位置控制或者速度控制,drone都会在到达目标点后执行下一个控制指令。而速度控制时,其实也是可以给定速度和时间,直接使其到达目标点左右,例如UDP的速度控制中,目前就是这种做法,但是该做法并不好,通过给定目标点和期望速度来控制,这样相对好很多
(2)而在ros控制这一块,由于都是自定义的ros节点,进行发布。在进行速度控制和位置控制时,则不能像API控制那样,因为在ros的指令发布后,airsim响应需要时间,不能在这个响应时间内发布下一条ros命令(ros指令都会存储在缓存中,而airsim则会从缓存中响应的读取指令,于是最好保持发送和接收的一致),所以就添加了很多的操作。目前pub和sub中设置rate为250hz,控制程序中,设置频率为1hz,能保持其一致,但是为什么这样就保持一致了,还没怎么弄明白。