准备工作:

Motive的安装及使用:https://blog.csdn.net/weixin_41536025/article/details/89913961

ros订阅 OptiTrack 的消息通过vrpn_client_ros包:http://wiki.ros.org/vrpn_client_ros

bebop2 开发包安装指导:https://bebop-autonomy.readthedocs.io/en/latest/installation.html

注:官方的安装步骤在Ubuntu 18.04下运行可能会报错

解决方法:

在当前工作空间的devel/lib文件夹下新建一个链接,链接到/opt/ros/melodic/lib/parrot_arsdk文件夹,并将~/bebop_ws/devel/lib/parrot_arsdk添加到$LD_LIBRARY_PATH

$ cd ~/bebop_ws/devel/lib
$ ln -s /opt/ros/melodic/lib/parrot_arsdk parrot_arsdk
$ echo "export LD_LIBRARY_PATH="~/bebop_ws/devel/lib/parrot_arsdk:$LD_LIBRARY_PATH"" >> ~/.bashrc
$ source ~/.bashrc

          参考: https://github.com/AutonomyLab/bebop_autonomy/issues/170

中文版安装指导:https://www.ncnynl.com/category/ros-bebop/

(安装过程中遇到问题可百度查询)

总体思路:

1、安装Motive的主机、控制器(自己的电脑)、bebop无人机 三者连接在同一个局域网

2、Motive通过 VRPN 发布无人机位置信息

3、控制器 通过订阅VRPN 的topic “vrpn_client_node/xxx/pose” 获取无人机的具体位置

注:xxx是你在Motive中创建的刚体的名称

4、控制器 通过向topic xxx/takeoff  发送起飞命令

xxx/land  发送降落命令命令

xxx/cmd_vel  发送运动控制命令

注:xxx 代表bebop无人机的命名,在 bebop_ws/src/bebop_autonomy/bebop_driver/launch/bebop_node.launch中修改。

在namespace后 修改名称            用于订阅消息

在ip 后 修改为bebop的ip地址      用于连接bebop

Ps:如何给bebop刷固件使其连接特定的wifi,并固定其ip地址,我暂时还没找到,后面补上


更新:给bebop刷固件使其连接特定的wifi 参考 bebop2连接到路由器并固定ip

具体程序实现

1、定义一个类

因为要控制两架bebop,所以定义一个通用的控制类实现无人机的基本操作。

class bebopControl
{
public:bebopControl();ros::NodeHandle nh;geometry_msgs::Twist cmd_vel;ros::Publisher takeoff_pub;ros::Publisher land_pub;ros::Publisher cmd_pub;ros::Subscriber vrpn_bebop_sub;ros::Rate *rate;ros::Time start_time;float current_x,current_y,current_z;void takeoff();void land();void cmd(float x,float y,float z);void vrpn_bebop_cb(const geometry_msgs::PoseStamped::ConstPtr& msg);void start();private:/* data */
};

2、bebop无人机控制

Motive中创建的刚体的名称:bebop4  ==> vrpn_client_node/bebop4/pose

bebop无人机的名称:bebop4  ==> bebop4/takeoff  bebop4/land   bebop4/cmd_vel

using namespace std;
#include <iostream>
#include <stdio.h>
#include <ros/ros.h>
//topic
#include <std_msgs/Empty.h>
#include <std_msgs/Int32.h>
#include <nav_msgs/Odometry.h>
#include <geometry_msgs/Twist.h>
#include <geometry_msgs/PoseStamped.h>#include <bebop_control/bebop_control.h>bebopControl::bebopControl()
{ROS_INFO("bebop  init! ");rate = new ros::Rate(10.0);current_x = 0;current_y = 0;current_z = 0;//beboptakeoff_pub= nh.advertise<std_msgs::Empty>("bebop4/takeoff", 1);         // 发布 起飞命令land_pub   = nh.advertise<std_msgs::Empty>("bebop4/land", 1);            // 发布 降落命令cmd_pub    = nh.advertise<geometry_msgs::Twist>("bebop4/cmd_vel", 1);    // 发布 移动命令vrpn_bebop_sub = nh.subscribe<geometry_msgs::PoseStamped>("vrpn_client_node/bebop4/pose", 1, &bebopControl::vrpn_bebop_cb,this);}
/*起飞指令*/
void bebopControl::takeoff()
{takeoff_pub.publish(std_msgs::Empty());ROS_INFO("bebop  takeoff! ");
}
/*降落指令*/
void bebopControl::land()
{land_pub.publish(std_msgs::Empty());ROS_INFO("bebop  land! ");
}
/*发布位置控制指令*/
void bebopControl::cmd(float x,float y,float z)
{cmd_vel.linear.x = x;cmd_vel.linear.y = y;cmd_vel.linear.z = z;cmd_pub.publish(cmd_vel);ROS_INFO("bebop  send cmd! ");
}
/*通过vrpn接受bebop位置消息*/
void bebopControl::vrpn_bebop_cb(const geometry_msgs::PoseStamped::ConstPtr& msg)
{/*Motive通过 VRPN 发布的位置消息 单位是 米×1000 转化为mm*/current_x = msg->pose.position.x*1000;current_y = msg->pose.position.y*1000;current_z = msg->pose.position.z*1000;cout <<"vrpn position:  " << current_x  <<"   " << current_y <<"   " << current_z << endl;}
void bebopControl::start()
{ros::Duration(3).sleep();//必须延时一段时间,不然飞不起来this->takeoff();        //起飞ros::Duration(3).sleep();ros::spinOnce();        //向上飞(此处只有一个动作,持续向上飞需要连续发布此消息)this->cmd(0,0,0.2);ros::Duration(3).sleep();ros::spinOnce();this->cmd(0,0,0.2);ros::Duration(3).sleep();ros::spinOnce();this->cmd(0,0,0.2);// this->cmd(1,0,0);       //向前飞(机头下沉1度,此处只会产生一个动作,持续向前飞需要连续发布)// ros::Duration(3).sleep();// this->cmd(0,0,-0.6);// ros::Duration(5).sleep();// this->land();// this->cmd(0,0,0.1);// ros::Duration(3).sleep();while(ros::ok()){/*高度小于55cm直接降落 注意:  Motive的y轴是垂直向上的*/if(current_y<=550 && current_y>0){this->land();break;}/*以0.1m/s的速度下降*/this->cmd(0,0,-0.1);ros::spinOnce();rate->sleep();}}
int main(int argc, char **argv)
{   ros::init(argc, argv, "bebopLeader");bebopControl bebopLeader;bebopLeader.start();return 0;
}

这里只贴了一个无人机的控制程序,另一个无人机的控制程序与之类似,只需修改订阅的话题即可。

3、修改vrpn_client_ros/launch/sample.launch文件

ip地址修改为安装Motive的主机的ip地址

4、飞行

通过Optitrack获得刚体(bebop4,bebop5)的姿态信息,并传给ROS

$ roslaunch vrpn_client_ros sample.launch

连接 bebop

新开一个终端 连接bebop4
$ roslaunch bebop_driver bebop4_node.launch
新开一个终端 连接bebop5
$ roslaunch bebop_driver bebop5_node.launch

运行自己的节点控制无人机起飞

rosrun bebop_control bebopLeader 

ros+ Optitrack控制bebop2无人机相关推荐

  1. ROS控制Parrot Bebop2无人机

    ROS控制Parrot Bebop2无人机 bebop_autonomy是基于Parrot公司的官方程序包ARDroneSDK3开发的一个ROS程序包,用于对Bebop系列无人机进行通信和控制. 该程 ...

  2. ROS+Bebop2无人机+YOLO算法实现无人机视角的实时目标检测

    前言: 很久之前,用TK1玩过一段时间的ROS,再加上各种硬件(Arduino.激光雷达.编码电机等),模仿着做过Turtlebot小车,实现了部分Turtlebot部分的功能,最后因为雷达被我玩烧了 ...

  3. ROS + Parrot-Sphinx进行Bebop无人机仿真

    ROS + Parrot-Sphinx进行Bebop无人机仿真 测试环境 一.安装Parrot-Sphinx 二.初步使用 1. 启动并检查firmwared服务 2. 检查WiFi接口名 3. 初步 ...

  4. Ubuntu18.04下基于ROS和PX4的无人机仿真平台的基础配置搭建(XTDrone的)

    摘自:https://www.ngui.cc/51cto/show-23557.html Ubuntu18.04下基于ROS和PX4的无人机仿真平台的基础配置搭建 编程学习 · 2020/7/12 1 ...

  5. 【安装】安装ros机器人系统和无人机环境配置常见问题总结

    安装ros机器人系统和无人机环境配置常见问题总结 一.安装ROS 二.无人机环境配置 更多安装 Ubuntu16.04安装ros:http://wiki.ros.org/cn/kinetic/Inst ...

  6. 【控制】《多无人机协同控制技术》周伟老师-第5章-基于滑模控制的无人机编队运动控制策略

    第4章 回到目录 第6章 第5章-基于滑模控制的无人机编队运动控制策略 5.1 编队数学模型 5.2 控制策略与设计 5.2.1 路径跟踪 5.2.2 编队控制 5.2.3 编队跟踪 5.2.4 编队 ...

  7. 【控制】《多无人机协同控制技术》周伟老师-第3章-面向协同控制的无人机单机控制

    第2章 回到目录 第4章 Link: [控制]四旋翼无人机姿态角分析 第3章-面向协同控制的无人机单机控制 3.1 无人机运动建模 3.1.1 参考坐标系 3.1.2 运动参数 3.1.3 无人机运动 ...

  8. 多车调度问题(大疆Robot Master)——ROS键盘控制失灵,小车无法收敛定位,路径规划出错

    问题1 ROS键盘控制小车失灵 具体就是:用键盘左右转小车,速度贼快,而且方向不正确,检查发现是控制模块失灵,有可能是内部测量元件(陀螺仪等)烧了,换了个控制模块解决. 问题2 小车无法收敛定位 具体 ...

  9. 在ROS下控制dobot(magician)机械手的滑轨

    在ROS下控制越疆科技dobot(magician)机械手的滑轨 GetQueuedCmdCurrentIndex.srv代码: --- int32 result uint64 queuedCmdIn ...

最新文章

  1. Wxwinter.BPM类库更新
  2. python测试开发自学教程-python测试开发学习笔记
  3. DevExpress XtraTabControl 加载Form
  4. 存储空间_Tan分享 存储空间清理
  5. [Hei-Ocelot-Gateway ].Net Core Api网关Ocelot的开箱即用版本
  6. IDEA-jetty热加载(类文件和静态资源)
  7. 插入顶部_最快速地把同一内容插入到Word文档不同页面的相同位置
  8. 页面缓存 ,数据源缓存,自定义缓存
  9. 基于node.js的express使用数据库时,解决异步调用的问题
  10. 学3dmax赚钱吗?学3dmax工资怎么样?
  11. java如何统计txt的字数_Java HashSet对txt文本内容去重(统计小说用过的字或字数)...
  12. 如何不靠运气变得富有 (十四) —— 特殊技能(specific knowledge)极富创造性或技术性
  13. 检查php语法错误,PHP检查语法错误技巧
  14. git 删除git管理_使用Git管理多媒体文件
  15. 中国历史上10大经典遗言
  16. 修改照片为社保照片 358*441
  17. 共享雨伞,又一个昙花一现的共享经济?
  18. 54个提高PHP程序运行效率的方法(转载)
  19. 【性能测试】性能测试的基本流程
  20. 模拟输出21点所有可能的Black Jack牌型

热门文章

  1. 活动类新闻稿怎样写?有哪些结构需要注意?
  2. D FFF团的怒火
  3. tf.segment_xxx系列函数测试
  4. 有人的地方就有江湖,有江湖就有恩怨,人就是恩怨,程序员也是人
  5. sshfs(基于ssh挂载远程目录)
  6. error C2872: “flann”: 不明确的符号 --- PCL 与OpenCV2 的flann命名空间冲突问题的解决方法...
  7. 【 Ecology9 】- 2 前后端联调介绍
  8. Java架构师的升级之路
  9. 中国风剪纸立体花卉PSD装饰素材,轻松上手做海报
  10. 原生JS实现无缝轮播