应用程序接口 (API)
我们为Kerloud Flying Rover系列提供用于开发的开源API,并有C++、Python或其他语言的版本可选用。详细内容会在本章节持续更新。
1. ROS API(C++)
ROS(Robot Operating System)中的API是基于PX4社区的官方MAVROS包来实现的。我们在维护的软件库链接为:
mavros (dev_flyingrover 分支): https://github.com/cloudkernel-tech/mavros
mavlink (dev_flyingrover 分支): https://github.com/cloudkernel-tech/mavlink-gdp-release
基于ROS C++ API的offboard控制案例 (dev_flyingrover 分支): https://github.com/cloudkernel-tech/offboard_demo
更多的编程细节将在这里的教程章节进行说明,而此处介绍与我们的飞车案例特别相关的话题和服务。
1.1 Topics
(1) ~mavros/extended_state
订阅该话题可获取飞车的当前状态,消息类型为从原始版本扩展而来的mavros_msgs/ExtendedState,提供了用于指示飞车状态的flyingrover_state额外字段,具体如下文所示。本字段的取值是使用前缀FLYINGROVER_STATE_*定义的那些常量。
为清晰起见,在此说明具体含义:
flyingrover_state=0: 飞车尚未初始化。
flyingrover_state=1: 飞车运行在陆地车模式下。
flyingrover_state=2: 飞车运行在多旋翼模式下。
flyingrover_state=3: 飞车正从陆地车模式向多旋翼模式转换。手动模式下,状态会立即切为多旋翼模式;offboard或其他自动模式下,当运动速度低于自驾仪固件中FR_V_TH_MC参数的取值(默认为0.2m/s)时会完成切换。
flyingrover_state=4: 飞车正从多旋翼模式向陆地车模式转换,机器即将手动或自主着陆,着陆后状态将转为陆地车模式。
(2) ~mavros/setpoint_position/local, ~mavros/setpoint_position/global
本话题用于发布在本地或全局坐标系下的航点位置信息,陆地车、多旋翼模式下通用。需注意,ROS层使用的参考坐标系为ENU,而自驾仪使用的则是NED,消息类型分别为geometry_msgs/PoseStamped和mavros_msgs/GlobalPositionTarget。
(3) ~mavros/setpoint_velocity/cmd_vel_unstamped, ~mavros/setpoint_velocity/cmd_vel
这两个话题用于发布飞车在本地坐标系中的速度设定值,陆地车、多旋翼模式下通用,两个话题的唯一区别是速度信息是否携带时间戳。消息类型为geometry_msgs/Twist。
(4) ~mavros/setpoint_attitude/attitude, ~mavros/setpoint_attitude/thrust
这两个话题可用于在陆地车、多旋翼模式设定姿态值,但建议只用于车模式。消息类型分别为geometry_msgs/PoseStamped 和 mavros_msgs/Thrust。姿态推力直接输入到主电机油门,通过偏航角跟踪误差来计算生成转向伺服舵机的控制输入。
1.2 Services
(1) ~mavros/cmd/command
本服务用于offboard控制模式下陆地车、多旋翼的状态切换,消息类型为mavros_msgs/CommandLong,对应于下文链接中的一个定制化mavlink消息 (mavlink::common::MAV_CMD::DO_FLYINGROVER_TRANSITION),链接为https://github.com/cloudkernel-tech/mavlink-gdp-release/blob/dev_flyingrover/message_definitions/v1.0/common.xml。
例如,如果我们想切换到多旋翼模式,则需要通过如下设置调用该服务:
相反,若切换到陆地车模式,则:
请注意,mavlink::common::MAV_FLYINGROVER_STATE的枚举定义如下,参见链接
2. ROS API (python)
与C++版本ROS API类似,ROS python API也是基于我们维护的mavros和 mavlink包实现,仅有的区别是上文提到的所有话题和服务需通过python来使用。
mavros (dev_flyingrover 分支): https://github.com/cloudkernel-tech/mavros
mavlink (dev_flyingrover 分支): https://github.com/cloudkernel-tech/mavlink-gdp-release
基于ROS python API的offboard控制案例 (dev_flyingrover 分支): https://github.com/cloudkernel-tech/offboard_demo_python
代码将在这里的教程章节有做讲解。为简洁起见,底层消息通信在Px4Controller类中进行处理,而面向用户编程用的友好API接口封装于Commander类中,部分API列举如下:
move(x,y,z, BODY_FLU=False): 请求飞车移动到FLU或ENU坐标系下的指定位置,陆地车、多旋翼模式下通用。
turn(yaw_degree): 请求飞车偏航指定角度,仅多旋翼模式可用。
land(): 多旋翼模式下,请求飞车着陆;
hover(): 多旋翼模式下,请求飞车悬停在当前位置。
arm(): 请求解锁飞车。
disarm(): 请求锁定地面的飞车。
transit_to_rover(): 请求飞车切换为陆地车模式。
transit_to_mc(): 请求飞车切换为多旋翼模式。
return_home(height): 请求飞车返航,仅多旋翼模式可用。
Last updated