無人機(jī)仿真—PX4編譯,gazebo仿真及簡單off board控制模式下無人機(jī)起飛
前言
- 在上篇記錄中,已經(jīng)對(duì)整體的PX4仿真環(huán)境有了一定的了解,現(xiàn)如今就要開始對(duì)無人機(jī)進(jìn)行起飛等仿真環(huán)境工作,在整體虛擬環(huán)境中如果程序能夠安穩(wěn)起飛降落,即可對(duì)無人機(jī)進(jìn)行實(shí)飛操作。
- 需要做的是,通過PX4官網(wǎng)提供的基本程序包,在ROS工作空間下新建程序包對(duì)其進(jìn)行運(yùn)行,再打開仿真環(huán)境即可
PX4編譯
-
cd /Firmware #進(jìn)入PX4文件夾內(nèi) make px4_sitl_default gazebo # 編譯固件并加載仿真環(huán)境
-
如果想進(jìn)行自動(dòng)起飛,可運(yùn)行以下命令
-
commander takeoff
-
利用ROS啟動(dòng)仿真環(huán)境(正式)
-
老規(guī)矩先加載ROS,運(yùn)行命令
-
roscore
-
-
-
出現(xiàn)紅色警告,說明ROS本地緩存大于1GB,可以忽視,如果需要清理可以使用
-
rosclean purge
-
-
-
在PX4文件夾內(nèi)用mavros連接到本地ros,運(yùn)行以下命令打開gazebo仿真環(huán)境
-
roslaunch px4 mavros_posix_sitl.launch
編寫外部程序包
首先需要在ROS工作空間下,在src目錄下新建功能包
cd ~/catkin_ws/src catkin_create_pkg offboard roscpp mavros geometry_msgs //catkin_create_pkg 是ROS命令,新建一個(gè)功能包 //offboard 功能包名字 //roscpp mavros geometry_msgs功能包依賴 //命令格式catkin_create_pkg <package_name> [depend1] [depend2] [depend3]
在offboard功能包src目錄下新建cpp文件,將外部程序控制文件寫入保存
-
新建cpp文件
-
touch offboard_node.cpp
-
將以下程序?qū)懭氲絚pp文件,此程序參考的是PX4官網(wǎng)給出的例程。
-
/** * @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; //訂閱mavros狀態(tài) ros::Subscriber state_sub = nh.subscribe<mavros_msgs::State> ("mavros/state", 10, state_cb); //發(fā)布無人機(jī)位姿信息 ros::Publisher local_pos_pub = nh.advertise<geometry_msgs::PoseStamped> ("mavros/setpoint_position/local", 10); //定義起飛服務(wù)客戶端(起飛,降落) ros::ServiceClient arming_client = nh.serviceClient<mavros_msgs::CommandBool> ("mavros/cmd/arming"); //定義設(shè)置模式服務(wù)客戶端(設(shè)置offboard模式) 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 = 10; //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; }
-
在offboard目錄下找到Cmakelists.txt文件,并設(shè)置程序運(yùn)行節(jié)點(diǎn),不然rosrun命令無法找到該節(jié)點(diǎn),從而報(bào)錯(cuò)
-
-
輸入以下除藍(lán)色字體的命令
- 編輯好后即可進(jìn)行編譯
-
編譯
-
進(jìn)入到catkin_ws目錄下,運(yùn)行終端
-
cd /catkin_ws catkin_make
-
如上圖顯示編譯成功
-
運(yùn)行程序包
-
rosrun offboard offboard_node
文章來源:http://www.zghlxwxcb.cn/news/detail-770229.html
-
無人機(jī)實(shí)現(xiàn)自動(dòng)起飛10米高,程序運(yùn)行成功。文章來源地址http://www.zghlxwxcb.cn/news/detail-770229.html
小結(jié)
- 之所以要記錄本次的過程,是因?yàn)樽约簩?duì)ROS工作模式的進(jìn)一步了解,當(dāng)然,實(shí)驗(yàn)這篇前需要去了解一下ROS語法,這里推薦古月居博主,可以在B站和csdn上都可以搜到。
- 踩坑總結(jié):
- 在已經(jīng) 建立工作空間的情況下,如果需要新建程序包,不要在工作空間目錄(catkin_ws)下新建,而是要了解ros環(huán)境后在src目錄下使用命令新建程序包,不然編譯就會(huì)出錯(cuò)
- 運(yùn)行程序包的命令,不需要添加文件后綴名
- 之所以會(huì)產(chǎn)生各種錯(cuò)誤,是基于自己并不了解ros的工作模式和原理,實(shí)際上,只要自己有了經(jīng)驗(yàn),有了教訓(xùn),下一次的建立會(huì)相比較第一次都會(huì)順手很多。
- 錯(cuò)誤的不斷產(chǎn)生讓我一度以為自己的ros環(huán)境產(chǎn)生了懷疑,認(rèn)為自己的環(huán)境搭建出錯(cuò),但一切的根源就是自己的工作路徑添加錯(cuò)誤,對(duì)系統(tǒng)產(chǎn)生的錯(cuò)誤需要自己一點(diǎn)點(diǎn)去啃。
- 因?yàn)镽OS系統(tǒng)產(chǎn)生錯(cuò)誤顯示的是英文,對(duì)于一些不常見的錯(cuò)誤,可以利用有道詞典的劃詞功能,對(duì)錯(cuò)誤進(jìn)行翻譯,只有自己真正了解到這個(gè)錯(cuò)誤,最終才能夠有根據(jù)的去尋求答案。
- 最后送句話給自己吧。“海壓竹枝低復(fù)舉,風(fēng)吹山角晦還明”
到了這里,關(guān)于無人機(jī)仿真—PX4編譯,gazebo仿真及簡單off board控制模式下無人機(jī)起飛的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!