ROS无人机自主飞行与PX4配置问题
文中引用均为参考,部分内容转载!特感谢提供了参考!
PX4的配置
- 首先需要对PX4烧写固件,版本问题上其实没有很多区别,目前我所用的最新版本——1.12.3版本的px4_fmu_v3_default,下载这个后在固件处烧写
- 完成基本飞控配置参考阿木实验室第五条基本配置
- 固件刷写
- 机架选择
- 传感器校准
- 遥控器校准
- 飞形模式调整
- 电池校准
- 电调校准(参考后面,这里的px4校准会有问题)
常见问题:
首先可以参考:常见参数配置、pixhawk 2.4.8所有问题
!电调校准
把这个问题直接放到了最前方,因为这个问题困惑了快一周,因为想要测试无人机在offboard模式下用ros控制自主飞行,但是数次尝试后发现竟然莫名其妙的把电调动了,根本原因应该是错误操作使油门上下阈值变化了!
问题现象:
主要是解锁后,会出现一个甚至多个电机不转,但是给大油门后会转,然后用QGC的motor测试,发现给相同的油门响应,“坏的电机”会不反应,只有给很大才会转。
尝试与发现:
其实就是需要电调校准,校准方法非常讲究。。。
因为我们实验室用的是阿木实验室Z410飞机,原先似乎是APM固件,而我们一般都会用PX4固件。这里就牵扯到他电机校准上的不同了。我发现用QGC里面这个方法不太管用,没有效果。
于是我查了很多方法,比如用MissionPlanner中刷APM固件再电调校准,理论上是可以,就连售后也这么说的。。。
但是奈何不太会用MP,于是找了很多不需要地面站的校准方法,主要就是插拔上电,给遥控器油门的上下阈值。
具体校准方法:
-
第一步:要先烧写APM固件(没错就是这么迷惑,先烧成APM校准完电调再烧回PX4就好)
- 在QGC里选择自定义固件版本,烧写APM固件ArduCopter-v3.px4,这个是我找到的比较合适的版本。
-
第二步:可以直接在QGC里操作,只用选择机型和校准遥控器,可以先不校准传感器,遥控器校准了才能校准电调。
-
第三步:校准电调。我主要参考了这个
- 断掉所有与飞控的连接,包括桨叶、usb线
- 遥控器打开把油门给到最大,然后给飞控上电(电池上电),当PIXHAWK红绿蓝灯周期闪烁(大led灯)后,给飞控断电
- 油门继续保持最大状态,重新给飞控上电,当听到滴滴的声音结束后,长按安全开关直至变成红色常亮(原来是闪烁),此时进入电调校准状态
- 电调校准状态下听到“滴”的一声(或两声,甚至出现一阵音乐声都有可能),此时就捕获了最大油门。然后迅速把遥控器油门下压到最小,再听到类似“滴”的一声后,捕获了最小油门。
- 此时校准完成,改变油门可以控制电机转速。终于可以看到四个电机又能同时转了!
-
第四步:解锁尝试,油门推至右下角,解锁成功就会四旋翼怠速旋转。bingo!
-
补充:别忘了现在是APM固件,记得在QGC里重新烧写PX4固件。完成除了电调校准的其他步骤即可。(也就是别点上面那张图里的)
1. compass xx inconsistent
提示罗盘某个角度未被包含,而且经常不同。 解决方法:COM_ARM_MAG_ANG
设为-1
可能会提示不让设置,然后弹出点击强制保存。
2. high Accelerometer bios
提示加速度计偏移过大。解决方法:把com_arm_ekf_ab
这个参数调大一些
3. Accels inconsistent - check cal
把这个参数COM_ARM_IMU_ACC
改大一些,以加速度计为例,如果陀螺仪出现类似报错也是修改相应的参数。
4. USB连接检查
这个参数是检查起飞时是否有USB连接,默认情况下有USB连接时是无法解锁的,如果需要插USB解锁,需要设置为197848
5. 安全开关检查
默认情况下安全开关是慢闪状态,设置该参数为22027时,上电后安全开关自动切换为双闪。
注意,如果改了后可能会出现:只有插上usb线同时上电才能解锁飞机的情况,而没有插usb单独用遥控器解锁的话,可能无法解锁。当时我遇到这个问题困惑了半天,最后发现是这个问题,所以最后又改回了0。
ROS控制PX4
因为我最终目标是NX板载控制,所以其实只用有线连接就可以,但是真机飞行很危险而且代价较高,所以建议用无线数传先做测试。
1. 有线控制
usb线连接无人机pixhawk,先查看下端口连接的信息:
ls /dev/tty*
终端运行:(我的是ACM0)
roslaunch mavros px4.launch fcu_url:=/dev/ttyUSB0:57600
roslaunch mavros px4.launch fcu_url:=/dev/ttyACM0:57600
此时就是用串口连接了无人机,我们可以运行我们的代码:
依旧是官方的offb_node文件实例
/**
* @file offb_node.cpp
* @brief Offboard control example node, written with MAVROS version 0.19.x, PX4 Pro Flight
* Stack and tested in Gazebo SITL
*/
#include <ros/ros.h>
#include <geometry_msgs/PoseStamped.h>
#include <mavros_msgs/CommandBool.h>
#include <mavros_msgs/SetMode.h>
#include <mavros_msgs/State.h>
mavros_msgs::State current_state;
void state_cb(const mavros_msgs::State::ConstPtr& msg){
current_state = *msg;
}
int main(int argc, char **argv)
{
ros::init(argc, argv, "offb_node");
ros::NodeHandle nh;
ros::Subscriber state_sub = nh.subscribe<mavros_msgs::State>
("mavros/state", 10, state_cb);
ros::Publisher local_pos_pub = nh.advertise<geometry_msgs::PoseStamped>
("mavros/setpoint_position/local", 10);
ros::ServiceClient arming_client = nh.serviceClient<mavros_msgs::CommandBool>
("mavros/cmd/arming");
ros::ServiceClient set_mode_client = nh.serviceClient<mavros_msgs::SetMode>
("mavros/set_mode");
//the setpoint publishing rate MUST be faster than 2Hz
ros::Rate rate(20.0);
// wait for FCU connection
while(ros::ok() && !current_state.connected){
ros::spinOnce();
rate.sleep();
}
geometry_msgs::PoseStamped pose;
pose.pose.position.x = 0;
pose.pose.position.y = 0;
pose.pose.position.z = 2;
//send a few setpoints before starting
for(int i = 100; ros::ok() && i > 0; --i){
local_pos_pub.publish(pose);
ros::spinOnce();
rate.sleep();
}
mavros_msgs::SetMode offb_set_mode;
offb_set_mode.request.custom_mode = "OFFBOARD";
mavros_msgs::CommandBool arm_cmd;
arm_cmd.request.value = true;
ros::Time last_request = ros::Time::now();
while(ros::ok()){
if( current_state.mode != "OFFBOARD" &&
(ros::Time::now() - last_request > ros::Duration(5.0))){
if( set_mode_client.call(offb_set_mode) &&
offb_set_mode.response.mode_sent){
ROS_INFO("Offboard enabled");
}
last_request = ros::Time::now();
} else {
if( !current_state.armed &&
(ros::Time::now() - last_request > ros::Duration(5.0))){
if( arming_client.call(arm_cmd) &&
arm_cmd.response.success){
ROS_INFO("Vehicle armed");
}
last_request = ros::Time::now();
}
}
local_pos_pub.publish(pose);
ros::spinOnce();
rate.sleep();
}
return 0;
}
终端运行:(ros包流程)
cd ~/catkin_ws/src
catkin_create_pkg offb geometry_msgs mavros roscpp
cd offb/src
touch offb_node.cpp
vim offb_node.cpp
注意别忘了在CMakeLists文件里配置。
cd ~/catkin_ws/src/offb/
vim CMakeLists.txt
更改添加:
add_executable(offb src/offb_node.cpp)
target_link_libraries(offb
${catkin_LIBRARIES}
)
编译:
catkin_make #编译
catkin_make install
source devel/setup.bash #配置catkin 工作空间
在上面运行了roslaunch之后就可以运行:
rosrun offb offb_node
注意
offboard模式一定要gps信息,所以只能在室外测试。我们在roslaunch端中看不到提示NO GPS FIX
信息就代表搜到了星,或者查看mavros话题:
rostopic list
rostopic echo /mavros/altitude
rostopic echo /mavros/local_position/local
上电后,没有上桨的话可能电机会一直转,甚至加速,我们上下移动飞机,会发现电机转速变化。所以测试一下就断电吧。
我们查看local里的信息发现信息位置并不是0,0,0。而且会跳变,这就牵扯到了我们在代码里写的0,0,2。但是起点不是0,0,0,这是非常危险的!!!因为根本不知道会朝哪里飞。所以后续会不使用绝对位置飞行,而采用线速度飞行,以时间控制距离结束自主降落。
2. 无线数传
现在很多数传都直接使用wifi,我们只需要在pc端连接飞机数传wifi信息:
例如:
wifi名: cuavwlink_xxxxx
wifi密码:xxxxxx
UDP: 14550
连接了WiFi后,先查看WiFi设置里看到IPV4端口,其实就是找到位置如192.168.4.2
之类的(结尾应该是2因为飞机是1)
运行:(注意格式):前面的是udp后面是端口,最后的24580
好像随便输一个就行,感觉类似自定义命名。
roslaunch mavros px4.launch fcu_url:=udp://:14550@192.168.4.2:24580
看到类似这样的黄色提示是正常的(除了GPS,因为我现在在室内敲得这段)。
然后就可以继续rosrun
了。注意安全!!!
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)