ROS无人机自主飞行(数传与串口)与PX4配置问题

ROS无人机自主飞行与PX4配置问题

文中引用均为参考,部分内容转载!特感谢提供了参考!

PX4的配置

  • 首先需要对PX4烧写固件,版本问题上其实没有很多区别,目前我所用的最新版本——1.12.3版本的px4_fmu_v3_default,下载这个后在固件处烧写
  • 完成基本飞控配置参考阿木实验室第五条基本配置
  • 固件刷写
  • 机架选择
  • 传感器校准
  • 遥控器校准
  • 飞形模式调整
  • 电池校准
  • 电调校准(参考后面,这里的px4校准会有问题)

常见问题:

首先可以参考:常见参数配置pixhawk 2.4.8所有问题

!电调校准

把这个问题直接放到了最前方,因为这个问题困惑了快一周,因为想要测试无人机在offboard模式下用ros控制自主飞行,但是数次尝试后发现竟然莫名其妙的把电调动了,根本原因应该是错误操作使油门上下阈值变化了!

问题现象:

主要是解锁后, 会出现一个甚至多个电机不转,但是给大油门后会转,然后用QGC的motor测试,发现给相同的油门响应,”坏的电机”会不反应,只有给很大才会转。

尝试与发现:

其实就是需要电调校准,校准方法非常讲究。。。

因为我们实验室用的是阿木实验室Z410飞机,原先似乎是APM固件,而我们一般都会用PX4固件。这里就牵扯到他电机校准上的不同了。我发现用QGC里面这个方法不太管用,没有效果。

ROS无人机自主飞行(数传与串口)与PX4配置问题

于是我查了很多方法,比如用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

可能会提示不让设置,然后弹出点击强制保存。

ROS无人机自主飞行(数传与串口)与PX4配置问题

; 2. high Accelerometer bios

提示加速度计偏移过大。解决方法:把 com_arm_ekf_ab这个参数调大一些

ROS无人机自主飞行(数传与串口)与PX4配置问题

3. Accels inconsistent – check cal

把这个参数 COM_ARM_IMU_ACC改大一些,以加速度计为例,如果陀螺仪出现类似报错也是修改相应的参数。

4. USB连接检查

这个参数是检查起飞时是否有USB连接,默认情况下有USB连接时是无法解锁的,如果需要插USB解锁,需要设置为197848

ROS无人机自主飞行(数传与串口)与PX4配置问题

; 5. 安全开关检查

默认情况下安全开关是慢闪状态,设置该参数为22027时,上电后安全开关自动切换为双闪。

ROS无人机自主飞行(数传与串口)与PX4配置问题

注意,如果改了后可能会出现:只有插上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
#include
#include
#include
#include

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/state", 10, state_cb);
    ros::Publisher local_pos_pub = nh.advertise
            ("mavros/setpoint_position/local", 10);
    ros::ServiceClient arming_client = nh.serviceClient
            ("mavros/cmd/arming");
    ros::ServiceClient set_mode_client = nh.serviceClient
            ("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了。 注意安全!!!

Original: https://blog.csdn.net/weixin_43825012/article/details/124387513
Author: SLASH
Title: ROS无人机自主飞行(数传与串口)与PX4配置问题

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/520380/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球