设备:
1,ubuntu20.04电脑,ROS:Noetic
2,crazyflie2.0
3,crazyradio
参考:
Installation — Crazyswarm 0.3 documentation
Getting started with the Crazyflie 2.X | Bitcraze
GitHub - whoenig/crazyflie_ros: ROS Driver for Bitcraze Crazyflie
Welcome to Crazyswarm’s documentation! — Crazyswarm 0.3 documentation
https://crazyswarm.readthedocs.io/en/latest/tutorials/tutorials.htm
注意事项:
- 无法直接通过连接动捕WiFi的方法来完成无人机控制,建议使用网线连接动捕。
安装前准备
1,cmake升级
cmake版本有问题,将cmake升级至cmake-3.21.0版本
cd ~/Download wget https://cmake.org/files/v3.13/cmake-3.21.0-Linux-x86_64.tar.gz tar -xzvf cmake-3.21.0-Linux-x86_64.tar.gz # 解压出来的包,将其放在 /opt 目录下,其他目录也可以,主要别以后不小心删了 sudo mv cmake-3.21.0-Linux-x86_64 /opt/cmake-3.21.0 # 建立软链接 sudo ln -sf /opt/cmake-3.21.0/bin/* /usr/bin/ # 查看 cmake 版本 cmake --version
2,配置ssh
由于文件比较大,用https很难成功,建议用ssh的方式下载。
2.1 更新git组件
$ sudo apt install git-lfs
2.2设置邮箱和用户名
git config --global user.name "WangRongsheng" git config --global user.email "603329354@qq.com"
2.3用ssh生成公钥
ssh-keygen -t rsa -C "603329354@qq.com"
回车之后会出现如下所示的输出,直接按回车即可:
Generating public/private rsa key pair. Enter file in which to save the key (/Users/your_user_directory/.ssh/id_rsa): (按回车键) Enter passphrase (empty for no passphrase): (按回车键) Enter same passphrase again: (按回车键)
2.4将公钥添加到github中
在.ssh文件夹中找到id_rsa.pub这个文件,用文本编辑器(如记事本)打开,复制里面的所有内容。
进入github
添加ssh key,把刚才复制的内容粘贴上去保存即可
2.5在终端中配置ssh
git config --global url.ssh://git@github.com/.insteadOf https://github.com/
Crazyswarm安装
1,设置python环境变量
export CSW_PYTHON= python3
2,安装依赖
sudo apt install -y ros-noetic-tf ros-noetic-tf-conversions ros-noetic-joy sudo apt install -y libpcl-dev libusb-1.0-0-dev sudo apt install -y swig lib${CSW_PYTHON}-dev ${CSW_PYTHON}-pip ${CSW_PYTHON} -m pip install pytest numpy PyYAML scipy
3,安装仿真依赖
${CSW_PYTHON} -m pip install vispy ${CSW_PYTHON} -m pip install matplotlib
4,安装Crazyswarm git
git clone https://github.com/USC-ACTLab/crazyswarm.git
5,安装Crazyswarm依赖
cd crazyswarm ./build.sh
6,测试安装
cd ros_ws/src/crazyswarm/scripts source ../../../devel/setup.bash $CSW_PYTHON -m pytest
crazyflie代码固件升级
- 使用 cfclient 连接到 Crazyflie
- 转到菜单Crazyflie->Bootloader
- 从下拉菜单中选择最新版本。(从Github 发布页面下载)
- 单击“程序”并等待 STM 和 NRF 都被刷新。
- crazyflie 会自动重启几次。
- 在所有闪烁完成并在底部看到“状态:空闲”之前,请勿触摸或重新启动您的 crazyflie。
- 检查固件版本,在View菜单下,打开Tabs->Console选项卡并查看连接到 Crazyflie 2.X 时的输出
动捕定位系统配置(OptiTrack)
在动捕电脑中:
标定 Calibration
与其他多相机测量系统类似,光学运动捕捉系统首先要进行标定才能够使用。在标定过程中, 系统通过捕获的图像计算每个相机的位置、 角度、以及畸变。 通过标定, Motive 构建 3D 捕获空间。 具体来说,通过观察多个同步相机的 2D 图像,关联到通过三角测量得到的每个相机已知的标定 Marker 的位置。 注意, 如果标定之后相机有任何变化, 需要重新进行标定。即便外部设置没有改变,随着时间的变化、 温度其他环境的波动,标定精度会下降,建议每天标定一次系统。
标定步骤
1、准备、 优化捕获设置;
或者在motive启动界面中
2、 在相机预览窗口( Camera Preview) 中, 点击Clear visible清除现有的 Mask 区域;
3、 打开标定窗口,使用 Mask Visible 去除场地中不能移除的反光物体;
系统中存在的放光点会影响系统的标定精度,因此在标定前需要对场景进行检查。
一种方法:在Camera Calibration窗口中, 点击mask visible。如果场景中存在反光点,在相机预览窗口( Camera Preview) 中,会看到有红色的mask标志。在对应相机中,选择滤镜模式,通过光学图像判断反光点的位置和种类。
4、 采集标定采样点(Start Wanding);
点击 Start Wanding后,拿着T形校准棒在中间及场地四周上下挥舞。并点击Calculate计算最终标定结果。
5、 计算、 检查标定结果;
Mean 3D Error大于1mm时,需要重新标定镜头。
6、 放入L型标定杆,设置地面。
使用L形校准棒对地面进行校准,主要作用:1、校准水平面 2、确定坐标系。
L形校准棒的顶点对准系统的坐标原点,短轴对准X轴。
在Camera Calibration中,Vertical offset为L形校准棒上的较准球中心到水平面的垂直距离。
7、创建刚体
将所要创建模型的刚体贴好标记点,放置在标定好的场地内,在 Motive 的 3D 视图中框选住代表刚体模型的标记点。 然后点击右键选择 Rigid Body 下的 Create From Selected Markers;或者使用热键: Ctrl +T;或者在 Asset 窗口点击,选择 New Rigid Body。通过以上三种方式都可以对选中 Marker 点完成刚体创建。
刚体跟踪
对于创建的刚体,由其枢轴点( Pivot Point)代表该刚体的位置和姿态。 当创建刚体时,其枢轴点将默认放置在其几何中心, 方向轴将与全局坐标轴对齐。
Rigid Body->Real-Time Info 窗口可以查看选中 Rigid Body 的实时信息, Rigid
Body 的位置信息是枢轴点相对于世界坐标系坐标轴原点的位置,姿态信息是相对于初始创建刚体坐标轴的变化。
Data Streaming
Motive 可以通过多种方式,将跟踪的数据 实 时 传 输 到 其 他 程 序 : Autodesk MotionBuilder、 Visual3D、 Unreal Engine 4、 3ds Max、 Maya (VCS)、 VRPN、 Trackd。Natnet SDK 支持用户创建自定义客户端用来接收数据,数据流选项不需要单独的许可证。常 见 的 运 动 捕 捉 应 用 依 赖 于 实 时 跟 踪 ,OptiTrack 系统旨在提供低延时的数据,Streaming 窗口中配置选定的服务器通过网络广播数据。 可通过 View 选项下 Data Streaming Pane配置。
在下载crazyswarm的电脑中:
配置crazyswarm、crazyflie和动捕系统之间的通信
配置crazyflie
- 启动控制台
$ cfclient
- 确保地址字段设置为0xE7E7E7E7E7,并单击“scan”
- 包含“选择接口”的下拉框现在应该有另一个包含您的CranchyFlie URI的条目radio://0/100/2M,并单击“connect”
- 在“Connect”菜单中,选择结果中的“Configure 2.0”项对话框,将 Radio Address 更改为唯一的数字,0xE7E7E7E701用于第一个crazyflie(那么该飞机在motive的刚体命名为cf1),第二个crazyflie为0xE7E7E7F02(那么该飞机在motive的刚体命名为cf2),以及等等。选择“Write”,然后选择“Exit”
- 在控制台中,选择“Disconnect”
- 重新启动crazyflie
- 更新控制台的地址字段为更改的Radio Address (0xE7E7E7E701)并单击“扫描”。
- 在下拉列表中看到更长的URI装有radio://0/100/2M/E7E7E7E701
此时这台crazyflie的Address为0xE7E7E7E701;用 rosrun crazyflie_tools scan
已经扫描不出来了。(用标签纸记录好并粘贴到机身)
hover_swarm.launch文件
在文件ros_ws/src/crazyswarm/launch/hover_swarm.launch中更改动捕型号并添加动捕电脑的ip地址:
motion_capture_type: "optitrack_closed_source" motion_capture_host_name: "192.168.2.100" # hostname or IP address motion_capture_interface_ip:"optitrackPC"# IP address object_tracking_type: "motionCapture"
crazyflie.yalm
# ros_ws/src/crazyswarm/launch/crazyflies.yaml crazyflies: - id: 1 # id 与动捕刚体的名字对应,id :1 == 动捕名字:cf1,id:n == 动捕名字:cfn channel: 100 #这里的channel要和crazyflie的IP地址对应 initialPosition: [1.5, 1.5, 0.0] #飞机的初始位置 type: default #与飞机的种类有关,我们购买的属于default - id: 2 channel: 110 initialPosition: [1.5, 1.0, 0.0] type: default
测试
1. 在动捕系统中创建名为cf1的飞机刚体
2. 连接一架crazyflie
在yaml文件中配置要连接的无人机id
# ros_ws/src/crazyswarm/launch/crazyflies.yaml crazyflies: - id: 1 # id 与动捕刚体的名字对应,id :1 == 动捕名字:cf1,id:n == 动捕名字:cfn channel: 100 #这里的channel要和crazyflie的IP地址对应 initialPosition: [1.5, 1.5, 0.0] #飞机的初始位置 type: default #与飞机的种类有关,我们购买的属于default
3. 运行crazyswarm
在第三方电脑中连接crazyradio后运行
roslaunch crazyswarm hover_swarm.launch
cd ros_ws/src/crazyswarm/scripts python3 hello_world.py
无人机悬停一段时间后降落