ROS基础知识复习

【置顶】感谢参考:https://zhuanlan.zhihu.com/p/662074088

0.背景

工作一年多没有做 ROS 相关的开发了,最近找工作想做回这一块来,根据参考内容,抽时间给这边的基础知识敲一遍复习一下

1.环境检查

打开了之前的笔记本,Ubuntu 系统及 ros 环境都还在,这边就不做环境配置了
运行一下小乌龟检查一下环境:

  • 启动 roscore
roscore
... logging to /home/livvedia/.ros/log/a62ba306-8050-11ee-98d2-d07e354f2c70/roslaunch-livvedia-7447-4219.log
Checking log directory for disk usage. This may take a while.
Press Ctrl-C to interrupt
Done checking log file disk usage. Usage is <1GB.started roslaunch server http://livvedia-7447:35877/
ros_comm version 1.14.11SUMMARY
========PARAMETERS* /rosdistro: melodic* /rosversion: 1.14.11NODESauto-starting new master
process[master]: started with pid [4229]
ROS_MASTER_URI=http://livvedia-7447:11311/setting /run_id to a62ba306-8050-11ee-98d2-d07e354f2c70
process[rosout-1]: started with pid [4242]
started core service [/rosout]
  • 另一个窗口启动小乌龟图像界面节点
rosrun turtlesim turtlesim_node
[ INFO] [1699679624.841384968]: Starting turtlesim with node name /turtlesim
[ INFO] [1699679624.854296725]: Spawning turtle [turtle1] at x=[5.544445], y=[5.544445], theta=[0.000000]
  • 再一个窗口启动小乌龟运动控制节点
rosrun turtlesim turtle_teleop_key
Reading from keyboard
---------------------------
Use arrow keys to move the turtle. 'q' to quit.

使用方向键进行控制,上下键用于前进后退,左右键用于转向。
检查环境

1.常用命令

1.1 rqt_graph 查看节点之间的联系

在这里插入图片描述
节点 teleop_turtle 发布话题 turtle1/cmd_vel
节点 turtlesim 订阅话题 turtle1/cmd_vel

1.2 rqt_plot 图形化显示话题传输的数据

在这里插入图片描述
话题 turtle1/pose 下传输的数据有:
turtle1/pose/x 小乌龟在画面中x坐标
turtle1/pose/y 小乌龟在画面中y坐标
turtle1/pose/theta 小乌龟朝向角
turtle1/pose/linear_velocity 线速度
turtle1/pose/angular_velocity 角速度

1.3 rosnode

  • rosnode list 显示当前运行的所有节点信息
rosnode list
/rosout
/teleop_turtle
/turtlesim
  • rosnode info /turtlesim 输出turtlesim节点的信息。
rosnode info /turtlesim 
--------------------------------------------------------------------------------
Node [/turtlesim]
Publications: * /rosout [rosgraph_msgs/Log]* /turtle1/color_sensor [turtlesim/Color]* /turtle1/pose [turtlesim/Pose]Subscriptions: * /turtle1/cmd_vel [geometry_msgs/Twist]Services: * /clear* /kill* /reset* /spawn* /turtle1/set_pen* /turtle1/teleport_absolute* /turtle1/teleport_relative* /turtlesim/get_loggers* /turtlesim/set_logger_levelcontacting node http://livvedia-7447:37143/ ...
Pid: 4691
Connections:* topic: /rosout* to: /rosout* direction: outbound (44969 - 127.0.0.1:43780) [26]* transport: TCPROS* topic: /turtle1/cmd_vel* to: /teleop_turtle (http://livvedia-7447:45971/)* direction: inbound (41294 - livvedia-7447:55953) [28]* transport: TCPROS

列出来这个节点发布了哪些话题,订阅了哪些话题,提供了哪些服务,还有当前的一些连接状态等信息

  • rosnode ping /turtlesim 测试节点连接 状态
rosnode ping /turtlesim
rosnode: node is [/turtlesim]
pinging /turtlesim with a timeout of 3.0s
xmlrpc reply from http://livvedia-7447:37143/	time=0.617981ms
xmlrpc reply from http://livvedia-7447:37143/	time=0.539064ms
xmlrpc reply from http://livvedia-7447:37143/	time=0.504971ms
xmlrpc reply from http://livvedia-7447:37143/	time=0.994921ms
xmlrpc reply from http://livvedia-7447:37143/	time=0.548124ms
xmlrpc reply from http://livvedia-7447:37143/	time=0.585079ms
xmlrpc reply from http://livvedia-7447:37143/	time=0.546932ms
xmlrpc reply from http://livvedia-7447:37143/	time=0.474930ms
  • rosnode machine 列出所有 ros 设备,主从式分布的时候会显示多个设备
 rosnode machine 
livvedia-7447

当前只有一台设备,设备名为 livvedia-7447 (哈哈哈,我8年前的笔记本)

  • rosnode machine 设备名 查看指定设备上的运行节点
rosnode machine livvedia-7447
/rosout
/teleop_turtle
/turtlesim
  • rosnode kill /turtlesim 杀死节点 turtlesim
  • rosnode cleanup /turtlesim 清空节点 turtlesim

1.4 rostopic

  • rostopic list 列出所有在使用的话题
rostopic list 
/rosout
/rosout_agg
/turtle1/cmd_vel
/turtle1/color_sensor
/turtle1/pose
  • rostopic info /turtle1/cmd_vel 查看话题信息
rostopic info /turtle1/cmd_vel
Type: geometry_msgs/TwistPublishers: * /teleop_turtle (http://livvedia-7447:45971/)Subscribers: * /turtlesim (http://livvedia-7447:37143/)
  • rostopic echo /turtle1/cmd_vel 查看话题具体内容
rostopic echo /turtle1/cmd_vel
linear: x: 2.0y: 0.0z: 0.0
angular: x: 0.0y: 0.0z: 0.0
---
linear: x: 0.0y: 0.0z: 0.0
angular: x: 0.0y: 0.0z: -2.0
---
  • rostopic pub 话题名 消息类型 消息值 手动发布一个话题消息
rostopic pub /turtle1/cmd_vel geometry_msgs/Twist "linear:x: 1.0y: 1.0z: 0.0
angular:x: 0.0y: 0.0z: 1.0
"
publishing and latching message. Press ctrl-C to terminate

可以添加参数 -r 来控制发布的频率,如 -r 1 表示 1 s 发送一次

rostopic pub /turtle1/cmd_vel geometry_msgs/Twist  -r 1 "linear:x: 1.0y: 1.0z: 0.0
angular:x: 0.0y: 0.0z: 1.0
"

执行上述发布命令后,小乌龟会自动画圆
在这里插入图片描述

1.5 rosservice

  • rosservice list 列出所有服务
 rosservice list 
/clear
/kill
/reset
/rosout/get_loggers
/rosout/set_logger_level
/spawn
/teleop_turtle/get_loggers
/teleop_turtle/set_logger_level
/turtle1/set_pen
/turtle1/teleport_absolute
/turtle1/teleport_relative
/turtlesim/get_loggers
/turtlesim/set_logger_level
  • rosservice info /spawn 查看服务 spawn 详细信息
rosservice info /spawn 
Node: /turtlesim
URI: rosrpc://livvedia-7447:42833
Type: turtlesim/Spawn
Args: x y theta name
  • rosservice call /spawn Args… 手动调用服务 spawn (生成小乌龟)
rosservice call /spawn "x: 10.0
y: 10.0
theta: 0.0
name: "turtle2"
"

在这里插入图片描述
右上角生成了个新乌龟 turtle2
注意:输入命令时,要在如x:后加空格,否则会报错。上面的name可以用单引号,也可以用双引号。

1.6 rosmsg

  • rosmsg show geometry_msgs/Twist 查看消息 geometry_msgs/Twist 具体定义
rosmsg show geometry_msgs/Twist
geometry_msgs/Vector3 linearfloat64 xfloat64 yfloat64 z
geometry_msgs/Vector3 angularfloat64 xfloat64 yfloat64 z
  • rosmsg packages 列出包含消息的所有包
rosmsg packages
actionlib
actionlib_msgs
actionlib_tutorials
base_local_planner
bond
cartographer_ros_msgs
control_msgs
controller_manager_msgs
costmap_2d
diagnostic_msgs
dynamic_reconfigure
farryn_controller
gazebo_msgs
gazebo_video_monitor_msgs

1.7 rosparam

  • rosparam list 列出所有参数
rosparam list 
/rosdistro
/roslaunch/uris/host_livvedia_7447__35877
/rosversion
/run_id
/turtlesim/background_b
/turtlesim/background_g
/turtlesim/background_r
  • rosparam get /turtlesim/background_r 获取参数 /turtlesim/background_r 的值
  • rosparam set /turtlesim/background_r 100 将参数 /turtlesim/background_r 设置为 255,重新启动 turtlesim 节点就好发现背景颜色发生了改变

2.话题通信实现(topic)

  • 工作空间准备
mkdir -r ros_review/src/communication
cd ros_review/src
catkin_init_workspace
Creating symlink "/home/livvedia/ros_review/src/CMakeLists.txt" pointing to "/opt/ros/melodic/share/catkin/cmake/toplevel.cmake"~/ros_review$ tree
.
└── src├── CMakeLists.txt -> /opt/ros/melodic/share/catkin/cmake/toplevel.cmake└── communication

自动生成了个 CMakeLists.txt 文件,软链接到 ros 安装目录下的一个 cmake 文件

  • 编译工作空间
catkin_make
Base path: /home/livvedia/ros_review
Source space: /home/livvedia/ros_review/src
Build space: /home/livvedia/ros_review/build
Devel space: /home/livvedia/ros_review/devel
Install space: /home/livvedia/ros_review/install
####
#### Running command: "cmake /home/livvedia/ros_review/src -DCATKIN_DEVEL_PREFIX=/home/livvedia/ros_review/devel -DCMAKE_INSTALL_PREFIX=/home/livvedia/ros_review/install -G Unix Makefiles" in "/home/livvedia/ros_review/build"
####
-- The C compiler identification is GNU 7.5.0
-- The CXX compiler identification is GNU 7.5.0
-- Check for working C compiler: /usr/bin/cc
-- Check for working C compiler: /usr/bin/cc -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Detecting C compile features
-- Detecting C compile features - done
-- Check for working CXX compiler: /usr/bin/c++
-- Check for working CXX compiler: /usr/bin/c++ -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Using CATKIN_DEVEL_PREFIX: /home/livvedia/ros_review/devel
-- Using CMAKE_PREFIX_PATH: /home/livvedia/car_arm_ws/devel;/home/livvedia/ARM/devel;/home/livvedia/wpr1/devel;/opt/ros/melodic
-- This workspace overlays: /home/livvedia/car_arm_ws/devel;/home/livvedia/ARM/devel;/home/livvedia/wpr1/devel;/opt/ros/melodic
-- Found PythonInterp: /usr/bin/python2 (found suitable version "2.7.17", minimum required is "2") 
-- Using PYTHON_EXECUTABLE: /usr/bin/python2
-- Using Debian Python package layout
-- Using empy: /usr/bin/empy
-- Using CATKIN_ENABLE_TESTING: ON
-- Call enable_testing()
-- Using CATKIN_TEST_RESULTS_DIR: /home/livvedia/ros_review/build/test_results
-- Found gtest sources under '/usr/src/googletest': gtests will be built
-- Found gmock sources under '/usr/src/googletest': gmock will be built
-- Found PythonInterp: /usr/bin/python2 (found version "2.7.17") 
-- Looking for pthread.h
-- Looking for pthread.h - found
-- Looking for pthread_create
-- Looking for pthread_create - not found
-- Looking for pthread_create in pthreads
-- Looking for pthread_create in pthreads - not found
-- Looking for pthread_create in pthread
-- Looking for pthread_create in pthread - found
-- Found Threads: TRUE  
-- Using Python nosetests: /usr/bin/nosetests-2.7
-- catkin 0.7.29
-- BUILD_SHARED_LIBS is on
-- BUILD_SHARED_LIBS is on
-- Configuring done
-- Generating done
-- Build files have been written to: /home/livvedia/ros_review/build
####
#### Running command: "make -j4 -l4" in "/home/livvedia/ros_review/build"
####

检查编译后的文件目录

tree
.
├── build
│   ├── atomic_configure
│   │   ├── env.sh
│   │   ├── local_setup.bash
│   │   ├── local_setup.sh
│   │   ├── local_setup.zsh
│   │   ├── setup.bash
│   │   ├── setup.sh
│   │   ├── _setup_util.py
│   │   └── setup.zsh
│   ├── catkin
│   │   └── catkin_generated
│   │       └── version
│   │           └── package.cmake
│   ├── catkin_generated
│   │   ├── env_cached.sh
│   │   ├── generate_cached_setup.py
│   │   ├── installspace
│   │   │   ├── env.sh
│   │   │   ├── local_setup.bash
│   │   │   ├── local_setup.sh
│   │   │   ├── local_setup.zsh
│   │   │   ├── setup.bash
│   │   │   ├── setup.sh
│   │   │   ├── _setup_util.py
│   │   │   └── setup.zsh
│   │   ├── order_packages.cmake
│   │   ├── order_packages.py
│   │   ├── setup_cached.sh
│   │   └── stamps
│   │       └── Project
│   │           ├── interrogate_setup_dot_py.py.stamp
│   │           ├── order_packages.cmake.em.stamp
│   │           ├── package.xml.stamp
│   │           └── _setup_util.py.stamp
│   ├── CATKIN_IGNORE
│   ├── catkin_make.cache
│   ├── CMakeCache.txt
│   ├── CMakeFiles
│   │   ├── 3.10.2
│   │   │   ├── CMakeCCompiler.cmake
│   │   │   ├── CMakeCXXCompiler.cmake
│   │   │   ├── CMakeDetermineCompilerABI_C.bin
│   │   │   ├── CMakeDetermineCompilerABI_CXX.bin
│   │   │   ├── CMakeSystem.cmake
│   │   │   ├── CompilerIdC
│   │   │   │   ├── a.out
│   │   │   │   ├── CMakeCCompilerId.c
│   │   │   │   └── tmp
│   │   │   └── CompilerIdCXX
│   │   │       ├── a.out
│   │   │       ├── CMakeCXXCompilerId.cpp
│   │   │       └── tmp
│   │   ├── clean_test_results.dir
│   │   │   ├── build.make
│   │   │   ├── cmake_clean.cmake
│   │   │   ├── DependInfo.cmake
│   │   │   └── progress.make
│   │   ├── cmake.check_cache
│   │   ├── CMakeDirectoryInformation.cmake
│   │   ├── CMakeError.log
│   │   ├── CMakeOutput.log
│   │   ├── CMakeRuleHashes.txt
│   │   ├── CMakeTmp
│   │   ├── download_extra_data.dir
│   │   │   ├── build.make
│   │   │   ├── cmake_clean.cmake
│   │   │   ├── DependInfo.cmake
│   │   │   └── progress.make
│   │   ├── doxygen.dir
│   │   │   ├── build.make
│   │   │   ├── cmake_clean.cmake
│   │   │   ├── DependInfo.cmake
│   │   │   └── progress.make
│   │   ├── feature_tests.bin
│   │   ├── feature_tests.c
│   │   ├── feature_tests.cxx
│   │   ├── Makefile2
│   │   ├── Makefile.cmake
│   │   ├── progress.marks
│   │   ├── run_tests.dir
│   │   │   ├── build.make
│   │   │   ├── cmake_clean.cmake
│   │   │   ├── DependInfo.cmake
│   │   │   └── progress.make
│   │   ├── TargetDirectories.txt
│   │   └── tests.dir
│   │       ├── build.make
│   │       ├── cmake_clean.cmake
│   │       ├── DependInfo.cmake
│   │       └── progress.make
│   ├── cmake_install.cmake
│   ├── CTestConfiguration.ini
│   ├── CTestCustom.cmake
│   ├── CTestTestfile.cmake
│   ├── gtest
│   │   ├── CMakeFiles
│   │   │   ├── CMakeDirectoryInformation.cmake
│   │   │   └── progress.marks
│   │   ├── cmake_install.cmake
│   │   ├── CTestTestfile.cmake
│   │   ├── googlemock
│   │   │   ├── CMakeFiles
│   │   │   │   ├── CMakeDirectoryInformation.cmake
│   │   │   │   ├── gmock.dir
│   │   │   │   │   ├── __
│   │   │   │   │   │   └── googletest
│   │   │   │   │   │       └── src
│   │   │   │   │   ├── build.make
│   │   │   │   │   ├── cmake_clean.cmake
│   │   │   │   │   ├── DependInfo.cmake
│   │   │   │   │   ├── depend.make
│   │   │   │   │   ├── flags.make
│   │   │   │   │   ├── link.txt
│   │   │   │   │   ├── progress.make
│   │   │   │   │   └── src
│   │   │   │   ├── gmock_main.dir
│   │   │   │   │   ├── __
│   │   │   │   │   │   └── googletest
│   │   │   │   │   │       └── src
│   │   │   │   │   ├── build.make
│   │   │   │   │   ├── cmake_clean.cmake
│   │   │   │   │   ├── DependInfo.cmake
│   │   │   │   │   ├── depend.make
│   │   │   │   │   ├── flags.make
│   │   │   │   │   ├── link.txt
│   │   │   │   │   ├── progress.make
│   │   │   │   │   └── src
│   │   │   │   └── progress.marks
│   │   │   ├── cmake_install.cmake
│   │   │   ├── CTestTestfile.cmake
│   │   │   ├── gtest
│   │   │   │   ├── CMakeFiles
│   │   │   │   │   ├── CMakeDirectoryInformation.cmake
│   │   │   │   │   ├── gtest.dir
│   │   │   │   │   │   ├── build.make
│   │   │   │   │   │   ├── cmake_clean.cmake
│   │   │   │   │   │   ├── DependInfo.cmake
│   │   │   │   │   │   ├── depend.make
│   │   │   │   │   │   ├── flags.make
│   │   │   │   │   │   ├── link.txt
│   │   │   │   │   │   ├── progress.make
│   │   │   │   │   │   └── src
│   │   │   │   │   ├── gtest_main.dir
│   │   │   │   │   │   ├── build.make
│   │   │   │   │   │   ├── cmake_clean.cmake
│   │   │   │   │   │   ├── DependInfo.cmake
│   │   │   │   │   │   ├── depend.make
│   │   │   │   │   │   ├── flags.make
│   │   │   │   │   │   ├── link.txt
│   │   │   │   │   │   ├── progress.make
│   │   │   │   │   │   └── src
│   │   │   │   │   └── progress.marks
│   │   │   │   ├── cmake_install.cmake
│   │   │   │   ├── CTestTestfile.cmake
│   │   │   │   └── Makefile
│   │   │   └── Makefile
│   │   └── Makefile
│   ├── Makefile
│   └── test_results
├── devel
│   ├── cmake.lock
│   ├── env.sh
│   ├── lib
│   ├── local_setup.bash
│   ├── local_setup.sh
│   ├── local_setup.zsh
│   ├── setup.bash
│   ├── setup.sh
│   ├── _setup_util.py
│   └── setup.zsh
└── src├── CMakeLists.txt -> /opt/ros/melodic/share/catkin/cmake/toplevel.cmake└── communication46 directories, 128 files

编译后出现了 build 和 devel 目录
build:编译空间,用来存储工作空间编译过程中产生的中间文件(文件夹里面还有 gtest 这是之前没注意到的)
devel:开发空间,用来保存编译生成的可执行文件

需要将 devel/setup.bash 添加到环境变量中才能在终端中找到这个工作空间中的功能包
两种方式:
(1)在终端中 source 一下这个文件

source  ~/ros_review/devel/setup.bash

只对当前终端生效,每次新打开终端的时候都要运行一下
(2)将 source ~/ros_review/devel/setup.bash 其添加到 bashrc 文件中

  • 创建功能包
~/ros_review/src$ catkin_create_pkg communication_basic std_msg roscpp rospy
Created file communication_basic/package.xml
Created file communication_basic/CMakeLists.txt
Created folder communication_basic/include/communication_basic
Created folder communication_basic/src
Successfully created files in /home/livvedia/ros_review/src/communication_basic. Please adjust the values in package.xml.~/ros_review/src$ tree
.
├── CMakeLists.txt -> /opt/ros/melodic/share/catkin/cmake/toplevel.cmake
└── communication_basic├── CMakeLists.txt├── include│   └── communication_basic├── package.xml└── src
  • 创建消息类型 test.msg
    位于新建文件夹 msg 内,内容如下:
cat msg/test_msg.msg 
string name
int32 age
int64 score
  • 修改 package.xml 中的内容
  1 <?xml version="1.0"?>2 <package format="2">3   <name>communication_basic</name>4   <version>0.0.0</version>5   <description>The communication_basic package</description>6 7   <!-- One maintainer tag required, multiple allowed, one person per tag -->8   <!-- Example:  -->9   <!-- <maintainer email="jane.doe@example.com">Jane Doe</maintainer> -->10   <maintainer email="livvedia@todo.todo">livvedia</maintainer>11 12 13   <!-- One license tag required, multiple allowed, one license per tag -->14   <!-- Commonly used license strings: -->15   <!--   BSD, MIT, Boost Software License, GPLv2, GPLv3, LGPLv2.1, LGPLv3 -->16   <license>TODO</license>17 18 19   <!-- Url tags are optional, but multiple are allowed, one per tag -->20   <!-- Optional attribute type can be: website, bugtracker, or repository -->21   <!-- Example: -->22   <!-- <url type="website">http://wiki.ros.org/communication_basic</url> -->23 24 25   <!-- Author tags are optional, multiple are allowed, one per tag -->26   <!-- Authors do not have to be maintainers, but could be -->27   <!-- Example: -->28   <!-- <author email="jane.doe@example.com">Jane Doe</author> -->29 30 31   <!-- The *depend tags are used to specify dependencies -->32   <!-- Dependencies can be catkin packages or system dependencies -->33   <!-- Examples: -->34   <!-- Use depend as a shortcut for packages that are both build and exec dependencies -->35   <!--   <depend>roscpp</depend> -->36   <!--   Note that this is equivalent to the following: -->37   <!--   <build_depend>roscpp</build_depend> -->38   <!--   <exec_depend>roscpp</exec_depend> -->39   <!-- Use build_depend for packages you need at compile time: -->40 <build_depend>message_generation</build_depend>41   <!-- Use build_export_depend for packages you need in order to build against this package: -->42   <!--   <build_export_depend>message_generation</build_export_depend> -->43   <!-- Use buildtool_depend for build tool packages: -->44   <!--   <buildtool_depend>catkin</buildtool_depend> -->45   <!-- Use exec_depend for packages you need at runtime: -->46 <exec_depend>message_runtime</exec_depend>47   <!-- Use test_depend for packages you need only for testing: -->48   <!--   <test_depend>gtest</test_depend> -->49   <!-- Use doc_depend for packages you need only for building documentation: -->50   <!--   <doc_depend>doxygen</doc_depend> -->51   <buildtool_depend>catkin</buildtool_depend>52   <build_depend>roscpp</build_depend>53   <build_depend>rospy</build_depend>54   <build_depend>std_msg</build_depend>55   <build_export_depend>roscpp</build_export_depend>56   <build_export_depend>rospy</build_export_depend>57   <build_export_depend>std_msg</build_export_depend>58   <exec_depend>roscpp</exec_depend>59   <exec_depend>rospy</exec_depend>60   <exec_depend>std_msg</exec_depend>61 62 63   <!-- The export tag contains other, unspecified, tags -->64   <export>65     <!-- Other tools can request additional information be placed here -->66 67   </export>68 </package>

将第 40 行 和第 46 行注释去掉
<build_depend>xxx</build_depend> 标签定义了功能包中代码编译时所依赖的其他功能包
<exec_depend>xxxx</exec_depend> 标签定义了功能包中可执行程序运行时所依赖的其他功能包

  • 修改CMakeLists.txt 文件
    (1) find_package() 中加入 message_generation
find_package(catkin REQUIRED COMPONENTSroscpprospystd_msgmessage_generation
)

(2)设置运行依赖 catkin_package() 中解除注释并添加 message_runtime

catkin_package(
#  INCLUDE_DIRS include
#  LIBRARIES communication_basicCATKIN_DEPENDS roscpp rospy std_msg message_runtime
#  DEPENDS system_lib
)

(3)加入新的消息类型

 add_message_files(FILEStest_msg.msg)

(4)添加生成消息

generate_messages(DEPENDENCIESstd_msgs  # Or other packages containing msgs)

(4)编译

~/ros_review$ catkin_make
Base path: /home/livvedia/ros_review
Source space: /home/livvedia/ros_review/src
Build space: /home/livvedia/ros_review/build
Devel space: /home/livvedia/ros_review/devel
Install space: /home/livvedia/ros_review/install
####
#### Running command: "make cmake_check_build_system" in "/home/livvedia/ros_review/build"
####
-- Using CATKIN_DEVEL_PREFIX: /home/livvedia/ros_review/devel
-- Using CMAKE_PREFIX_PATH: /home/livvedia/ros_review/devel;/home/livvedia/car_arm_ws/devel;/home/livvedia/ARM/devel;/home/livvedia/wpr1/devel;/opt/ros/melodic
-- This workspace overlays: /home/livvedia/ros_review/devel;/home/livvedia/car_arm_ws/devel;/home/livvedia/ARM/devel;/home/livvedia/wpr1/devel;/opt/ros/melodic
-- Found PythonInterp: /usr/bin/python2 (found suitable version "2.7.17", minimum required is "2") 
-- Using PYTHON_EXECUTABLE: /usr/bin/python2
-- Using Debian Python package layout
-- Using empy: /usr/bin/empy
-- Using CATKIN_ENABLE_TESTING: ON
-- Call enable_testing()
-- Using CATKIN_TEST_RESULTS_DIR: /home/livvedia/ros_review/build/test_results
-- Found gtest sources under '/usr/src/googletest': gtests will be built
-- Found gmock sources under '/usr/src/googletest': gmock will be built
-- Found PythonInterp: /usr/bin/python2 (found version "2.7.17") 
-- Using Python nosetests: /usr/bin/nosetests-2.7
-- catkin 0.7.29
-- BUILD_SHARED_LIBS is on
-- BUILD_SHARED_LIBS is on
-- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-- ~~  traversing 1 packages in topological order:
-- ~~  - communication_basic
-- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-- +++ processing catkin package: 'communication_basic'
-- ==> add_subdirectory(communication_basic)
-- Using these message generators: gencpp;geneus;genlisp;gennodejs;genpy
-- communication_basic: 1 messages, 0 services
-- Configuring done
-- Generating done
-- Build files have been written to: /home/livvedia/ros_review/build
####
#### Running command: "make -j4 -l4" in "/home/livvedia/ros_review/build"
####
Scanning dependencies of target _communication_basic_generate_messages_check_deps_test_msg
[  0%] Built target std_msgs_generate_messages_py
[  0%] Built target std_msgs_generate_messages_nodejs
[  0%] Built target std_msgs_generate_messages_cpp
[  0%] Built target std_msgs_generate_messages_lisp
[  0%] Built target std_msgs_generate_messages_eus
[  0%] Built target _communication_basic_generate_messages_check_deps_test_msg
[ 28%] Generating Python from MSG communication_basic/test_msg
[ 28%] Generating Javascript code from communication_basic/test_msg.msg
[ 42%] Generating C++ code from communication_basic/test_msg.msg
[ 57%] Generating Lisp code from communication_basic/test_msg.msg
[ 57%] Built target communication_basic_generate_messages_nodejs
[ 71%] Generating EusLisp code from communication_basic/test_msg.msg
[ 71%] Built target communication_basic_generate_messages_lisp
[ 85%] Built target communication_basic_generate_messages_eus
[100%] Generating Python msg __init__.py for communication_basic
[100%] Built target communication_basic_generate_messages_cpp
[100%] Built target communication_basic_generate_messages_py
[100%] Built target communication_basic_generate_messages

编译后自动生成了 test_msg.h (devel/include/communication_basic 文件夹中)
使用 rosmsg show 可以查看新增的 msg 类型

~/ros_review$ rosmsg show communication_basic/test_msg
string name
int32 age
int64 score
  • 编写发布者节点
    src/publish_test.cpp 内容如下:
//发布话题:  Test_msg 
//消息类型为:communication_basic::test_msg
#include <ros/ros.h>
#include"communication_basic/test_msg.h"int main(int argc,char **argv)//argc和argv都是输入参数
{//初始化节点ros::init(argc,argv,"test_publisher");//创建句柄-管理节点资源ros::NodeHandle n;//创建一个Publisher,发布名为 Test_msg,消息类型是 communication_basic::test_msg,队列长度为10ros::Publisher test_publisher = n.advertise<communication_basic::test_msg>("Test_msg",10);//循环频率ros::Rate loop_rate(10);std::string name("tom");int age = 18;int score = 0;//roscpp会默认安装以SIGINT句柄,这句话就是用来处理由ctrl+c键盘操作、该节点被另一同名节点踢出ROS网络、ros::shutdown()被程序在某个地方调用、所有ros::NodeHandle句柄都被销毁等触发而使ros::ok()返回false值的情况while (ros::ok()){//初始化消息communication_basic::test_msg test_msg;test_msg.name = name;test_msg.age=age;test_msg.score=score++;//发布消息test_publisher.publish(test_msg);ROS_INFO("Publish test msg :[name:%s ,age:%d, score:%d]",test_msg.name.c_str(),test_msg.age,test_msg.score);//设置循环频率loop_rate.sleep();}return 0;
}
  • 编写订阅者节点
    src/subscriber.cpp 内容如下:
#include "ros/ros.h"
#include"communication_basic/test_msg.h"void TestCallback(const communication_basic::test_msg & test_msg){ROS_INFO(" name:[%s]\n", test_msg.name.c_str());ROS_INFO(" age:[%d]\n", test_msg.age);ROS_INFO(" score:[%d]\n", test_msg.score);
}int main(int argc, char** argv){ros::init(argc, argv,"test_subscriber");ros::NodeHandle n;ros::Subscriber sub = n.subscribe( "Test_msg", 1000, TestCallback);ros::spin();return 0;
}
  • 添加目标节点到 CMakeList.txt 文件中
 # 第一个参数是生成后的可执行文件名 第二个参数是源文件路径名
add_executable(test_publisher src/publisher.cpp)# 链接库
target_link_libraries(test_publisher ${catkin_LIBRARIES})add_executable(test_subscriber src/subscriber.cpp)
target_link_libraries(test_subscriber ${catkin_LIBRARIES})
  • 编译节点
~/ros_review$ catkin_make
Base path: /home/livvedia/ros_review
Source space: /home/livvedia/ros_review/src
Build space: /home/livvedia/ros_review/build
Devel space: /home/livvedia/ros_review/devel
Install space: /home/livvedia/ros_review/install
####
#### Running command: "make cmake_check_build_system" in "/home/livvedia/ros_review/build"
####
-- Using CATKIN_DEVEL_PREFIX: /home/livvedia/ros_review/devel
-- Using CMAKE_PREFIX_PATH: /home/livvedia/ros_review/devel;/home/livvedia/car_arm_ws/devel;/home/livvedia/ARM/devel;/home/livvedia/wpr1/devel;/opt/ros/melodic
-- This workspace overlays: /home/livvedia/ros_review/devel;/home/livvedia/car_arm_ws/devel;/home/livvedia/ARM/devel;/home/livvedia/wpr1/devel;/opt/ros/melodic
-- Found PythonInterp: /usr/bin/python2 (found suitable version "2.7.17", minimum required is "2") 
-- Using PYTHON_EXECUTABLE: /usr/bin/python2
-- Using Debian Python package layout
-- Using empy: /usr/bin/empy
-- Using CATKIN_ENABLE_TESTING: ON
-- Call enable_testing()
-- Using CATKIN_TEST_RESULTS_DIR: /home/livvedia/ros_review/build/test_results
-- Found gtest sources under '/usr/src/googletest': gtests will be built
-- Found gmock sources under '/usr/src/googletest': gmock will be built
-- Found PythonInterp: /usr/bin/python2 (found version "2.7.17") 
-- Using Python nosetests: /usr/bin/nosetests-2.7
-- catkin 0.7.29
-- BUILD_SHARED_LIBS is on
-- BUILD_SHARED_LIBS is on
-- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-- ~~  traversing 1 packages in topological order:
-- ~~  - communication_basic
-- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-- +++ processing catkin package: 'communication_basic'
-- ==> add_subdirectory(communication_basic)
-- Using these message generators: gencpp;geneus;genlisp;gennodejs;genpy
-- communication_basic: 1 messages, 0 services
-- Configuring done
-- Generating done
-- Build files have been written to: /home/livvedia/ros_review/build
####
#### Running command: "make -j4 -l4" in "/home/livvedia/ros_review/build"
####
[  0%] Built target std_msgs_generate_messages_cpp
[  9%] Linking CXX executable /home/livvedia/ros_review/devel/lib/communication_basic/test_subscriber
[ 18%] Linking CXX executable /home/livvedia/ros_review/devel/lib/communication_basic/test_publisher
[ 18%] Built target _communication_basic_generate_messages_check_deps_test_msg
[ 18%] Built target std_msgs_generate_messages_nodejs
[ 18%] Built target std_msgs_generate_messages_lisp
[ 18%] Built target std_msgs_generate_messages_py
[ 18%] Built target std_msgs_generate_messages_eus
[ 27%] Built target communication_basic_generate_messages_cpp
[ 45%] Built target communication_basic_generate_messages_py
[ 54%] Built target communication_basic_generate_messages_nodejs
[ 63%] Built target communication_basic_generate_messages_lisp
[ 81%] Built target communication_basic_generate_messages_eus
[ 81%] Built target communication_basic_generate_messages
[ 90%] Built target test_subscriber
[100%] Built target test_publisher
  • 运行测试

三个终端界面:

roscore
rosrun communication_basic test_publisher
rosrun communication_basic te_subscriber

结果如图:
在这里插入图片描述

3. 服务通信实现(service)

  • 新建服务消息
~/ros_review$ cat src/communication_basic/srv/add.srv 
string str1
string str2
int64 a
int64 b
---
string str_sum
  • 修改 CMakeList.txt
add_service_files(FILESadd.srv
)add_executable(add_server src/add_server.cpp)
target_link_libraries(add_server ${catkin_LIBRARIES})add_executable(add_client src/add_client.cpp)
target_link_libraries(add_client ${catkin_LIBRARIES})
  • 编写测试程序

src/add_server.cpp

#include "ros/ros.h"
#include "communication_basic/add.h"// service 回调函数 形参数据类型是固定的用引用
bool add( communication_basic::add::Request& req, communication_basic::add::Response & resp){resp.str_sum = req.str1+req.str2;resp.sum = req.a+req.b;ROS_INFO("request: a=%d, b=%d, str1=%s, str2=%s", req.a,req.b,req.str1.c_str(),req.str2.c_str());ROS_INFO("sending back response: sum=%d, str_sum=%s", resp.sum, resp.str_sum.c_str());return true;
}int main(int argc, char**argv){// ROS 节点初始化ros::init(argc,argv,"add_server");// 创建节点句柄ros::NodeHandle n;// 创建一个名为 add 的 server ,注册回调函数 add()ros::ServiceServer service = n.advertiseService("add", add);// 循环等待回调函数ROS_INFO("add server is ok");ros::spin();return 0;
}

src/add_client.cpp

#include "ros/ros.h"
#include "communication_basic/add.h"int main(int argc,char** argv){// 从终端获取两个数字和两个字符串if(argc != 5){ROS_INFO("usage:  please input 4 params(2 number 2 string), params size is:%d",argc);return 1;}//ROS 节点初始化ros::init(argc,argv,"add_client");// 创建节点句柄ros::NodeHandle n;// 创建一个 client, 请求 add serverros::ServiceClient client = n.serviceClient<communication_basic::add>("add");// 创建消息communication_basic::add test_msg;test_msg.request.a=atoll(argv[1]);test_msg.request.b=atoll(argv[2]);test_msg.request.str1=argv[3];test_msg.request.str2=argv[4];// 发布 service 请求,等待加法运算的返回结果if(client.call(test_msg)){ROS_INFO("response: sum is:%d, sum_str is:%s", test_msg.response.sum, test_msg.response.str_sum.c_str());} else{ROS_ERROR("Failed to call service add");return 1;}return 0;
}
  • 编译代码
~/ros_review$ catkin_make
Base path: /home/livvedia/ros_review
Source space: /home/livvedia/ros_review/src
Build space: /home/livvedia/ros_review/build
Devel space: /home/livvedia/ros_review/devel
Install space: /home/livvedia/ros_review/install
####
#### Running command: "make cmake_check_build_system" in "/home/livvedia/ros_review/build"
####
####
#### Running command: "make -j4 -l4" in "/home/livvedia/ros_review/build"
####
[  0%] Built target std_msgs_generate_messages_py
[  0%] Built target _communication_basic_generate_messages_check_deps_add
[  0%] Built target std_msgs_generate_messages_cpp
[  0%] Built target _communication_basic_generate_messages_check_deps_test_msg
[  0%] Built target std_msgs_generate_messages_eus
[  0%] Built target std_msgs_generate_messages_lisp
[  9%] Built target test_publisher
[ 19%] Built target test_subscriber
Scanning dependencies of target add_client
Scanning dependencies of target add_server
[ 23%] Building CXX object communication_basic/CMakeFiles/add_client.dir/src/add_client.cpp.o
[ 28%] Building CXX object communication_basic/CMakeFiles/add_server.dir/src/add_server.cpp.o
[ 47%] Built target communication_basic_generate_messages_py
[ 57%] Built target communication_basic_generate_messages_cpp
[ 57%] Built target std_msgs_generate_messages_nodejs
[ 71%] Built target communication_basic_generate_messages_eus
[ 80%] Built target communication_basic_generate_messages_nodejs
[ 90%] Built target communication_basic_generate_messages_lisp
[ 90%] Built target communication_basic_generate_messages
In file included from /opt/ros/melodic/include/ros/ros.h:40:0,from /home/livvedia/ros_review/src/communication_basic/src/add_server.cpp:1:
/home/livvedia/ros_review/src/communication_basic/src/add_server.cpp: In function ‘bool add(communication_basic::add::Request&, communication_basic::add::Response&)’:
/opt/ros/melodic/include/ros/console.h:348:176: warning: format ‘%d’ expects argument of type ‘int’, but argument 8 has type ‘communication_basic::addRequest_<std::allocator<void> >::_a_type {aka long int}[-Wformat=]location__loc.level_, __FILE__, __LINE__, __ROSCONSOLE_FUNCTION__, __VA_ARGS__)^
/opt/ros/melodic/include/ros/console.h:351:5: note: in expansion of macro ‘ROSCONSOLE_PRINT_AT_LOCATION_WITH_FILTER’ROSCONSOLE_PRINT_AT_LOCATION_WITH_FILTER(NULL, __VA_ARGS__)^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/opt/ros/melodic/include/ros/console.h:387:7: note: in expansion of macro ‘ROSCONSOLE_PRINT_AT_LOCATION’ROSCONSOLE_PRINT_AT_LOCATION(__VA_ARGS__); \^~~~~~~~~~~~~~~~~~~~~~~~~~~~
/opt/ros/melodic/include/ros/console.h:572:35: note: in expansion of macro ‘ROS_LOG_COND’#define ROS_LOG(level, name, ...) ROS_LOG_COND(true, level, name, __VA_ARGS__)^~~~~~~~~~~~
/opt/ros/melodic/include/rosconsole/macros_generated.h:110:23: note: in expansion of macro ‘ROS_LOG’#define ROS_INFO(...) ROS_LOG(::ros::console::levels::Info, ROSCONSOLE_DEFAULT_NAME, __VA_ARGS__)^~~~~~~
/home/livvedia/ros_review/src/communication_basic/src/add_server.cpp:9:5: note: in expansion of macro ‘ROS_INFO’ROS_INFO("request: a=%d, b=%d, str1=%s, str2=%s", req.a,req.b,req.str1.c_str(),req.str2.c_str());^~~~~~~~
/opt/ros/melodic/include/ros/console.h:348:176: warning: format ‘%d’ expects argument of type ‘int’, but argument 9 has type ‘communication_basic::addRequest_<std::allocator<void> >::_b_type {aka long int}[-Wformat=]location__loc.level_, __FILE__, __LINE__, __ROSCONSOLE_FUNCTION__, __VA_ARGS__)^
/opt/ros/melodic/include/ros/console.h:351:5: note: in expansion of macro ‘ROSCONSOLE_PRINT_AT_LOCATION_WITH_FILTER’ROSCONSOLE_PRINT_AT_LOCATION_WITH_FILTER(NULL, __VA_ARGS__)^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/opt/ros/melodic/include/ros/console.h:387:7: note: in expansion of macro ‘ROSCONSOLE_PRINT_AT_LOCATION’ROSCONSOLE_PRINT_AT_LOCATION(__VA_ARGS__); \^~~~~~~~~~~~~~~~~~~~~~~~~~~~
/opt/ros/melodic/include/ros/console.h:572:35: note: in expansion of macro ‘ROS_LOG_COND’#define ROS_LOG(level, name, ...) ROS_LOG_COND(true, level, name, __VA_ARGS__)^~~~~~~~~~~~
/opt/ros/melodic/include/rosconsole/macros_generated.h:110:23: note: in expansion of macro ‘ROS_LOG’#define ROS_INFO(...) ROS_LOG(::ros::console::levels::Info, ROSCONSOLE_DEFAULT_NAME, __VA_ARGS__)^~~~~~~
/home/livvedia/ros_review/src/communication_basic/src/add_server.cpp:9:5: note: in expansion of macro ‘ROS_INFO’ROS_INFO("request: a=%d, b=%d, str1=%s, str2=%s", req.a,req.b,req.str1.c_str(),req.str2.c_str());^~~~~~~~
/opt/ros/melodic/include/ros/console.h:348:176: warning: format ‘%d’ expects argument of type ‘int’, but argument 8 has type ‘communication_basic::addResponse_<std::allocator<void> >::_sum_type {aka long int}[-Wformat=]location__loc.level_, __FILE__, __LINE__, __ROSCONSOLE_FUNCTION__, __VA_ARGS__)^
/opt/ros/melodic/include/ros/console.h:351:5: note: in expansion of macro ‘ROSCONSOLE_PRINT_AT_LOCATION_WITH_FILTER’ROSCONSOLE_PRINT_AT_LOCATION_WITH_FILTER(NULL, __VA_ARGS__)^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/opt/ros/melodic/include/ros/console.h:387:7: note: in expansion of macro ‘ROSCONSOLE_PRINT_AT_LOCATION’ROSCONSOLE_PRINT_AT_LOCATION(__VA_ARGS__); \^~~~~~~~~~~~~~~~~~~~~~~~~~~~
/opt/ros/melodic/include/ros/console.h:572:35: note: in expansion of macro ‘ROS_LOG_COND’#define ROS_LOG(level, name, ...) ROS_LOG_COND(true, level, name, __VA_ARGS__)^~~~~~~~~~~~
/opt/ros/melodic/include/rosconsole/macros_generated.h:110:23: note: in expansion of macro ‘ROS_LOG’#define ROS_INFO(...) ROS_LOG(::ros::console::levels::Info, ROSCONSOLE_DEFAULT_NAME, __VA_ARGS__)^~~~~~~
/home/livvedia/ros_review/src/communication_basic/src/add_server.cpp:10:5: note: in expansion of macro ‘ROS_INFO’ROS_INFO("sending back response: sum=%d, str_sum=%s", resp.sum, resp.str_sum.c_str());^~~~~~~~
In file included from /opt/ros/melodic/include/ros/ros.h:40:0,from /home/livvedia/ros_review/src/communication_basic/src/add_client.cpp:1:
/home/livvedia/ros_review/src/communication_basic/src/add_client.cpp: In function ‘int main(int, char**)’:
/opt/ros/melodic/include/ros/console.h:348:176: warning: format ‘%d’ expects argument of type ‘int’, but argument 8 has type ‘communication_basic::addResponse_<std::allocator<void> >::_sum_type {aka long int}[-Wformat=]::ros::console::print(filter, __rosconsole_define_location__loc.logger_, __rosconsole_define_location__loc.level_, __FILE__, __LINE__, __ROSCONSOLE_FUNCTION__, __VA_ARGS__)^
/opt/ros/melodic/include/ros/console.h:351:5: note: in expansion of macro ‘ROSCONSOLE_PRINT_AT_LOCATION_WITH_FILTER’ROSCONSOLE_PRINT_AT_LOCATION_WITH_FILTER(NULL, __VA_ARGS__)^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/opt/ros/melodic/include/ros/console.h:387:7: note: in expansion of macro ‘ROSCONSOLE_PRINT_AT_LOCATION’ROSCONSOLE_PRINT_AT_LOCATION(__VA_ARGS__); \^~~~~~~~~~~~~~~~~~~~~~~~~~~~
/opt/ros/melodic/include/ros/console.h:572:35: note: in expansion of macro ‘ROS_LOG_COND’#define ROS_LOG(level, name, ...) ROS_LOG_COND(true, level, name, __VA_ARGS__)^~~~~~~~~~~~
/opt/ros/melodic/include/rosconsole/macros_generated.h:110:23: note: in expansion of macro ‘ROS_LOG’#define ROS_INFO(...) ROS_LOG(::ros::console::levels::Info, ROSCONSOLE_DEFAULT_NAME, __VA_ARGS__)^~~~~~~
/home/livvedia/ros_review/src/communication_basic/src/add_client.cpp:30:9: note: in expansion of macro ‘ROS_INFO’ROS_INFO("response: sum is:%d, sum_str is:%s", test_msg.response.sum, test_msg.response.str_sum.c_str());^~~~~~~~
[ 95%] Linking CXX executable /home/livvedia/ros_review/devel/lib/communication_basic/add_client
[100%] Linking CXX executable /home/livvedia/ros_review/devel/lib/communication_basic/add_server
[100%] Built target add_client
[100%] Built target add_server
  • 测试
    三个终端界面:
roscore
rosrun communication_basic add_server 
[ INFO] [1699810722.572002386]: add server is ok
rosrun communication_basic add_client 1 2 ab cd 
[ INFO] [1699810740.389112254]: response: sum is:3, sum_str is:abcd

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/140584.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mysql讲解2 之事务 索引 以及权限等

系列文章目录 mysql 讲解一 博客链接 点击此处即可 文章目录 系列文章目录一、事务1.1 事务的四个原则1.2 脏读 不可重复读 幻读 二、索引三,数据库用户管理四、mysql备份 一、事务 1.1 事务的四个原则 什么是事务 事务就是将一组SQL语句放在同一批次内去执行 如果一个SQ…

webpack提升构建速度

目录 配置优化减少 resolve 的解析把 loader 应用的文件范围缩小减少 plugin 的消耗选择合适的 devtool 使用工具thread-loaderDLLPlugin 流程优化拆分构建步骤拆分项目代码 版本更新总结 前端项目随着时间推移和业务发展&#xff0c;页面可能会越来越多&#xff0c;或者功能和…

什么是安全平行切面

安全平行切面的定义 通过嵌入在端—管—云内部的各层次切点&#xff0c;使得安全管控与业务逻辑解耦&#xff0c;并通过标准化的接口为安全业务提供内视和干预能力的安全基础设施。安全平行切面是一种创新的安全体系思想&#xff0c;是实现“原生安全”的一条可行路径。 为什…

分类预测 | Matlab实现PSO-LSTM粒子群算法优化长短期记忆神经网络的数据多输入分类预测

分类预测 | Matlab实现PSO-LSTM粒子群算法优化长短期记忆神经网络的数据多输入分类预测 目录 分类预测 | Matlab实现PSO-LSTM粒子群算法优化长短期记忆神经网络的数据多输入分类预测分类效果基本描述程序设计参考资料 分类效果 基本描述 1.Matlab实现PSO-LSTM粒子群算法优化长短…

下载并安装DevEco Studio 3.1,初尝鸿蒙编程

摘自华为官网 DevEco Studio 3.1配套支持HarmonyOS 3.1版本及以上的应用及服务开发&#xff0c;提供了代码智能编辑、低代码开发、双向预览等功能&#xff0c;以及轻量构建工具DevEco Hvigor 、本地模拟器&#xff0c;持续提升应用及服务开发效率。 下载 官网下载地址 HUAWEI…

用python将csv表格数据做成热力图

python的开发者为处理表格和画图提供了库的支持&#xff0c;使用pandas库可以轻松完成对csv文件的读写操作&#xff0c;使用matplotlib库提供了画热力图的各种方法。实现这个功能首先需要读出csv数&#xff0c;然后设置自定义色条的各种属性如颜色&#xff0c;位置&#xff0c;…

19、Flink 的Table API 和 SQL 中的自定义函数及示例(3)

Flink 系列文章 1、Flink 部署、概念介绍、source、transformation、sink使用示例、四大基石介绍和示例等系列综合文章链接 13、Flink 的table api与sql的基本概念、通用api介绍及入门示例 14、Flink 的table api与sql之数据类型: 内置数据类型以及它们的属性 15、Flink 的ta…

CoRL 2023 获奖论文公布,manipulation、强化学习等主题成热门

今年大模型及具身智能领域有了非常多的突破性进展&#xff0c;作为机器人学与机器学习交叉领域的全球顶级学术会议之一&#xff0c;CoRL也得到了更多的关注。 CoRL 是面向机器人学习的顶会&#xff0c;涵盖机器人学、机器学习和控制等多个主题&#xff0c;包括理论与应用。今年…

初探地理编码(2023.11.12)

地理编码相识 2023.11.12 引言1、地理编码简介2、地理编码API和服务&#xff08;解决方案供应商 / 厂商&#xff09;2.1 高德2.2 百度2.3 超图2.4 天地图2.5 ArcGIS2.6 MapBox2.7 Cesium2.8 MapLocation 3、python实例3.1 pip安装依赖库&#xff08;python 3.6&#xff09;3.2 …

MVVM框架:图片加载有问题

一、前言&#xff1a;在我使用ImageView加载图片的时候添加如下代码发现报错 app:imageUrl"{viewModel.observableField.assetImg}"报错如下错误 二、原因&#xff1a;是啥我不太清楚好像是没有imageView的适配器&#xff0c;后来我看了一下确实没有 public class I…

AD9371 Crossbar 和 I、Q数据 映射JESD204B传输层

AD9371 系列快速入口 AD9371ZCU102 移植到 ZCU106 &#xff1a; AD9371 官方例程构建及单音信号收发 ad9371_tx_jesd -->util_ad9371_xcvr接口映射&#xff1a; AD9371 官方例程之 tx_jesd 与 xcvr接口映射 AD9371 官方例程 时钟间的关系与生成 &#xff1a; AD9371 官方…

linux 安装 mini conda,linux下安装 Miniconda

下载地址 https://docs.conda.io/projects/miniconda/en/latest/index.html 安装conda mkdir -p ~/miniconda3 wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh -O ~/miniconda3/miniconda.sh bash ~/miniconda3/miniconda.sh -b -u -p ~/mini…

微信开发者工具如何使用

首先是下载微信开发者工具 链接: https://pan.baidu.com/s/1ri-fRCUQsz9vLxbTqtdPUQ 提取码: 8rhn 复制这段内容后打开百度网盘手机App&#xff0c;操作更方便哦 安装完打开就是以下界面 接下来进入正题 第一步新建或导入 新建 获取AppID 第一步&#xff1a;通过微信公众平…

第12章 PyTorch图像分割代码框架-3:推理与部署

推理模块 模型训练完成后&#xff0c;需要单独再写一个推理模块来供用户测试或者使用&#xff0c;该模块可以命名为test.py或者inference.py&#xff0c;导入训练好的模型文件和待测试的图像&#xff0c;输出该图像的分割结果。inference.py主体部分如代码11-7所示。 代码11-7 …

vue做的一个一点就转的转盘(音乐磁盘),点击停止时会在几秒内缓慢停止,再次点击按钮可以再次旋转,

先看效果&#xff1a; 代码&#xff1a;主要部分我会红线画出来 css:部分&#xff1a; 源码&#xff1a; vue部分&#xff1a; <template><div class"song-lyric"><div><div class"type"><div class"right">&l…

如何用自然语言 5 分钟构建个人知识库应用?我的 GPTs builder 尝试

开发者的想象力闸门一旦打开&#xff0c;迎接我们的必然是目不暇接的 AI 应用浪潮冲击。 兴奋 早晨&#xff0c;我突然发现 ChatGPT 最新的 Create GPTs 功能可以用了。 这太让我意外了&#xff0c;没想到这么快。根据页面上的提示&#xff0c;我一直以为还得等上一周左右。于是…

3C制造RFID产线智能化升级改造设计方案

3C行业需求 近年来&#xff0c;随着政策的支持、相关技术的进步以及市场需求的推动&#xff0c;3C行业迅速发展&#xff0c;我国的3C市场已经进入了稳定发展阶段&#xff0c;作为仅次于汽车产业的大市场&#xff0c;3C产业在智能制造的推动下&#xff0c;越来越多的物联网技术…

软考网络工程师知识点总结(四)

目录 61、FTP文件传输服务 62、DHCP动态主机配置协议 63、电子邮件服务 64、各种新技术相关概念及功能的考查 65、Windows的ipconfig命令 66、Windows的其它命令及说明 67、Linux系统关机和重启命令 68、Linux系统文件属性命令 69、SNMP协议版本 70、SNMP协议的报文类…

【OpenCV(3)】linux arm aarch 是 opencv 交叉编译与使用

文章目录 1、直接找github 别人编译好的2、自主编译参考 3使用CMake检查 参考 1、直接找github 别人编译好的 测试很多&#xff0c;找到一个可用的。 https://github.com/dog-qiuqiu/libopencv 它用了超级模块&#xff01; OpenCV的world模块也称为超级模块&#xff08;supe…

Zeitgeist ZTG Token以及其预测市场加入Moonbeam生态

波卡上的首选多链开发平台Moonbeam宣布与Zeitgeist达成XCM集成&#xff0c;将ZTG Token引入Moonbeam。此集成将使波卡内的Moonbeam和Zeitgeist网络之间的流动性得以流动&#xff0c;并通过Moonbeam的互连合约实现远程链集成。 Zeitgeist是一个基于波卡的Substrate区块链框架构…