国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

ROS與STM32通信(一)-rosserial

這篇具有很好參考價(jià)值的文章主要介紹了ROS與STM32通信(一)-rosserial。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

硬件

  • STM32F103c8t6
  • OLED(I2C)
  • USB2TTL
  • Stlink

接線

OLED(GPIO模擬I2C)

硬件 引腳
OLEDSCL PA4
OLEDSDA PA5

USART1

硬件 引腳 作用
RX PA9 USART1_TX
TX PA10 USART1_RX

LED

硬件 引腳
LED0 PC13
LED1 PC15

軟件

  • STM32CubeMX
  • Clion

STM32CubeMX配置

  • SYS->Debug->Serial Wire
  • RCC->HSE->Crystal/Ceramic Resonator
  • PC15->OutPut ,Label為LED0
  • PC13->OutPut ,Label為LED1
  • TIM1->Clock Source->Internal Clock
  • 時(shí)鐘樹,時(shí)鐘設(shè)置為72M
  • USART1->Asynchronous Baud Rate: 115200

設(shè)置DMA

ros與stm32通訊,stm32,嵌入式硬件,單片機(jī)

開啟串口中斷

ros與stm32通訊,stm32,嵌入式硬件,單片機(jī)

rosserial

rosserial是ROS中的一個(gè)重要模塊,它實(shí)現(xiàn)了ROS通信協(xié)議與各類嵌入式硬件平臺之間的橋接,大大簡化了ROS在底層硬件上的移植和應(yīng)用。rosserial通過消息序列化和常用串行通信接口,實(shí)現(xiàn)了ROS主機(jī)和嵌入式客戶端之間的消息交互,為各種嵌入式平臺提供了C++和Python的ROS客戶端庫,使得在這些硬件上也能方便地使用ROS的通信架構(gòu)來進(jìn)行節(jié)點(diǎn)管理、話題通信和服務(wù)調(diào)用。rosserial還支持動態(tài)主題和服務(wù),以較小的代碼占用實(shí)現(xiàn)ROS功能,具有很強(qiáng)的可移植性。因此,rosserial是ROS物聯(lián)網(wǎng)和機(jī)器人應(yīng)用不可或缺的重要組件,極大地便利了ROS在各類嵌入式系統(tǒng)和小型機(jī)器人產(chǎn)品上的移植應(yīng)用和開發(fā)。

rosserial_WIKI

ros與stm32通訊,stm32,嵌入式硬件,單片機(jī)

rosserial_stm32 Github地址

本文資源包stm32f103c8t6_rosserial, CSDN資源下載

移植

下載上述資源stm32f103c8t6_rosserial

git clone https://github.com/GHigher12/STM32f103c8t6_rosserial.git

or 直接在CSDN下載

將RosLibs文件夾添加到stm32工作文件里

ros與stm32通訊,stm32,嵌入式硬件,單片機(jī)

還有Core文件夾中的mainpp.h , round.h, mainpp.cpp

此時(shí)如果用Clion作為開發(fā)環(huán)境還需要修改CMakeList.txt

包含文件的路徑

ros與stm32通訊,stm32,嵌入式硬件,單片機(jī)

main.c使用

//...
#include "mainpp.h"
//...
int main(void)
{
//...
  setup();
  while (1)
  {
      loop();
  }
  /* USER CODE END 3 */
}

上位機(jī)訂閱-下位機(jī)發(fā)布

上位機(jī)訂閱

python訂閱 demo01_sub_py.py

#! /usr/bin/env python
import rospy
from std_msgs.msg import String

if __name__ == "__main__":
    rospy.init_node("ros_pc_pub")
    pub = rospy.Publisher("pc_to_stm32",String,queue_size=10)
    msg = String()
    msg_front = "ros_2_stm32->"
    count = 0
    rate = rospy.Rate(1)
    while not rospy.is_shutdown():
        msg.data = msg_front + str(count)
        pub.publish(msg)
        rate.sleep()
        rospy.loginfo("發(fā)布的數(shù)據(jù)為:%s",msg.data)
        count += 1

c++訂閱 demo01_sub_c.cpp

#include "ros/ros.h"
#include "std_msgs/String.h"
#include <sstream>


void doMsg(const std_msgs::String::ConstPtr &msg)
{
    ROS_INFO("訂閱的數(shù)據(jù)為: %s", msg->data.c_str());
}

int main(int argc, char *argv[])
{

    setlocale(LC_ALL,"");
    ros::init(argc, argv, "ros_pc_sub");
    ros::NodeHandle nh;
    ros::Subscriber sub = nh.subscribe("stm32_to_pc", 10, doMsg);
    ros::spin();
    return 0;
}

安裝rosserial_python

sudo apt-get install ros-noetic-rosserial-python

下位機(jī)發(fā)布

mainpp.cpp

#include <mainpp.h>
#include <ros.h>
#include <std_msgs/String.h>
#include "main.h"

ros::NodeHandle nh;

std_msgs::String stm32_to_pc_word;

ros::Publisher stm32_to_pc("stm32_to_pc", &stm32_to_pc_word);

void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart){
  nh.getHardware()->flush();
}

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart){
  nh.getHardware()->reset_rbuf();
}
char hello[13] = "hello ros!";
u8 cnt = 0;
void setup(void)
{
    nh.initNode();
	nh.advertise(stm32_to_pc);
}

void loop(void)
{
    cnt+=1;
    sprintf(oledBuf,"stm32_2_ros->%d",cnt);
    OLED_ShowString(0,24,(u8*)oledBuf,16);
    OLED_Refresh();
    stm32_to_pc_word.data = oledBuf;
    HAL_GPIO_TogglePin(LED0_GPIO_Port, LED0_Pin);
    HAL_GPIO_TogglePin(LED1_GPIO_Port, LED1_Pin);
	HAL_Delay(1000);
	stm32_to_pc.publish(&stm32_to_pc_word);
	nh.spinOnce();
}

編譯將程序燒錄到stm32中

通信

將usb2ttl連接好usart1,連接電腦

執(zhí)行下列命令

lsusb
ls /dev/ttyUSB*
sudo chmod 777 /dev/ttyUSB0

ros與stm32通訊,stm32,嵌入式硬件,單片機(jī)

啟動rosserial_python節(jié)點(diǎn)

roscore
rosrun rosserial_python serial_node.py _port:=/dev/ttyUSB0 _baud:=115200

出現(xiàn)以下內(nèi)容則表示運(yùn)行正常

[INFO] [1690446448.903399]: ROS Serial Python Node
[INFO] [1690446448.908570]: Connecting to /dev/ttyUSB0 at 115200 baud
[INFO] [1690446451.013146]: Requesting topics...
[INFO] [1690446451.772474]: Note: publish buffer size is 512 bytes
[INFO] [1690446451.774498]: Setup publisher on stm32_to_pc [std_msgs/String]

可使用rostopic echo /stm32_to_pc查看話題

ros與stm32通訊,stm32,嵌入式硬件,單片機(jī)

不過這里會出現(xiàn)[ERROR] [1690446652.290474]: Lost sync with device, restarting...報(bào)錯,導(dǎo)致收發(fā)頻率不一致,博主現(xiàn)在還沒解決,如有讀者有解決辦法,可在評論留言。

python訂閱

cd ~/catkin_ws
source ./devel/setup.bash
rosrun hello_vscode demo01_sub_py.py

ros與stm32通訊,stm32,嵌入式硬件,單片機(jī)

c++訂閱

cd ~/catkin_ws
source ./devel/setup.bash
rosrun hello_vscode demo01_sub_c

ros與stm32通訊,stm32,嵌入式硬件,單片機(jī)

下位機(jī)顯示

ros與stm32通訊,stm32,嵌入式硬件,單片機(jī)

查看rqt_graph

ros與stm32通訊,stm32,嵌入式硬件,單片機(jī)

上位機(jī)發(fā)布-下位機(jī)訂閱

上位機(jī)發(fā)布

python發(fā)布 demo01_pub_py.py

#! /usr/bin/env python
import rospy
from std_msgs.msg import String

if __name__ == "__main__":
    rospy.init_node("ros_pc_pub")
    pub = rospy.Publisher("pc_to_stm32",String,queue_size=10)
    msg = String()
    msg_front = "ros_2_stm32->"
    count = 0
    rate = rospy.Rate(1)
    while not rospy.is_shutdown():
        msg.data = msg_front + str(count)
        pub.publish(msg)
        rate.sleep()
        rospy.loginfo("發(fā)布的數(shù)據(jù)為:%s",msg.data)
        count += 1

c++發(fā)布 demo01_pub_c.cpp

#include "ros/ros.h"
#include "std_msgs/String.h"
#include <sstream>
int main(int argc, char *argv[])
{
    setlocale(LC_ALL,"");
    ros::init(argc, argv, "ros_pc_pub");
    ros::NodeHandle nh;
    ros::Publisher pub = nh.advertise<std_msgs::String>("pc_to_stm32", 10);
    std_msgs::String msg;
    ros::Rate rate(1);
    int count = 0;
    ros::Duration(3).sleep();
    while (ros::ok)
    {
        count++;
        std::stringstream ss;
        ss << "ros_2_stm32->" << count;
        msg.data = ss.str();
        pub.publish(msg);
        ROS_INFO("發(fā)布的數(shù)據(jù)為: %s", ss.str().c_str());
        rate.sleep();
        ros::spinOnce();  //處理回調(diào)函數(shù)
    }
    return 0;
}

下位機(jī)訂閱

mainpp.cpp

#include <mainpp.h>
#include <ros.h>
#include <std_msgs/String.h>
#include "main.h"
void command_callback( const std_msgs::String& rxbuff);

ros::NodeHandle nh;

std_msgs::String stm32_to_pc_word;

ros::Subscriber<std_msgs::String> cmd_sub("pc_to_stm32", command_callback);

void command_callback(const std_msgs::String &rxbuff)
{
    char oled_rxbuff[128];
    stm32_to_pc_word = rxbuff;
    snprintf(oled_rxbuff, sizeof(oled_rxbuff), "%s", rxbuff.data);
    OLED_ShowString(0,24, (u8*)oled_rxbuff,16);
    OLED_Refresh();
}
void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart){
  nh.getHardware()->flush();
}

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart){
  nh.getHardware()->reset_rbuf();
}
void setup(void)
{
    nh.initNode();
	nh.subscribe(cmd_sub);
}

void loop(void)
{
    HAL_GPIO_TogglePin(LED0_GPIO_Port, LED0_Pin);
    HAL_GPIO_TogglePin(LED1_GPIO_Port, LED1_Pin);
	HAL_Delay(1000);
	nh.spinOnce();
}


通信

python發(fā)布

rosrun hello_vscode demo01_pub_py.py

ros與stm32通訊,stm32,嵌入式硬件,單片機(jī)

c++發(fā)布

rosrun hello_vscode demo01_pub_c

ros與stm32通訊,stm32,嵌入式硬件,單片機(jī)

下位機(jī)顯示

ros與stm32通訊,stm32,嵌入式硬件,單片機(jī)

查看rqt_graph

ros與stm32通訊,stm32,嵌入式硬件,單片機(jī)文章來源地址http://www.zghlxwxcb.cn/news/detail-708696.html

到了這里,關(guān)于ROS與STM32通信(一)-rosserial的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 通信工程畢設(shè) Stm32酒駕檢查系統(tǒng) - 單片機(jī) 嵌入式 物聯(lián)網(wǎng)

    通信工程畢設(shè) Stm32酒駕檢查系統(tǒng) - 單片機(jī) 嵌入式 物聯(lián)網(wǎng)

    ?? 這兩年開始畢業(yè)設(shè)計(jì)和畢業(yè)答辯的要求和難度不斷提升,傳統(tǒng)的畢設(shè)題目缺少創(chuàng)新和亮點(diǎn),往往達(dá)不到畢業(yè)答辯的要求,這兩年不斷有學(xué)弟學(xué)妹告訴學(xué)長自己做的項(xiàng)目系統(tǒng)達(dá)不到老師的要求。 為了大家能夠順利以及最少的精力通過畢設(shè),學(xué)長分享優(yōu)質(zhì)畢業(yè)設(shè)計(jì)項(xiàng)目,今天

    2024年02月19日
    瀏覽(701)
  • 通信工程畢設(shè) Stm32單片機(jī)的音樂播放器設(shè)計(jì) - 物聯(lián)網(wǎng) 嵌入式

    通信工程畢設(shè) Stm32單片機(jī)的音樂播放器設(shè)計(jì) - 物聯(lián)網(wǎng) 嵌入式

    ?? 這兩年開始畢業(yè)設(shè)計(jì)和畢業(yè)答辯的要求和難度不斷提升,傳統(tǒng)的畢設(shè)題目缺少創(chuàng)新和亮點(diǎn),往往達(dá)不到畢業(yè)答辯的要求,這兩年不斷有學(xué)弟學(xué)妹告訴學(xué)長自己做的項(xiàng)目系統(tǒng)達(dá)不到老師的要求。 為了大家能夠順利以及最少的精力通過畢設(shè),學(xué)長分享優(yōu)質(zhì)畢業(yè)設(shè)計(jì)項(xiàng)目,今天

    2024年02月19日
    瀏覽(103)
  • 通信工程畢設(shè) stm32智能運(yùn)動計(jì)步系統(tǒng) - 物聯(lián)網(wǎng) 嵌入式 單片機(jī)

    通信工程畢設(shè) stm32智能運(yùn)動計(jì)步系統(tǒng) - 物聯(lián)網(wǎng) 嵌入式 單片機(jī)

    ?? 這兩年開始畢業(yè)設(shè)計(jì)和畢業(yè)答辯的要求和難度不斷提升,傳統(tǒng)的畢設(shè)題目缺少創(chuàng)新和亮點(diǎn),往往達(dá)不到畢業(yè)答辯的要求,這兩年不斷有學(xué)弟學(xué)妹告訴學(xué)長自己做的項(xiàng)目系統(tǒng)達(dá)不到老師的要求。 為了大家能夠順利以及最少的精力通過畢設(shè),學(xué)長分享優(yōu)質(zhì)畢業(yè)設(shè)計(jì)項(xiàng)目,今天

    2024年02月21日
    瀏覽(712)
  • 【嵌入式知識08】STM32的USART串口通信,給上位機(jī)連續(xù)發(fā)送Hello Windows!

    【嵌入式知識08】STM32的USART串口通信,給上位機(jī)連續(xù)發(fā)送Hello Windows!

    本文主要介紹串口協(xié)議和RS-232、485標(biāo)準(zhǔn),以及RS232、485電平與TTL電平的區(qū)別,了解\\\"USB/TTL轉(zhuǎn)232\\\"模塊的工作原理;并完成一個(gè)STM32的USART串口通訊程序。 ??串口通信(Serial Communication)的概念非常簡單,串口按位(bit)發(fā)送和接收字節(jié)的通信方式。盡管比按字節(jié)(byte)的并行通信

    2024年02月13日
    瀏覽(32)
  • 通信工程畢設(shè) 基于Stm32的便攜體測儀(心率 體溫) - 單片機(jī) 嵌入式 物聯(lián)網(wǎng)

    通信工程畢設(shè) 基于Stm32的便攜體測儀(心率 體溫) - 單片機(jī) 嵌入式 物聯(lián)網(wǎng)

    ?? 這兩年開始畢業(yè)設(shè)計(jì)和畢業(yè)答辯的要求和難度不斷提升,傳統(tǒng)的畢設(shè)題目缺少創(chuàng)新和亮點(diǎn),往往達(dá)不到畢業(yè)答辯的要求,這兩年不斷有學(xué)弟學(xué)妹告訴學(xué)長自己做的項(xiàng)目系統(tǒng)達(dá)不到老師的要求。 為了大家能夠順利以及最少的精力通過畢設(shè),學(xué)長分享優(yōu)質(zhì)畢業(yè)設(shè)計(jì)項(xiàng)目,今天

    2024年02月20日
    瀏覽(94)
  • 通信工程畢設(shè) 單片機(jī)自動寫字機(jī)器人設(shè)計(jì)與實(shí)現(xiàn) - 物聯(lián)網(wǎng) 嵌入式 stm32

    通信工程畢設(shè) 單片機(jī)自動寫字機(jī)器人設(shè)計(jì)與實(shí)現(xiàn) - 物聯(lián)網(wǎng) 嵌入式 stm32

    ?? 這兩年開始畢業(yè)設(shè)計(jì)和畢業(yè)答辯的要求和難度不斷提升,傳統(tǒng)的畢設(shè)題目缺少創(chuàng)新和亮點(diǎn),往往達(dá)不到畢業(yè)答辯的要求,這兩年不斷有學(xué)弟學(xué)妹告訴學(xué)長自己做的項(xiàng)目系統(tǒng)達(dá)不到老師的要求。 為了大家能夠順利以及最少的精力通過畢設(shè),學(xué)長分享優(yōu)質(zhì)畢業(yè)設(shè)計(jì)項(xiàng)目,今天

    2024年01月15日
    瀏覽(114)
  • 通信工程畢設(shè) Stm32 WIFI智能家居溫濕度和煙霧檢測系統(tǒng) - 單片機(jī) 物聯(lián)網(wǎng) 嵌入式

    通信工程畢設(shè) Stm32 WIFI智能家居溫濕度和煙霧檢測系統(tǒng) - 單片機(jī) 物聯(lián)網(wǎng) 嵌入式

    ?? 這兩年開始畢業(yè)設(shè)計(jì)和畢業(yè)答辯的要求和難度不斷提升,傳統(tǒng)的畢設(shè)題目缺少創(chuàng)新和亮點(diǎn),往往達(dá)不到畢業(yè)答辯的要求,這兩年不斷有學(xué)弟學(xué)妹告訴學(xué)長自己做的項(xiàng)目系統(tǒng)達(dá)不到老師的要求。 為了大家能夠順利以及最少的精力通過畢設(shè),學(xué)長分享優(yōu)質(zhì)畢業(yè)設(shè)計(jì)項(xiàng)目,今天

    2024年02月02日
    瀏覽(96)
  • stm32嵌入式實(shí)驗(yàn)考核

    STM32 實(shí)驗(yàn)考核題目 1. 利用 STM32 小板實(shí)現(xiàn):控制外接 LED 燈每隔 3 秒鐘亮暗變換,同 時(shí)在 PC 機(jī)上顯示 MCU 的計(jì)時(shí)時(shí)間,MCU 的初始時(shí)間由 PC 機(jī) 方設(shè)置。 2. 利用 STM32 小板實(shí)現(xiàn):利用導(dǎo)線外接 GPIO 口模擬 2 個(gè)按鍵輸入, 根據(jù)輸入組合的四種情況,分別控制三色燈四種流水燈效果

    2024年02月03日
    瀏覽(29)
  • 【嵌入式學(xué)習(xí)筆記】嵌入式基礎(chǔ)9——STM32啟動過程

    【嵌入式學(xué)習(xí)筆記】嵌入式基礎(chǔ)9——STM32啟動過程

    程序段交叉引用關(guān)系(Section Cross References):描述各文件之間函數(shù)調(diào)用關(guān)系 刪除映像未使用的程序段(Removing Unused input sections from the image):描述工程中未用到被刪除的冗余程序段(函數(shù)/數(shù)據(jù)) 映像符號表(Image Symbol Table):描述各符號(程序段/數(shù)據(jù))在存儲器中的地址、類

    2024年02月15日
    瀏覽(64)
  • STM32的時(shí)鐘系統(tǒng)(嵌入式學(xué)習(xí))

    STM32的時(shí)鐘系統(tǒng)(嵌入式學(xué)習(xí))

    時(shí)鐘是指用于計(jì)量和同步時(shí)間的裝置或系統(tǒng)。時(shí)鐘是嵌入式系統(tǒng)的脈搏,處理器內(nèi)核在時(shí)鐘驅(qū)動下完成指令執(zhí)行,狀態(tài)變換等動作,外設(shè)部件在時(shí)鐘的驅(qū)動下完成各種工作,例如:串口數(shù)據(jù)的發(fā)送、AD轉(zhuǎn)換、定時(shí)器計(jì)數(shù)等。因此時(shí)鐘對于計(jì)算機(jī)系統(tǒng)是至關(guān)重要的,通常時(shí)鐘系

    2024年02月16日
    瀏覽(29)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包