91在线观看视频-91在线观看视频-91在线观看免费视频-91在线观看免费-欧美第二页-欧美第1页

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

如何在ROS中調(diào)用.so文件

福州市凌睿智捷電子有限公司 ? 2024-06-30 08:23 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

設(shè)備

筆者有一個需求,需要結(jié)合ROS模擬量采集。有一種解決方法是ADC芯片+STM32主控,通過串口的方式與上位機通信,但串口通信速度很慢,達不到要求遂放棄。也考慮過使用NI的數(shù)據(jù)采集卡,貌似NI沒有給ubuntu作配套,也放棄了。在淘寶上找到一款凌智電子的DAQ,價格便宜,也能滿足使用需求,故做記錄。

系統(tǒng)環(huán)境 ubuntu20.04 + ROS noetic

硬件設(shè)備 i5-12500+凌智電子DAQ122

驅(qū)動下載

驅(qū)動要到gitee下載,支持ubuntu x86_64的驅(qū)動要注意分支TestZKFT。

git clone --branch=TestZKFT https://gitee.com/Lockzhiner-Electronics/DAQ122-IPC.git

下在之后可以嘗試運行 幾個demo,都是用Qt寫的,也可以拷貝Linux/libdaq的目錄單獨開發(fā)。最關(guān)鍵的是 liblibdaq-2.0.0.so這個文件,下面以ROS為例子怎么調(diào)用.so文件。

結(jié)合cmake的使用

新建工作空間,功能包等流程不再贅述,網(wǎng)上已經(jīng)有很多教程了。著重講cmakelist的配置。

沿用官方demo中QT的使用,因此

find_package(
Qt5 REQUIRED COMPONENTS Core Widgets
)

除此之外,還要包含頭文件目錄,除了包含官方libdaq的路徑以外,還要包含QT安裝的路徑

include_directories(
include/daq_122 #自己寫了一個.h文件
${catkin_INCLUDE_DIRS}
${CMAKE_CURRENT_SOURCE_DIR}/include/daq_122
${CMAKE_CURRENT_SOURCE_DIR}/include/daq_122/include
${CMAKE_CURRENT_SOURCE_DIR}/include/daq_122/third_party/include

${catkin_INCLUDE_DIRS}
${Qt5Core_INCLUDE_DIRS}
${Qt5Widgets_INCLUDE_DIRS}
)

鏈接官方的.so庫文件

link_directories(
lib/x86_64 # 相對路徑,指定動態(tài)鏈接庫的訪問路徑
${catkin_LIB_DIRS}
)

再就是ROS 編譯C++的cmake寫法了。雖然so文件叫l(wèi)iblibdaq-2.0.0,但cmake中需要去掉一個lib才能執(zhí)行下去。

add_library(${PROJECT_NAME}
src/daq_read.cpp
)
add_executable(daq_read src/daq_read.cpp)
add_dependencies(daq_read ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS})
target_link_libraries(daq_read
${catkin_LIBRARIES}
libdaq-2.0.0 #這里額外注意,編譯時候cmake會自動加個前綴lib
Qt5::Core
Qt5::Widgets
)

至此,完成了cmakelist的寫法。

此外還有package.xml文件,需要引用如下

catkin
roscpp
rospy
std_msgs
qtbase5-dev
geometry_msgs
roscpp
rospy
std_msgs
geometry_msgs
roscpp
rospy
std_msgs
qtbase5-dev
geometry_msgs

其中g(shù)eometry_msgs是筆者實現(xiàn)自己功能用的一個包,可以不用,其他的包都是必須的。

ROS的寫法

現(xiàn)在要寫一個.h文件,定義一些變量。之前cmake已經(jīng)有了對QT的引用,因此直接用QT函數(shù)就行。

# ifndef DAQ_READ_H
# define DAQ_READ_H
#include
#include
#include
#include
#include
using namespace libdaq::device;
DAQ122 daq_device;
uint8_t adc_channel_state_ = 0b11111111;
uint8_t legal_channel_size = 8;
uint32_t storage_depth = 1;
QVector> receive_data(8);
geometry_msgs::Vector3 laser_distance;
# endif

各個變量的作用,參考官方的示例即可。

接下來是C++文件,運行程序要求有sudo 權(quán)限。筆者這里用前三個姿態(tài),以5K頻率讀,再以5K頻率發(fā)送,設(shè)置如下

#include
#include
#include "data_read.h"

/*
運行這個程序要求sudo權(quán)限
sudo su
然后輸入你的用戶名+密碼

包含兩部分 ros+daq讀取
*/

void DAQcallback()
{
auto read_result = true;
for (int i = 0; i < 3; i++) {
// 判斷當前通道是否打開,沒有打開則跳過
if((adc_channel_state_ & (0b00000001) << i) == 0){
continue;
}
// 讀取數(shù)據(jù)
read_result = daq_device.TryReadADCData(i, receive_data[i].data(), receive_data[i].size(), 1000);
if(!read_result){

}
}
QVector x_data(storage_depth);
for (int var = 0; var < storage_depth; ++var) {
x_data[var] = 1000.0 / storage_depth * var;
}
// read_result = daq_device.TryReadADCData(1,receive_data.data(),10,10);
// 只配置了三個通道
auto current_buffer_size = daq_device.GetADCBufferDataSize(0);
qDebug() << receive_data[1];
// 停止讀取
// daq_device.StopADCCollection();
// receive_data[0].clear();
// receive_data[1].clear();
// receive_data[2].clear();
laser_distance.x = receive_data[0].at(0);
laser_distance.y = receive_data[1].at(0);
laser_distance.z = receive_data[2].at(0);

}

int main(int argc, char *argv[])
{
// 初始化DAQ122
if (!daq_device.InitializeDevice())
{
std::cout << "InitializeDevice Error";
}
if(!daq_device.ConnectedDevice())
{
std::cout << "ConnectedDevice Error";
}

// 采樣范圍5V
auto voltage_range = DAQVoltage::Voltage5V;
// 采樣頻率定義為1KHz
auto sample_rate = DAQADCSampleRate::SampleRate5K;
if (!daq_device.ConfigureADCParameters(sample_rate, voltage_range))
{
std::cout << "Configure Error";
}
// 配置前三個通道為輸入
adc_channel_state_ = DAQADCChannel::AIN1 | DAQADCChannel::AIN2 | DAQADCChannel::AIN3;
daq_device.ConfigADCChannel(adc_channel_state_);

// 開始采集數(shù)據(jù)
daq_device.StartADCCollection();

// 定義存儲數(shù)組
for (int var = 0; var < receive_data.size(); ++var) {
receive_data[var].resize(storage_depth);
}

// ros初始化
ros::init(argc,argv,"daq_pub_node");
ros::NodeHandle nh;
// 1ms 執(zhí)行一次
ros::Publisher daq_pub = nh.advertise("daq_pub",10);

ros::Duration(1).sleep();
// 判斷當前數(shù)據(jù)是否已經(jīng)滿足讀取的條件
if(!daq_device.ADCDataIsReady(storage_depth)){
std::cout << "not enough" << std::endl;
}

auto read_result = true;
for (int i = 0; i < legal_channel_size; i++) {
// 判斷當前通道是否打開,沒有打開則跳過
if((adc_channel_state_ & (0b00000001) << i) == 0){
continue;
}

// 讀取數(shù)據(jù)
read_result = daq_device.TryReadADCData(i, receive_data[i].data(), receive_data[i].size(), 1000);
if(!read_result){
// qDebug() << "Error";
}
}

QVector x_data(storage_depth);
for (int var = 0; var < storage_depth; ++var) {
x_data[var] = 1000.0 / storage_depth * var;
}
ros::Rate daq_rate(5000);
while (ros::ok())
{
DAQcallback();
daq_pub.publish(laser_distance);

daq_rate.sleep();
}
// ros::spin();
return 0;
}

編譯,運行即可將數(shù)據(jù)發(fā)送到rostopic中。

采集正弦信號

f213d158-3676-11ef-a655-92fbcf53809c.jpg

采集方波信號

f22c81e4-3676-11ef-a655-92fbcf53809c.jpg

采集三角波信號

f2431724-3676-11ef-a655-92fbcf53809c.jpg

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 串口通信
    +關(guān)注

    關(guān)注

    34

    文章

    1640

    瀏覽量

    56821
  • ROS
    ROS
    +關(guān)注

    關(guān)注

    1

    文章

    288

    瀏覽量

    17752
  • 模擬量采集
    +關(guān)注

    關(guān)注

    0

    文章

    24

    瀏覽量

    3116
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關(guān)推薦
    熱點推薦

    何在ROS的基礎(chǔ)上提升無人駕駛系統(tǒng)的可靠性

    本文著重介紹基于機器人操作系統(tǒng)ROS的無人駕駛系統(tǒng)。文中將介紹ROS以及它在無人駕駛場景的優(yōu)缺點,并討論如何在ROS的基礎(chǔ)上提升無人駕駛系
    的頭像 發(fā)表于 02-15 10:26 ?4350次閱讀
    如<b class='flag-5'>何在</b><b class='flag-5'>ROS</b>的基礎(chǔ)上提升無人駕駛系統(tǒng)的可靠性

    何在ROS調(diào)用.so文件

    。 采集正弦信號 采集方波信號 采集三角波信號 原文鏈接:如何在ROS調(diào)用.so
    發(fā)表于 07-02 14:44

    何在VEE 8.5調(diào)用viopen和viclose

    Vee 8.5調(diào)用viopen和viclose函數(shù)。非常感謝。最好的問候亞歷克斯 以上來自于谷歌翻譯 以下為原文dear all, I want to close an instrument( can
    發(fā)表于 07-30 14:21

    在Android中使用ROS

    /buildscript.gradle"}然后在文件添加subprojects { apply plugin: 'ros-android' afterEvaluate { project ->android
    發(fā)表于 05-16 19:16

    如何移植ROS程序到Android

    在Android上運行ROS程序一般使用rosjava-android。但是也可以直接利用NDK編譯成so文件移植到Android上。當然移植過程也并不簡單。 下面是一個簡單的例子。安裝cmake
    發(fā)表于 05-16 19:20

    ROS何在代碼層面去接收stm32發(fā)送過來的數(shù)據(jù)?

    如何實現(xiàn)ROS與stm32之間的通信?ROS對stm32發(fā)送過來的數(shù)據(jù)做了哪些處理?ROS主控主要實現(xiàn)的功能有哪些?ROS何在代碼層面去接
    發(fā)表于 10-12 08:17

    何在ROS2運行小烏龜呢

    ROS2運行小烏龜,其實主要就是安裝兩個工具,turtlesim和rqt。A: 安裝turtlesim。輸入【sudo apt update】輸入【sudo apt install
    發(fā)表于 11-05 06:08

    怎樣去使用ROS的launch啟動文件

    怎樣去使用ROS的launch啟動文件呢?ROS的launch啟動文件該怎樣去使用呢?
    發(fā)表于 02-14 07:23

    何在ROS上使用serial包進行串口通信

    作者:良知猶存轉(zhuǎn)載授權(quán)以及圍觀:歡迎添加微信公眾號:羽林君前言主題:串口是一種設(shè)備間常用的通訊接口,rosserial將串口字符數(shù)據(jù)轉(zhuǎn)發(fā)到標準ROS網(wǎng)絡(luò),并輸出到rosout和其日志文件。本文將記錄
    發(fā)表于 02-21 07:27

    何在普通的鴻蒙工程中使用編譯好的SO文件

    。二、SO庫的使用本篇主要介紹如何在普通的鴻蒙工程中使用編譯好的SO文件。首先,新建一個普通的鴻蒙項目工程,我的工程名叫SOTest。項目工程建好后,就將
    發(fā)表于 03-25 10:06

    何在啟動文件調(diào)用定義為uint32_t getValue(void)的C函數(shù)呢?

    我如何在啟動文件調(diào)用定義為 uint32_t getValue(void) 的 C 函數(shù)(在 Reset_Handler 例程)?需要什
    發(fā)表于 12-09 07:27

    JNI java調(diào)用so動態(tài)庫方法

    JNI Java調(diào)用so包相關(guān)問題總結(jié),出現(xiàn)了很多問題,按照操作應(yīng)該不會發(fā)生不到so包的錯誤,其實最后出現(xiàn)的也是說加載不到libpython2.7.x.so.1,我就納悶了,怎么和py
    發(fā)表于 11-28 13:13 ?3650次閱讀

    Android下的DEX文件SO文件梳理總結(jié)

    android逆向分析、脫殼破解分析過程免不了和android的各種文件格式打交道(so、dex、xml、art、oat等等)。
    的頭像 發(fā)表于 11-04 09:32 ?8817次閱讀

    何在ROS檢查保存log的文件夾有多大

    _comm-noetic-develtoolsroslaunchsrcroslaunch_ init _.py文件的main函數(shù)里,有以下語句。 看名字就知道是干啥的了。 rlutil .check_log_disk_usage () 再打開同一路徑下的rlutil.p
    的頭像 發(fā)表于 09-14 18:07 ?2325次閱讀
    如<b class='flag-5'>何在</b><b class='flag-5'>ROS</b><b class='flag-5'>中</b>檢查保存log的<b class='flag-5'>文件</b>夾有多大

    如何將python文件導(dǎo)入到ROS系統(tǒng)

    本文通過使用myCobot機械臂進行QR碼視覺追蹤的實踐案例分析,介紹如何將 python 文件導(dǎo)入到 ROS 系統(tǒng)
    的頭像 發(fā)表于 02-11 11:08 ?807次閱讀
    如何將python<b class='flag-5'>文件</b>導(dǎo)入到<b class='flag-5'>ROS</b>系統(tǒng)<b class='flag-5'>中</b>
    主站蜘蛛池模板: 天天色天天干天天 | 青草午夜精品视频在线观看 | 亚洲性后网 | 亚洲国产激情在线一区 | xxxx人妖| 日韩免费精品视频 | 8888奇米四色在线 | 国产精品久久久久久久久免费观看 | 高清一级做a爱视频免费 | 免费网址视频在线看 | 久久国产乱子伦精品免费看 | 四虎最新网 | 男女视频在线播放 | 朱元璋传奇1998王耿豪版 | 日本色色图| 色天天躁夜夜躁天干天干 | 国产亚洲人成网站天堂岛 | 国产高清一级在线观看 | 欧美二级黄色片 | 波多野结衣在线观看一区 | 特黄特黄一级高清免费大片 | 69日本xxxxxxxxx98 69日本xxxxxxxxx内谢 | 夜夜超b天天 | 免费国产一区 | 天天久久影视色香综合网 | 天天干夜夜骑 | 一区二区三区四区五区 | 欧美成人一区二区三区在线电影 | 亚洲一区二区三区影院 | 亚洲黄页网站 | 天天爽夜夜爽人人爽 | 国产三级日本三级美三级 | 无毒三级 | 黄色网址日本 | 五月综合激情网 | 婷婷爱五月天 | 日韩草逼 | 午夜看片福利 | 精品午夜久久福利大片免费 | 国产做a爰片久久毛片a | 国产午夜视频在线观看第四页 |