当前位置: 首页 > news >正文

汉中专业网站建设公司全网营销的四大优势

汉中专业网站建设公司,全网营销的四大优势,wordpress加视频,人人做免费网站就我知道的#xff1a;micro-ros只能在特定的昂贵的开发板上面运行#xff0c;但是偶然发现了这个文章#xff0c;似乎提供了一个全新的方式来在ros2和单片机之间通讯#xff0c;如果能够这样肯定也能够提高效率#xff0c;但即使不行#xff0c;使用串口库也应该比较简单…就我知道的micro-ros只能在特定的昂贵的开发板上面运行但是偶然发现了这个文章似乎提供了一个全新的方式来在ros2和单片机之间通讯如果能够这样肯定也能够提高效率但即使不行使用串口库也应该比较简单。 GitHub - lFatality/stm32_micro_ros_setup: Example of how to setup micro-ROS on any STM32 microcontroller README.md Setting up micro-ROS on any STM32 microcontroller This repository gives an example of how to set up micro-ROS on any STM32 microcontroller. For this repository an STM32F429ZI was chosen but you are free to choose another one. You can also find the instructions in video form here: https://youtu.be/xbWaHARjSmk Goal If you follow all steps in the tutorial you should have an STM32 microcontroller with a micro-ROS publisher that transmits messages via UART to your PC running ROS 2. Here you can receive the messages via ros2 topic echo. Steps In the following the required steps to achieve the goal are presented in detail. It will show how to do this for a microcontroller that is not listed as a device directly supported by micro-ROS. 看到没有即使是不受官方支持的也可以使用MICRO_ROS,那个官方支持的开发板实在太少而且太贵所以我才说成本太高现在看来有办法降低成本了)If you find that you have problems check out the Troubleshooting section below.如果有问题请看后面的”Trobleshooting“部分 micro-ROS 1.) Create a new CubeMx project for your micro controller 2.) In System Core - RCC - High Speed Clock (HSE) select Crystal/Ceramic Resonator 3.) In System Core - SYS - Timebase Source select TIM1 4.) In Middleware - FREERTOS - Interface select CMSIS_V2 4.1.) In Middleware - FREERTOS - Configuration - Task and Queues double click the defaultTask and set a stack size of 3000. It has to be greater than 10.000 byte (3000 words * 4 byte 12.000 byte).F103C8T6有20KB明明没有超为什么不行 注意了STM32C8T6在这里好像出了问题因为这个Stack Size我感觉好像超了 如果遇到这个问题需要首先修改堆栈大小 修改步骤修改Config parmeters--Memory management settings----TOTAL_HEAP_SIZE设置为16000然后就可以解决这个问题 看吧已经改好了 5.) In Connectivity choose the UART / USART that you want to use. 5.1.) In the Uart configuration, go to DMA Settings. Click on the Add button. Click on the Select dropdown and choose both Rx and Tx. 5.2.) Click on the Rx DMA youve just created and for Mode choose Circular. 5.3.) For the priority of the DMA choose Very high for both Rx and Tx. 5.4.) Go to NVIC Settings of the UART and activate the UARTx global interrupt. 6.) Set up the Clock Configuration for your micro controller 7.) In Project Manager select a folder where to generate your code 7.1.) In Toolchain / IDE select Makefile这里有点不一样平时都选择keil 7.2.) Optional: In Project Manager - Code Generator select Generate peripheral intitialization as a pair of .c/.h files per peripheral 8.) Click on Generate Code 9.) In the root folder of the code youve just generated, clone the following repository (into a subfolder, dont change its name).: git clone https://github.com/micro-ROS/micro_ros_stm32cubemx_utils.git 10.) Make sure you have the right branch for your ROS version checked out 11.) In the Makefile that was generated by CubeMx put the following code snippet after the part where it says build the application: ####################################### # micro-ROS addons ####################################### LDFLAGS micro_ros_stm32cubemx_utils/microros_static_library/libmicroros/libmicroros.a C_INCLUDES -Imicro_ros_stm32cubemx_utils/microros_static_library/libmicroros/microros_include# Add micro-ROS utils C_SOURCES micro_ros_stm32cubemx_utils/extra_sources/custom_memory_manager.c C_SOURCES micro_ros_stm32cubemx_utils/extra_sources/microros_allocators.c C_SOURCES micro_ros_stm32cubemx_utils/extra_sources/microros_time.c# Set here the custom transport implementation C_SOURCES micro_ros_stm32cubemx_utils/extra_sources/microros_transports/dma_transport.cprint_cflags:echo $(CFLAGS) 11.)Execute the static library generation tool.(执行“静态库产生”工具软件) Compiler flags will retrieved automatically from your Makefile and user will be prompted to check if they are correct. Pull and run the following docker 这个docker就是静态库生产工具软件to generate the micro-ros lib(我现在就卡在这个编译静态micro_lib库的地方我需要知道怎么样编译micro_lib静态库). Make sure you use the right ROS version 注意这个ros的版本不要搞错了makefile里的版本要搞对,下面这个galactic指的是ros2版本我的是humble就应该吧galactic改为humblewhen you pull / run the docker. This should be executed in the root folder of your project. #这里的microros/micro_ros_static_library_builder:humble是服务器上面的镜像名称不是本地存放位置 docker pull microros/micro_ros_static_library_builder:humble #docker pull命令从镜像仓库获取镜像 #后面3行是一个整体,并且其中的project要修改为存放micro_ros_stm32cubemx_utils文件夹的文件夹其中/project必须是绝对文件位置不能是以~开头之类的相对位置 docker run -it --rm -v $(pwd):/project --env MICROROS_LIBRARY_FOLDERmicro_ros_stm32cubemx_utils/microros_static_library microros/micro_ros_static_library_builder:humble 我已经安装了ros2和Ubuntu所以我就不用docker了上边这个很可能就是编译静态库的的过程我替换为以下步骤 #这个地方的网址可能要改一下,另外这条命令中src/micro_ros_setup表示在本地建立2个文件夹一个是src,另外在src内再建立一个micro_ros_setup文件夹最后把远程复制的文件放到这个里面来 git clone -b humble https://github.com/micro-ROS/micro_ros_stm32cubemx_utils.git src/micro_ros_stm32cubemx_utils rosdep update rosdep install --from-paths src --ignore-src -y colcon build #应该就是使用rosdep补全依赖项然后就使用colcon工具编译这个代码库成为静态库上边这个git命令不一定能正确运行所以可以自己使用浏览器从github下载代码库然后把文件放到文件夹内。具体说就是下载后的文件夹整个复制到src文件夹内没有就新建一个src文件夹 后面这个是对git clone remote_address local_address的一个示范。可看出local_address指定的是存放代码库的文件夹 12.) If it asks for the CFLAGS, if you can see some, continue. They might look like this: Found CFLAGS: ------------- -mcpucortex-m4 -mthumb -mfpufpv4-sp-d16 -mfloat-abihard -DUSE_HAL_DRIVER -DSTM32F429xx -ICore/Inc -IDrivers/STM32F4xx_HAL_Driver/Inc -IDrivers/STM32F4xx_HAL_Driver/Inc/Legacy -IMiddlewares/Third_Party/FreeRTOS/Source/include -IMiddlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS -IMiddlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM4F -IDrivers/CMSIS/Device/ST/STM32F4xx/Include -IDrivers/CMSIS/Include -IDrivers/CMSIS/Include -Imicro_ros_stm32cubemx_utils/microros_static_library/libmicroros/microros_include -Og -Wall -fdata-sections -ffunction-sections -g -gdwarf-2 -MMD -MP -MFprint_cflags -------------If instead the CFLAGS are empty there was likely a mistake. If you get an error about a missing separator in the Makefile, check the line in the Makefile. For me there were 2 similar includes. I deleted one of them. 13.) If you get an error like this during building: rcutils exports library dl which couldnt be foundThats ok and can be ignored. 14.) Go into Core/main.cpp and adjust it so that its similar to the sample_main.cpp you can find in the micro_ros_stm32cubemx_utils repository we found earlier. The most interesting parts are the following: #include rcl/rcl.h #include rcl/error_handling.h #include rclc/rclc.h #include rclc/executor.h #include uxr/client/transport.h #include rmw_microxrcedds_c/config.h #include rmw_microros/rmw_microros.h#include std_msgs/msg/int32.h bool cubemx_transport_open(struct uxrCustomTransport * transport); bool cubemx_transport_close(struct uxrCustomTransport * transport); size_t cubemx_transport_write(struct uxrCustomTransport* transport, const uint8_t * buf, size_t len, uint8_t * err); size_t cubemx_transport_read(struct uxrCustomTransport* transport, uint8_t* buf, size_t len, int timeout, uint8_t* err);void * microros_allocate(size_t size, void * state); void microros_deallocate(void * pointer, void * state); void * microros_reallocate(void * pointer, size_t size, void * state); void * microros_zero_allocate(size_t number_of_elements, size_t size_of_element, void * state); void StartDefaultTask(void *argument) {/* USER CODE BEGIN StartDefaultTask *//* Infinite loop */// micro-ROS configurationrmw_uros_set_custom_transport(true,(void *) huart2,cubemx_transport_open,cubemx_transport_close,cubemx_transport_write,cubemx_transport_read);rcl_allocator_t freeRTOS_allocator rcutils_get_zero_initialized_allocator();freeRTOS_allocator.allocate microros_allocate;freeRTOS_allocator.deallocate microros_deallocate;freeRTOS_allocator.reallocate microros_reallocate;freeRTOS_allocator.zero_allocate microros_zero_allocate;if (!rcutils_set_default_allocator(freeRTOS_allocator)) {printf(Error on default allocators (line %d)\n, __LINE__);}// micro-ROS apprcl_publisher_t publisher;std_msgs__msg__Int32 msg;rclc_support_t support;rcl_allocator_t allocator;rcl_node_t node;allocator rcl_get_default_allocator();//create init_optionsrclc_support_init(support, 0, NULL, allocator);// create noderclc_node_init_default(node, cubemx_node, , support);// create publisherrclc_publisher_init_default(publisher,node,ROSIDL_GET_MSG_TYPE_SUPPORT(std_msgs, msg, Int32),cubemx_publisher);msg.data 0;for(;;){rcl_ret_t ret rcl_publish(publisher, msg, NULL);if (ret ! RCL_RET_OK){printf(Error publishing (line %d)\n, __LINE__);}msg.data;osDelay(10);}/* USER CODE END StartDefaultTask */ } 15.) Open the project in your favorite IDE. In general you should now be able to build and debug your program. To built I used the arm-none-eabi-toolchain. To flash and debug I used openocd. If you can not build check step 15.1. 15.1.) It might be that you can not build yet because of missing syscalls. In that case you might get errors like undefined reference to _kill or undefined reference to _getpid. In that case add a syscalls.c file to your project and also add it to the Makefile so that it will be compiled. You can find an example syscalls.c at the end of this page. micro-ROS agent 19.) Now you need a micro-ROS agent. Its responsible to create the communication between your embedded controller and the rest of your ROS 2 software. Create a different folder that will be used as a ROS 2 workspace. 20.) Clone the micro_ros_setup repository and build it by executing the following steps from the root of your workspace folder: source /opt/ros/$ROS_DISTRO/setup.bash git clone -b $ROS_DISTRO https://github.com/micro-ROS/micro_ros_setup.git src/micro_ros_setup rosdep update rosdep install --from-path src --ignore-src -y colcon build source install/local_setup.bash 21.) Build the agent packages ros2 run micro_ros_setup create_agent_ws.sh ros2 run micro_ros_setup build_agent.sh source install/local_setup.sh I got a warning about stderr output when running build_agent.sh (at the end of the build process) but I ignored that. I also had a problem were build_agent.sh complained about being unable to find a package (Package micro_ros_agent specified with --packages-up-to was not found). This was because I didnt follow the steps to build the workspace first correctly (step 20). 22.) Start the micro-ros-agent. For example: ros2 run micro_ros_agent micro_ros_agent serial -b 115200 --dev /dev/ttyACM0 serial: for UART use, other options available -b: baudrate --dev: the device to use To get help with the usage: ros2 run micro_ros_agent micro_ros_agent --help 23.) In the agent you should see something like this: [1641665035.090947] info | TermiosAgentLinux.cpp | init | running... | fd: 3 [1641665035.130109] info | Root.cpp | create_client | create | client_key: 0x041835D4, session_id: 0x81 [1641665035.130212] info | SessionManager.hpp | establish_session | session established | client_key: 0x041835D4, address: 0 [1641665035.156038] info | ProxyClient.cpp | create_participant | participant created | client_key: 0x041835D4, participant_id: 0x000(1) [1641665035.171020] info | ProxyClient.cpp | create_topic | topic created | client_key: 0x041835D4, topic_id: 0x000(2), participant_id: 0x000(1) [1641665035.181034] info | ProxyClient.cpp | create_publisher | publisher created | client_key: 0x041835D4, publisher_id: 0x000(3), participant_id: 0x000(1) [1641665035.191347] info | ProxyClient.cpp | create_datawriter | datawriter created | client_key: 0x041835D4, datawriter_id: 0x000(5), publisher_id: 0x000(3) [1641665052.957930] info | SessionManager.hpp | establish_session | session re-established | client_key: 0x041835D4, address: 0This is some kind of handshake between the agent and the embedded system. You might have to restart your MCU, the agent should be started first it seems. If you see something like this instead: [1641665033.757172] info | TermiosAgentLinux.cpp | init | Serial port not found. | device: /dev/ttyACM0, error 2, waiting for connection... [1641665034.757430] info | TermiosAgentLinux.cpp | init | Serial port not found. | device: /dev/ttyACM0, error 2, waiting for connection...You have likely selected the wrong device or your MCU is not connected. 23.) You should now be able to see the messages published by the MCU on ROS2: ros2 topic echo /cubemx_publisherThe data would look like this: --- data: 2399 --- data: 2400 --- data: 2401 --- data: 2402 --- data: 2403 --- data: 2404 ---Troubleshooting Problem 1 When stepping through the code the programs hangs at rclc_support_init. Solution 1 Be sure that the UART you use when calling rmw_uros_set_custom_transport is the one that you set up for ROS (e.g. with the right DMA settings). Also be aware that the call to this function can take some time (~10 seconds). When running the micro-ROS agent it usually is faster though. Problem 2 The publishing doesnt work. I go into the error case in the infinite loop of the main task: rcl_ret_t ret rcl_publish(publisher, msg, NULL); if (ret ! RCL_RET_OK) {printf(Error publishing (line %d)\n, __LINE__); // -------------------- this is entered }In my case I can see some prints on the UART before entering the while loop. There is a lot of random bytes but sometimes I can see XRCE. Solution 2 You need a running micro-ROS agent. See steps 19.) and following. If you have an agent running but it still doesnt work, look at problem / solution 6. Problem 3 When trying to flash the board, I get an openocd bug saying something with free Solution 3 Unplug MCU and replug it (power). Problem 4 When I run the agent and MCU the agent says fynnsphalerite:~/main/dev/tests/micro-ros/agent_ws$ ros2 run micro_ros_agent micro_ros_agent serial -b 115200 --dev /dev/ttyACM0 [1643036775.906617] info | TermiosAgentLinux.cpp | init | running... | fd: 3 [1643036775.906762] info | Root.cpp | set_verbose_level | logger setup | verbose_level: 4but nothing else happens and I cant receive my data. Solution 4 : Check that your MCU doesnt crash anywhere (e.g. in the syscalls). Problem 5 I get an error saying that _getpid and _kill are not defined. Solution 5 You need to define a syscalls.c file and add these function with their functionality. You can find an example of such a file at the end of this page. Problem 6 When I run the agent and the MCU, the agent says [1641665035.090947] info | TermiosAgentLinux.cpp | init | running... | fd: 3 [1641665035.130109] info | Root.cpp | create_client | create | client_key: 0x041835D4, session_id: 0x81 [1641665035.130212] info | SessionManager.hpp | establish_session | session established | client_key: 0x041835D4, address: 0but its not creating a participant or topic. I cant receive my data. Solution 6 Check that you dont have another serial program (putty, hterm, gtkterm, ...) connected to your device (at least not to that same UART). Also be sure that your hardware setup is correct, e.g. that you have GND connected between the two nodes when using a UART connection. Problem 7 If youre using Eclipse: When compiling Eclipse says Error: Program not found in PATH Solution 7 Right click your project - Properties - C/C Build - Uncheck Use default build command and exchange ${cross_make} with a simple make Problem 8 If youre using Eclipse: I get an error that the program can not be executed Solution 8 Right click your project - Properties - C/C Build: Untick Use default build command. Define Build command as: make Problem 10 If youre using Eclipse and it says that it cant find the arm-none-eabi-gcc Solution 10 You need to download and extract the toolchain. You can find it here: Downloads | GNU Arm Embedded Toolchain Downloads – Arm Developer Then set up your Eclipse to know where it is: Right click your project - Properties - MCU - Arm Toolchains Paths: Toolchain name: xPack GNU Arm Embedded GCC Toolchain folder: path/to/your/arm-none-eabi-toolchain/bin In the bin folder should be arm-none-eabi-gcc among others. If it still doesnt work, try just opening the following menu: Right click your project - Properties - C/C Build - Settings Example syscalls.c /** ***************************************************************************** ** ** File : syscalls.c ** ** Author : Auto-generated by System workbench for STM32 ** ** Abstract : System Workbench Minimal System calls file ** ** For more information about which c-functions ** need which of these lowlevel functions ** please consult the Newlib libc-manual ** ** Target : STMicroelectronics STM32 ** ** Distribution: The file is distributed “as is,” without any warranty ** of any kind. ** ***************************************************************************** ** attention ** ** h2centercopy; COPYRIGHT(c) 2019 STMicroelectronics/center/h2 ** ** Redistribution and use in source and binary forms, with or without modification, ** are permitted provided that the following conditions are met: ** 1. Redistributions of source code must retain the above copyright notice, ** this list of conditions and the following disclaimer. ** 2. Redistributions in binary form must reproduce the above copyright notice, ** this list of conditions and the following disclaimer in the documentation ** and/or other materials provided with the distribution. ** 3. Neither the name of STMicroelectronics nor the names of its contributors ** may be used to endorse or promote products derived from this software ** without specific prior written permission. ** ** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS ** AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE ** IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE ** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE ** FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL ** DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR ** SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER ** CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, ** OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE ** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ** ***************************************************************************** */// the code was modified by Fynn Boyer/* Includes */ #include sys/stat.h #include stdlib.h #include errno.h #include stdio.h #include signal.h #include time.h #include sys/time.h #include sys/times.h/* Variables */ //#undef errno extern int errno; extern int __io_putchar(int ch) __attribute__((weak)); extern int __io_getchar(void) __attribute__((weak));register char * stack_ptr asm(sp);char *__env[1] { 0 }; char **environ __env;extern char _estack; // see ld file extern char _Min_Stack_Size; // see ld file/* Functions */ void initialise_monitor_handles() { }int _getpid(void) {return 1; }int _kill(int pid, int sig) {errno EINVAL;return -1; }void _exit (int status) {_kill(status, -1);while (1) {} /* Make sure we hang here */ }__attribute__((weak)) int _read(int file, char *ptr, int len) {int DataIdx;for (DataIdx 0; DataIdx len; DataIdx){*ptr __io_getchar();}return len; }__attribute__((weak)) int _write(int file, char *ptr, int len) {int DataIdx;for (DataIdx 0; DataIdx len; DataIdx){__io_putchar(*ptr);}return len; }caddr_t _sbrk(int incr) {extern char __heap_start__ asm(end); // Defined by the linker.static char *heap_end;char *prev_heap_end;if (heap_end NULL) heap_end __heap_start__;prev_heap_end heap_end;if (heap_end incr _estack - _Min_Stack_Size) {__asm(BKPT #0\n);errno ENOMEM;return (caddr_t)-1;}heap_end incr;return (caddr_t)prev_heap_end;}int _close(int file) {return -1; }int _fstat(int file, struct stat *st) {st-st_mode S_IFCHR;return 0; }int _isatty(int file) {return 1; }int _lseek(int file, int ptr, int dir) {return 0; }int _open(char *path, int flags, ...) {/* Pretend like we always fail */return -1; }int _wait(int *status) {errno ECHILD;return -1; }int _unlink(char *name) {errno ENOENT;return -1; }int _times(struct tms *buf) {return -1; }int _stat(char *file, struct stat *st) {st-st_mode S_IFCHR;return 0; }int _link(char *old, char *new) {errno EMLINK;return -1; }int _fork(void) {errno EAGAIN;return -1; }int _execve(char *name, char **argv, char **env) {errno ENOMEM;return -1; }
http://www.yayakq.cn/news/1241/

相关文章:

  • 济南微信网站WordPress页码总数
  • 佛山网站制作网址网站建设管理视频
  • 深圳 建网站网站用图片做背景图片
  • 温州营销网站公司哪家好苏州老字号企业官方的网站策划书
  • 江苏国龙翔建设有限公司网站备案信息查询
  • 用asp.net做网站的书苏州手机app开发公司
  • 做网站是什么意思网站建设费计入无形资产
  • 网站如何做等级保护工厂弄个网站做外贸如何
  • wordpress给公司建站百度怎么发布广告
  • 建设网站的源代码自适应主题 wordpress
  • 微网站建设图片学院网站建设情况总结
  • 开源网站有哪些网站套站
  • 深圳做网站公司哪家比较好潍坊建设网站
  • 做网站首页文字排版技巧百度seo优化包含哪几项
  • 受欢迎的集团网站建设网站页脚信息
  • 上海网站设计哪家好发稿媒体平台
  • 关于网站可信备案五金配件店 东莞网站建设
  • 二级网站有什么好处wordpress 分页按钮
  • html5网站提示wordpress图文发布
  • 做塑料的外贸网站有哪些华为 wordpress
  • 番禺网站制作价格线上运营怎么做
  • google网站排名查询电子网站建设的实践目的
  • 北京网站开发周期建站公司兴田德润在哪里
  • 网站优化北京联系电话?如何知道别人的网站流量来自于哪里
  • 织梦搭建商城网站贸易公司网站源码
  • 济南做网站建网站公司裕华区建设局网站
  • 免费视频网站推广软件浙江昆仑建设集团网站
  • 网站打不开 别人能打开短视频营销推广方式
  • 网上做结婚照的网站眉山网站建设兼职
  • 晋城网站建设价格网站建设做一个要多久