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

深圳制作网站建设推广深圳市网站建设科技

深圳制作网站建设推广,深圳市网站建设科技,杭州seo关键词优化哪家好,网站建设的常见技术有哪些方面1 XR806简介 板子来源于极术社区的试用#xff0c;XR806的在线网址 其主要参数#xff1a; 主控XR806AF2LDDRSIP 288KB SRAM存储SIP 160KB Code ROM. SIP 16Mbit Flash.天线板载WiFi/BT双天线#xff0c;可共存按键reboot按键 1#xff0c;功能按键 1灯红色电源指示灯 1…1 XR806简介 板子来源于极术社区的试用XR806的在线网址 其主要参数 主控XR806AF2LDDRSIP 288KB SRAM存储SIP 160KB Code ROM. SIP 16Mbit Flash.天线板载WiFi/BT双天线可共存按键reboot按键 1功能按键 1灯红色电源指示灯 1蓝色可调节LED 1供电Type-C 5V引脚插针引脚 *9调试方式Type-C已板载串口转USB芯片晶振外接40MHz晶振 2 rosserial简介 官网 rosserial是用于非ROS设备与ROS设备进行通信的一种协议。它为非ROS设备的应用程序提供了ROS节点和服务的发布/订阅功能使在非ROS环境中运行的应用能够通过串口或网络能够轻松地与ROS应用进行数据交互。 rosserial分为客户端和服务器两部分。rosserial客户端运行在运行在没有安装ROS的环境的应用中通过串口或网络与运行在ROS环境中的rosserial服务器连接并通过服务器节点在ROS中发布/订阅话题。 3 移植目标 通过rosserial使XR806能通过串口和TCP两种方式和ROS进行通信。 4 移植前准备 4.1 源码获取 [官方源码]( https://github.com/ros-drivers/rosserial.git 该仓库中的代码需要编译才能获取源码为了直接获取源码使用以下仓库的源码做为基础。 使用源码 该代码时属于RT-thread软件包有较高的可信度。 clone下来的代码放在/ohosdemo/rosserial中文件结构 tree -L 1 tree -L 1. ├── BUILD.gn ├── inc ├── port └── src BUILD.gn 配置文件inc rosserial源文件port移植文件为了和XR806适配的代码放在该文件下 4.2 XR806 C支持 rosserial为C代码需要XR806支持C编译。 修改/device/xradio/xr806/liteos_m/config.gni文件添加以下内容 board_cxx_flags []board_cxx_flags SDK_cflags board_cxx_flags [-includelog/log.h,-DVIRTUAL_HCI,-DCONFIG_ARM,#-DNULL((void*)0),#-stdc17,-lstdc,-fno-rtti,-fno-exceptions]大部分和board_cflags的配置一样添加的编译项 -lstdc,-fno-rtti,-fno-exception是为了解决以下错误 undefined reference to vtable for __cxxabiv1::__si_class_type_info该错误的原因是C在链接时会有相关库链接不上 2. 在/ohosdemo/rosserial/BUILD.gn中添加以下代码 cflags_cc board_cxx_flags表示支持c编译 5 ROSserial移植核心 根据官网的移植介绍只需要填写完以下模板即可 class Hardware {Hardware();// any initialization code necessary to use the serial portvoid init(); // read a byte from the serial port. -1 failureint read()// write data to the connection to ROSvoid write(uint8_t* data, int length);// returns milliseconds since start of programunsigned long time();};init()提供初始化函数初始化串口或者TCP网络read():读取一个字节write(uint8_t* data, int length):写字符time()提供时间基准 6 串口通信 和串口相关的代码放在rosserial/port/UartHaedware.h 关键代码 6.1 串口初始化init()函数 void init(){// HAL_Status status HAL_ERROR;UART_InitParam param;param.baudRate this-baudRate;param.dataBits UART_DATA_BITS_8;param.stopBits UART_STOP_BITS_1;param.parity UART_PARITY_NONE;param.isAutoHwFlowCtrl 0;HAL_UART_Init(UARTID, param);}6.2 串口读取一个字节read()函数 int read(){uint8_t rx_data;int32_t len0;len HAL_UART_Receive_IT(UARTID,rx_data,1,1000);if(len0){return rx_data;}else return -1;} 6.3 串口写字节write(uint8_t* data, int length) // write data to the connection to ROSvoid write(uint8_t* data, int length){HAL_UART_Transmit_IT(UARTID, data, length);}6.4 时间基准time()函数 // returns milliseconds since start of programunsigned long time(){unsigned long temp (unsigned long)OS_GetTime() * 1000;return temp;}6.5 代码风格统一 为了保持ROS代码的编写风格一致添加rosserial/port/ros.h 关键代码 #define ROS_USE_TCP 0 #define ROS_USE_UART 1namespace ros {#if ROS_USE_TCP 1typedef NodeHandle_TCPHardware NodeHandle;#endif#if ROS_USE_UART 1typedef NodeHandle_Hardware NodeHandle;#endif } #endif可以通过宏定义选择使用串口还是TCP 7 TCP通信 7.1 wifi连接 wifi连接使用官方在ohosdemo/wlan_demo中的代码。具体使用void wifi_device_event_test()函数和wifi连接成功后的回调函数:void Connected_deal(int state, WifiLinkedInfo *info)。 大致思路是在wifi连接线程中增加一个信号量初始化信号量为0rosserial线程会一直等待信号量有效后才会触发rosserial的相关函数利用信号量作为两个线程间的同步保证wifi顺利连接成功后才会进行rosserial的TCP通信。另外每次wifi重新连接后都会保证XR806会自动连接ROS。 信号量的三个关键函数 OS_Status OS_SemaphoreCreate(OS_Semaphore_t *sem, uint32_t initCount, uint32_t maxCount)初始化信号量定义计数的初始值和最大值 OS_Status OS_SemaphoreWait(OS_Semaphore_t *sem, OS_Time_t waitMS) 等待信号量有效及信号量的计数不为0等待时间可以使无限长该参数为OS_WAIT_FOREVER OS_Status OS_SemaphoreRelease(OS_Semaphore_t *sem)释放信号量信号量计数加1 主要代码 #define WIFI_DEVICE_CONNECT_AP_SSID myyy #define WIFI_DEVICE_CONNECT_AP_PSK 123456789WifiEvent sta_event;void Connected_deal(int state, WifiLinkedInfo *info) {if (state WIFI_STATE_AVALIABLE) {//释放信号量计数加1OS_SemaphoreRelease(ros_sem);// OS_Sleep(5);printf(\r\n Callback: connected\r\n);} else if (state WIFI_STATE_NOT_AVALIABLE) {printf( Callback: disconnected\n);} }void wifi_device_event_test() {const char ssid_want_connect[] WIFI_DEVICE_CONNECT_AP_SSID;const char psk[] WIFI_DEVICE_CONNECT_AP_PSK;//创建信号量初始值为0最大值为2if(OS_SemaphoreCreate(ros_sem, 0, 2) ! OS_OK){printf(\r\n sem creat fail!\r\n);return ;}sta_event.OnWifiConnectionChanged Connected_deal;if (WIFI_SUCCESS ! RegisterWifiEvent(sta_event)) {printf(Error: RegisterWifiEvent fail\n);return;}printf(\n Connect Test Start \n);if (WIFI_SUCCESS ! EnableWifi()) {printf(Error: EnableWifi fail.\n);return;}printf(EnableWifi Success.\n);if (WIFI_STA_ACTIVE IsWifiActive())printf(Wifi is active.\n);OS_Sleep(1);/*.........................................................省略的代码 参见官方demo*/if (WIFI_SUCCESS ! GetDeviceMacAddress(get_mac_res)) {printf(Error: GetDeviceMacAddress Fail\n);return;}printf(GetDeviceMacAddress Success.\n);for (int j 0; j WIFI_MAC_LEN - 1; j) {printf(%02X:, get_mac_res[j]);}printf(%02X\n, get_mac_res[WIFI_MAC_LEN - 1]);}7.2 TCP客户端初始化 为了不和串口的Hardware类重名类名为TCPHardware void init(){sock_fd socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);// address info!struct sockaddr_in server_addr;memset(server_addr, 0, sizeof(server_addr));server_addr.sin_family AF_INET;server_addr.sin_port htons(serverPort_);inet_pton(AF_INET, server_, server_addr.sin_addr);// connect!if (connect(sock_fd, (sockaddr *)server_addr, sizeof(server_addr)) 0){printf(connect tcp_server failed! \r\n);return;}printf(connect tcp_server successfuly! \r\n);}7.3 TCP读取字节 int read(){char ch[2];int bytes_received recv(sock_fd, ch, 1, 0);if (bytes_received 0){return ch[0];}else{return -1;}} 7.4 TCP写字节 void write(const uint8_t *data, int length){send(sock_fd, data, length, 0);}时间基准和6.4一样 8 测试 8.1 XR806 端 文件目录 . ├── BUILD.gn ├── led_demo │ ├── BUILD.gn │ └── src ├── rosserial │ ├── BUILD.gn │ ├── inc │ ├── port │ └── src └── wlan_demo├── BUILD.gn├── main.c├── test_case.c└── test_case.h 其中 led_demo:led灯指示作用rosserial:rosserialb包wlan_demo:负载wifi连接 8.1.1 配置文件BUILD.gn # 必须config中定义了头文件路径和关键宏定义 import(//device/xradio/xr806/liteos_m/config.gni)# 必须所有应用工程必须是app_打头 static_library(app_rosserial) {configs []sources [src/ros_helloworld.cpp,inc/duration.cpp,inc/time.cpp,]#必须board_cflags是在config.gni中定义的关键宏定义cflags board_cflags# ccflags_cc board_cxx_flags#必须board_include_dirs是在config.gni中定义的文件路径include_dirs board_include_dirs# 根据实际情况添加头文件路径include_dirs [//kernel/liteos_m/kernel/arch/include,./../wlan_demo/,inc,port ,//base/iot_hardware/peripheral/interfaces/kits,//foundation/communication/wifi_lite/interfaces/wifiservice,] }8.1.2 测试程序 编写一个发布话题XR806_to_ROS 发布的内容为“hello world!”时间间隔为1s 编写一个接收话题ROS_to_XR860 接收的内容通过串口显示出来 #include ros.h #include std_msgs/String.h#include stdio.h #include ohos_init.h #include stdlib.h//信号量的声明 extern OS_Semaphore_t ros_sem;static OS_Thread_t g_main_thread;static ros::NodeHandle nh; static std_msgs::String str_msg; static ros::Publisher chatter(XR806_to_ROS, str_msg); static char hello_msg[25] hello world!;// 回调函数 static void message_callback(const std_msgs::String msgs) {printf(\r\nresive:%s\r\n, msgs.data);}static ros::Subscriberstd_msgs::String sub(ROS_to_XR860, message_callback);static void ROSThread(void *arg) { //等待信号量有效if (OS_SemaphoreWait(ros_sem, OS_WAIT_FOREVER) OS_OK){printf(\r\n--------- star ROS----------------\r\n);nh.initNode();nh.advertise(chatter);nh.subscribe(sub);while (1){if (nh.connected()){str_msg.data hello_msg;chatter.publish(str_msg); }nh.spinOnce();OS_MSleep(1000);} } } void ROSMain(void) {printf(\r\nROSserial Start\r\n);if (OS_ThreadCreate(g_main_thread, ROSThread, ROSThread, NULL,OS_THREAD_PRIO_APP, 4 * 1024) ! OS_OK) {printf([ERR] Create MainThread Failed\n);} }SYS_RUN(ROSMain);8.1.3 编译程序 hb build -f可能会遇到下面问题 这个flash分配的分配有问题 cd 到 device/xradio/xr806/xr_skylark/project/demo/audio_demo/image/xr806 用文件image_auto_cal.cfg中的内容覆盖image_wlan_ble.cfg中的内容。 8.2 PC ROS端 Ubuntu版本20版18版也可以使用 8.2.1 创建ros空间 mkdir -p rosworkspace/src cd rosworkspace catkin_make8.2.2 编写发布节点 import rospy from std_msgs.msg import Stringif __name__ __main__:#2.初始化 ROS 节点:命名(唯一)rospy.init_node(talker_p)#3.实例化 发布者 对象pub rospy.Publisher(ROS_to_XR860,String,queue_size10)#4.组织被发布的数据并编写逻辑发布数据msg String() #创建 msg 对象msg_front hello XR806 count 0 #计数器 # 设置循环频率rate rospy.Rate(1)while not rospy.is_shutdown():#拼接字符串msg.data msg_front str(count)pub.publish(msg)rate.sleep()#rospy.loginfo(写出的数据:%s,msg.data)count 1修改CMakeLists.txt catkin_install_python(PROGRAMSscripts/test_pub.pyDESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION} )8.2.3 启动节点 启动主节点 roscore起动test_pub节点 source ./devel/setup.bashrosrun ros_test test_pub.py 启用serial_node节点 串口 rosrun rosserial_python serial_node.py _port:/dev/ttyUSB0 _baud:115200如果串口连接成功终端显示 INFO] [1640087588.757505]: ROS Serial Python Node [INFO] [1640087588.762633]: Connecting to /dev/ttyUSB0 at 115200 baud [INFO] [1640087591.079099]: Requesting topics... [INFO] [1640087591.131236]: Note: publish buffer size is 512 bytes [INFO] [1640087591.134777]: Setup publisher on XR806_to_ROS [std_msgs/String] [INFO] [1640087591.142147]: Note: subscribe buffer size is 512 bytes [INFO] [1640087591.144610]: Setup subscriber on ROS_to_XR860 [std_msgs/String] 注意查看串口的权限如果权限不足先开启权限 # 查看权限 ll /dev/ttyUSB* #开启权限 sudo chmod 777 /dev/ttyUSB*TCP 默认节点11411 rosrun rosserial_python serial_node.py tcp如果TCP连接成功终端显示 [INFO] [1640232707.758952]: ROS Serial Python Node [INFO] [1640232707.763597]: Fork_server is: False [INFO] [1640232707.764688]: Waiting for socket connections on port 11411 [INFO] [1640232707.765650]: Waiting for socket connection [INFO] [1640232724.857086]: Established a socket connection from 192.168.43.49 on port 60872 [INFO] [1640232724.859268]: calling startSerialClient [INFO] [1640232726.966374]: Requesting topics... [INFO] [1640232727.289246]: Note: publish buffer size is 512 bytes [INFO] [1640232727.290573]: Setup publisher on XR806_to_ROS [std_msgs/String] [INFO] [1640232727.295084]: Note: subscribe buffer size is 512 bytes [INFO] [1640232727.296294]: Setup subscriber on ROS_to_XR860 [std_msgs/String]8.3 结果查询 ROS上查看话题 rostopic list /ROS_to_XR860 /XR806_to_ROS /diagnostics /rosout /rosout_agg可见 /ROS_to_XR860和/XR806_to_ROS两个话题 查看/XR806_to_ROS rostopic echo /ROS_to_XR860data: hello world! --- data: hello world! --- data: hello world! --- data: hello world! --- data: hello world! ---查看XR806接收的 /ROS_to_XR860话题消息 串口连接 -------- star ROS---------------- resive:hello XR806 1 resive:hello XR806 2 resive:hello XR806 3 resive:hello XR806 4 resive:hello XR806 5 resive:hello XR806 6 resive:hello XR806 7 resive:hello XR806 8 resive:hello XR806 9 resive:hello XR806 10 resive:hello XR806 11 resive:hello XR806 12TCP连接 --------- star ROS---------------- connect tcp_server successfuly! resive:hello XR806 1 resive:hello XR806 2 resive:hello XR806 3 resive:hello XR806 4 resive:hello XR806 5 resive:hello XR806 6 resive:hello XR806 7 resive:hello XR806 8
http://www.w-s-a.com/news/271724/

相关文章:

  • 即墨网站建设地址怎么在文档中做网站一点就开
  • 做网站联系方式互联网行业分析
  • 杭州网站建设索q479185700高淳网站建设
  • 有什么做任务拿钱的网站精准的搜索引擎优化
  • 洛阳有建社网站的吗电力建设工程质量监督总网站
  • 网站404报错热水器网站建设 中企动力
  • 网站降权恢复淘宝 网站建设
  • 安州区建设局网站台州优秀关键词优化
  • 网站假设教程湖南微信管理系统
  • 网站备案属于公司哪一块哪个网站是专门做封面素材
  • 广州个人做网站内江建设局网站
  • 网站开发 360百科大连哪里有手机自适应网站建设维护
  • 如何查网站pv网站功防教程
  • 建设银行网站信息补充营销推广的作用
  • 网站见建设seo外链自动群发工具
  • 在境外做网站网站团购网站seo
  • 进网站后台加什么360推广 网站建设
  • 网站备案号码专做网站漏扫的工具
  • 罗店网站建设wordpress响应式
  • 网站怎么制作小程序wordpress实时获取qq资料
  • 网站的流量怎么赚钱经销做网站都有什么好处
  • 如何做好网站首页企术建站
  • 杭州网站建设咨询蓝韵网络聊城有制作网站的吗
  • 网站开发注意的事项深圳企业网站
  • 哈尔滨网站制作哪里专业网站建设维护有哪些内容
  • 花的网站建设规划书网络营销培训
  • 又拍云wordpress全站cdn无锡做网站品牌公司
  • 计算机网络工程网站建设黄石建设信息网站
  • 旅游网站开发毕业设计开题报告青岛网站建设服务公司
  • 人员调动在网站上怎么做网站开发课程意见和建议