\\n<meta name=\\"viewport\\" content=\\"width=device-width, initial-scale=1.0\\" />\\n<title>文档</title>\\n</head>\\n<body>\\n<ul>\\n<li ><a href=\\"#item1\\">熊猫名字的来源</a></li>\\n<li ><a href=\\"#item2\\">熊猫居住地</a></li>\\n<li ><a href=\\"#item3\\">熊猫的生活习惯</a></li>**\\n</ul>
\\n <h2 id=\\"item1\\">名字的起源</h2>\\n <p>大熊猫(学名:Ailuropoda melanoleuca),也称作大猫熊,一般称为“熊猫”或“猫熊”,属于食肉目熊科的一种哺乳动物,体色为黑白两色。</p>\\n <p>熊猫是中国特有物种,现存的主要栖息地是中国中西部四川盆地周边的山区和陕西南部的秦岭地区。全世界野生大熊猫现存大约有2060头。</p>\\n <br/><br/><br/><br/>\\n <h2 id=\\"item2\\">居住地</h2>\\n <p>化石记录它过去曾经分布在东南黄河、长江和珠江流域,北及北京周口店,南达越南、泰国和缅甸北部,是中国南方大熊猫-剑齿象动物群中主要成员。</p>\\n <br/><br/><br/><br/><br/>\\n <h2 id=\\"item3\\">生活习惯</h2>\\n <p>熊猫和别的熊一样是杂食性动物,处于从食肉动物到食草动物过渡的阶段。主要食物是竹子、红萝卜、窝窝头,野生的熊猫会吃草、野果、昆虫、竹鼠、羊。</p>\\n</body>\\n
\\n</html>
\\n","description":"试过了,这个正确,那个href=“#item”应该写在标签中,而不是无序列表\\n
\\n之前把about.html文件里面写了一个a标签跳转到index.html,可是我删掉a标签了,为什么我的about.html总是跳转到index.html😢
才发现当前讲的视频都是在省赛班讲的。但是为什么在国赛班的这些视频里的左边的“章节”、“报告”、“讨论”、“学习助手”等功能中居然没有最重要的”步骤“功能。
\\n国赛班的这些视频里就有“步骤”功能。顺着视频中的网址一找,好家伙,居然跳到了省赛班里去了,这时才发现省赛班里有各种文件,甚至内容设置得更加清楚。
\\n拜托,报省赛班和国赛班里都有小白。不是报国赛班的就一定全是高手。没有“步骤”这一功能,我还得不断地调视频的进度去写代码,就不能让我复制一下重复的代码嘛。不然花比省赛班一倍多的钱、结果在体验上甚至还不如省赛班?
\\n","description":"才发现当前讲的视频都是在省赛班讲的。但是为什么在国赛班的这些视频里的左边的“章节”、“报告”、“讨论”、“学习助手”等功能中居然没有最重要的”步骤“功能。 国赛班的这些视频里就有“步骤”功能。顺着视频中的网址一找,好家伙,居然跳到了省赛班里去了,这时才发现省赛班里有各种文件,甚至内容设置得更加清楚。\\n\\n拜托,报省赛班和国赛班里都有小白。不是报国赛班的就一定全是高手。没有“步骤”这一功能,我还得不断地调视频的进度去写代码,就不能让我复制一下重复的代码嘛。不然花比省赛班一倍多的钱、结果在体验上甚至还不如省赛班?","guid":"741729","author":"lanqiao8646038521","authorUrl":null,"authorAvatar":null,"publishedAt":"2024-11-19T07:38:01.460Z","media":null,"categories":null,"attachments":null,"extra":null,"language":null},{"title":"还能玩点什么呢?可以增加油猴脚本的扩展,让修改可以伪持久化","url":"https://www.lanqiao.cn/questions/741220/","content":"开发者工具的修改,在页面刷新时就被重置了。\\n油猴脚本可以让我们的修改本地持久化。
\\n","description":"开发者工具的修改,在页面刷新时就被重置了。 油猴脚本可以让我们的修改本地持久化。","guid":"741220","author":"普迦_今天天气很好","authorUrl":null,"authorAvatar":null,"publishedAt":"2024-11-18T13:32:59.671Z","media":null,"categories":null,"attachments":null,"extra":null,"language":null},{"title":"帮我看看错误","url":"https://www.lanqiao.cn/questions/738152/","content":"#include <bits/stdc++.h>\\nusing namespace std;
\\nconst int N = 1e5+5;\\ntypedef long long LL;
\\nLL a[N],b[N];\\nint n,k;\\nLL ans=0;
\\nint main(){\\ncin>>n>>k;\\nfor(int i=1;i<=n;i++){\\ncin>>a[N];\\nans+=a[i];\\n}
\\nfor(int i=1;i<=n;i++){\\ncin>>b[i];\\nb[i]-=a[i];\\n}\\nsort(b+1,b+1+n);
\\nfor(int i=1;i<=k;i++){\\nif(b[i]>0) ans+=b[i];\\nelse break;\\n}
\\ncout<<ans<<endl;\\nreturn 0;\\n}\\n我想请问一下为什么输出结果错误呢
\\n","description":"#include画圈的那两个地方真的看不懂,求解答qwq(那个rm,cp好像不加也能过)\\n
\\n
请问准备阶段echo测试后没有出现vulnerable是什么情况呢
\\n","description":"请问准备阶段echo测试后没有出现vulnerable是什么情况呢","guid":"736587","author":"LOU3783729715","authorUrl":null,"authorAvatar":null,"publishedAt":"2024-11-13T08:37:11.512Z","media":null,"categories":null,"attachments":null,"extra":null,"language":null},{"title":"发现一个小错误","url":"https://www.lanqiao.cn/questions/736489/","content":"下面这里应该是D\\n
如果是C的话报的错是:KeyboardInterrupt,如下图:\\n
看了一下题解请问一下大家这里N、A、B的三个范围不用设置吗?
\\n","description":"看了一下题解请问一下大家这里N、A、B的三个范围不用设置吗?","guid":"736471","author":"lanqiao5190901732","authorUrl":null,"authorAvatar":null,"publishedAt":"2024-11-13T05:42:49.212Z","media":null,"categories":null,"attachments":null,"extra":null,"language":null},{"title":"求助大佬,部分测试点未过","url":"https://www.lanqiao.cn/questions/735732/","content":"请问大佬们,小登为什么只能通过6个测试点啊,时间复杂度也不高啊\\n#include <bits/stdc++.h>\\nusing namespace std;\\nconst int N=1e5+7;\\nusing ll=long long;\\nll ans=0;\\nstruct node{\\nll a;\\nll b;\\nll c;\\n}s[N];\\nbool cmp(node &x,node &y)\\n{\\nif(x.a!=y.a)return x.a<y.a;\\nelse\\n{\\nreturn x.b<y.b;\\n}\\n}\\nint main()\\n{
\\nint x,n;cin>>x>>n;\\nll maxm=-1;\\nfor(int i=1;i<=n;i++)\\n{\\ncin>>s[i].a>>s[i].b>>s[i].c;\\nmaxm=max(maxm,s[i].b);\\n}\\nif(maxm<x)\\n{\\ncout<<\\"-1\\"<<endl;\\nreturn 0;\\n}\\nsort(s+1,s+n+1,cmp);\\nll date=0;\\nfor(int i=1;i<=n;i++)\\n{\\nif(s[i].b>date)\\n{\\nif(s[i].b<x)\\n{\\nans+=s[i].a*(min(s[i].b-date,s[i].c));\\ndate+=min(s[i].b-date,s[i].c);\\n}\\nelse\\n{\\nans+=s[i].a*min(x-date,s[i].c);\\ndate+=min(x-date,s[i].c);\\n}\\n}\\nelse if(s[i].b==date)\\n{\\nans+=s[i].a;\\ndate++;\\n}\\nif(date==x)\\n{\\ncout<<ans<<endl;\\nreturn 0;\\n}\\n}\\ncout<<\\"-1\\"<<endl;\\nreturn 0;\\n}
\\n","description":"请问大佬们,小登为什么只能通过6个测试点啊,时间复杂度也不高啊 #include感觉词根记忆的方法很赞,期待老师的分享~
\\n","description":"感觉词根记忆的方法很赞,期待老师的分享~","guid":"735722","author":"weitian_","authorUrl":null,"authorAvatar":null,"publishedAt":"2024-11-12T07:38:23.028Z","media":null,"categories":null,"attachments":null,"extra":null,"language":null},{"title":"请问这句代码到底要说明什么呢?","url":"https://www.lanqiao.cn/questions/735714/","content":"下面这段话,没太明白要表达什么意思,具体有什么用呢?\\n
#include <stdio.h>\\n#include <stdlib.h>
\\nint main(int argc, char *argv[])\\n{\\nint T;\\nscanf(\\"%d\\",&T);\\nfor(int i=0;i<T;i++){\\nint N,X;\\nscanf(\\"%d %d\\",&N,&X);\\ndouble sum=N/2.00;\\nif(X >= sum){\\nprintf(\\"yes\\\\n\\");\\n}\\nelse{\\nprintf(\\"no\\\\n\\");\\n}\\n}\\nreturn 0;\\n}
\\n","description":"#include答案是3228,但是我这段代码的输出结果是8870,还有哪里的限制条件没有考虑到吗。?
\\n#include <bits/stdc++.h>\\nusing namespace std;\\n//以下两函数计算笔画数 \\nint suanbihua(int m)\\n{\\nif(m = \'0\') return 13;\\nelse if(m = \'1\') return 1;\\nelse if(m = \'2\') return 2;\\nelse if(m = \'3\') return 3;\\nelse if(m = \'4\') return 5;\\nelse if(m = \'5\') return 4;\\nelse if(m = \'6\') return 4;\\nelse if(m = \'7\') return 2;\\nelse if(m = \'8\') return 2;\\nelse if(m = \'9\') return 2;\\n}\\nint bihuashu(int i)\\n{\\nint bh = 0;\\nstring s = to_string(i);\\nfor(int j=0;j<8;j++)\\n{\\nbh += suanbihua(s[j]);\\n}\\nreturn bh;\\n}\\n//以下函数判断日期是否正确 \\nbool ispy(int y)\\n{\\nif(y%4==0)return true; //由于年份仅在2000-2024,不需要写全闰年判断\\nreturn false;\\n}\\nbool isDay(int i)\\n{\\nint y = i/10000;\\ni -= y*10000;\\nint m = i/100;\\ni -= m*100;\\nint d = i;\\nif(m>12||m==0)return false;\\nif((m==1||m==3||m==5||m==7||m==8||m==10||m==12)&&(d>31||d==0))return false;\\nif((m==4||m==6||m==9||m==11)&&(d>30||d==0))return false;\\nif((m==2)&&ispy(y)&&(d>29||d==0))return false;\\nif((m==2)&&!ispy(y)&&(d>28||d==0))return false;\\nreturn true;\\n}\\n\\nint main()\\n{\\nint cnt = 0;\\nfor(int i=20000101;i<=20240413;i++)\\n{\\nif(isDay(i)&&(bihuashu(i)>50))cnt++;\\n}\\ncout << cnt << endl;\\nreturn 0;\\n}\\n
\\n感谢神犇解答!
\\n","description":"答案是3228,但是我这段代码的输出结果是8870,还有哪里的限制条件没有考虑到吗。? #include\\n这个压缩包里面没有vcredist_x86.exe
w = input()\\nd = {}\\nfor i in str(w):\\nif i in d:\\nd[i] += 1\\nelse:\\nd[i] = 1
\\nprint(max(d.values()))此处输入链接的描述
\\n","description":"w = input() d = {} for i in str(w): if i in d: d[i] += 1 else: d[i] = 1 print(max(d.values()))此处输入链接的描述","guid":"732482","author":"lanqiao4698007104","authorUrl":null,"authorAvatar":null,"publishedAt":"2024-11-07T14:30:36.372Z","media":null,"categories":null,"attachments":null,"extra":null,"language":null},{"title":"无声啊啊啊啊","url":"https://www.lanqiao.cn/questions/730777/","content":"为啥没有声音啊
\\n","description":"为啥没有声音啊","guid":"730777","author":"lanqiao6450339109","authorUrl":null,"authorAvatar":null,"publishedAt":"2024-11-05T12:35:38.285Z","media":null,"categories":null,"attachments":null,"extra":null,"language":null},{"title":"jzs11","url":"https://www.lanqiao.cn/questions/730252/","content":"TF 坐标转换\\n章节\\n步骤\\n报告\\n讨论\\n代码实现乌龟跟随效果\\n•首先初始化一个工作空间:\\nmkdir -p /home/shiyanlou/ws/src\\ncd /home/shiyanlou/ws
\\ncatkin_make\\ncopy\\n•进入 ws/src 目录下,执行如下命令创建名为 demopy 的 Package 以及包下面的 scripts 文件夹:\\ncd /home/shiyanlou/ws/src\\ncatkin_create_pkg demopy roscpp rospy rosmsg\\nmkdir /home/shiyanlou/ws/src/demopy/scripts\\ncopy\\n在 demopy/scripts 目录新建一个 turtle_b.py 文件,用来创建小乌龟 b,并赋予该文件可执行权限:\\nchmod +x /home/shiyanlou/ws/src/demopy/scripts/turtle_b.py\\ncopy\\n#! /usr/bin/env python
\\nimport rospy\\nfrom turtlesim.srv import Spawn,SpawnRequest,SpawnResponse\\nfrom math import radians
\\nif name == \'main\':\\n# 创建node\\nnode_name = \\"turtle_b_control_node\\"\\nrospy.init_node(node_name)\\nturtle_name = \'turtle_b_follow\'\\n# 创建一只小乌龟 设置姿态和名字\\nclient = rospy.ServiceProxy(\'/spawn\', Spawn)\\nrospy.wait_for_service(\'/spawn\')\\nrequest = SpawnRequest()\\nrequest.x = 1\\nrequest.y = 1\\nrequest.name = turtle_name\\n# 角度转弧度\\nrequest.theta = radians(90)\\nclient.call(request)\\nclient.close()\\nrospy.spin()\\ncopy\\n•创建 launch 文件。\\n在 src/demopy 目录下新建 launch 文件夹,并在该文件夹下新建 demo.launch 文件:\\nmkdir /home/shiyanlou/ws/src/demopy/launch\\ntouch /home/shiyanlou/ws/src/demopy/launch/demo.launch\\ncopy\\n之前我们一直说的是开启小乌龟节点,其实开启的是一个窗体节点,里面自带了一只系统的小乌龟。这个窗体节点可以显示多个小乌龟。\\n<launch>\\n<!--小乌龟窗体节点--\x3e\\n<node pkg=\\"turtlesim\\" type=\\"turtlesim_node\\" name=\\"turtle_window\\" output=\\"screen\\"></node>
\\n<!--第二只小乌龟b。pkg 是我们的包名,type 是我们刚创建的 py 文件--\x3e\\n<node pkg=\\"demopy\\" type=\\"turtle_b.py\\" name=\\"turtle_b\\" output=\\"screen\\"></node>\\n\\n<!--系统小乌龟的控制节点--\x3e\\n<node pkg=\\"turtlesim\\"\\n type=\\"turtle_teleop_key\\"\\n name=\\"turtle_control_a\\"\\n output=\\"screen\\"\\n></node>\\n
\\n</launch>\\ncopy\\n•编译运行:
\\nroscore\\ncd /home/shiyanlou/ws\\nsource devel/setup.zsh
\\nroslaunch demopy demo.launch\\ncopy
\\n•控制乌龟 B 并获取它的位姿\\n保持前面运行的端口不动,新开一个终端,通过命令查看当前窗体中两只小乌龟的节点信息,执行如下命令:\\nrosnode info /turtle_window\\ncopy
\\n之前我们做过下面的两个实验:\\n往 /turtle1/cmd_vel 的主题中去发布消息,控制系统小乌龟。\\n去 /turtle1/pose 主题中去订阅消息,获取系统小乌龟在界面坐标系中的位姿。\\n现在我们需要在 turtle_b.py 文件中创建一个发布者,往 /turtle_b_follow/cmd_vel 中发布消息,控制乌龟 B。在 turtleb.py 文件中创建一个订阅者,去 /turtle_b_follow/pose 主题中订阅消息,获取小乌龟 B 在界面坐标系中的位姿。\\n#! /usr/bin/env python
\\nimport rospy\\nfrom turtlesim.srv import Spawn,SpawnRequest,SpawnResponse\\nfrom math import radians\\nfrom geometry_msgs.msg import Twist\\nfrom turtlesim.msg import Pose
\\ndef pose_callback(msg):\\nif not isinstance(msg,Pose): return\\nprint msg\\nprint \'-------\'
\\nif name == \'main\':\\n# 创建 node\\nnode_name = \\"turtle_b_control_node\\"\\nrospy.init_node(node_name)\\nturtle_name = \'turtle_b_follow\'\\n# 创建一只小乌龟 b\\nclient = rospy.ServiceProxy(\'/spawn\', Spawn)\\nrospy.wait_for_service(\'/spawn\')\\nrequest = SpawnRequest()\\nrequest.x = 1\\nrequest.y = 1\\nrequest.name = turtle_name\\n# 角度转弧度\\nrequest.theta = radians(90)\\nclient.call(request)\\nclient.close()
\\n# 测试代码:控制小乌龟 b 进行移动\\npublisher = rospy.Publisher(\'/turtle_b_follow/cmd_vel\', Twist, queue_size=1000)\\n# 上面创建乌龟 b 需要一些时间,这里先睡眠一秒钟,再去发送消息\\nrospy.sleep(1)\\ntwist = Twist()\\n# 线速度为 2,角速度为 0\\ntwist.linear.x = 2\\ntwist.angular.z = radians(0)\\npublisher.publish(twist)\\n\\n# 获取小乌龟 B 在界面坐标系中的位姿。\\nrospy.Subscriber(\'/{}/pose\'.format(turtle_name), Pose, pose_callback)\\n\\nrospy.spin()\\n
\\ncopy\\n•重新运行:\\ncd /home/shiyanlou/ws\\nroslaunch demopy demo.launch\\ncopy
\\n•上面已经获取了小乌龟 B 在界面坐标的位姿,现在需要在 turtle_b.py 文件中创建一个广播者,把它们的关系发布给 TF 工具。
\\nbroadcaster = TransformBroadcaster()
\\nbroadcaster.sendTransform(translation,rotation,time,child,parent)\\ncopy\\n•translation:描述的是位置。\\n•rotation:描述的是姿态。姿态可以通过欧拉角、旋转矩阵、四元素的方式来描述,但真实操作的时候我们都会采用四元素的方式。\\n•time:时间戳。在某一个具体时间是什么位姿。\\n•child:子坐标系。比如小乌龟在界面坐标系中的位置是(2,3),那小乌龟就是子,界面坐标系是父。\\n•parent:父坐标系。\\n完整代码:\\n#! /usr/bin/env python
\\nimport rospy\\nfrom turtlesim.srv import Spawn,SpawnRequest,SpawnResponse\\nfrom math import radians\\nfrom geometry_msgs.msg import Twist\\nfrom turtlesim.msg import Pose\\nfrom tf.broadcaster import TransformBroadcaster\\nfrom tf.transformations import quaternion_from_euler
\\ndef pose_callback(msg):\\nif not isinstance(msg,Pose): return\\nprint msg\\nprint \'-------\'\\n# 展示的是一个2D图,Z轴固定就是0\\ntranslation =(msg.x, msg.y, 0)\\n# 姿态只是Z轴角度的变化,X,Y轴没变化,转成四元素的表达方式\\nrotation = quaternion_from_euler(0,0,msg.theta)\\n# 当前时间戳\\ntime = rospy.Time().now()\\nbroadcaster = TransformBroadcaster()\\n# turtle_b 就是我们定义的子坐标系 名字可以随意取\\n# world 就是我们定义的父坐标系 名字可以随意取\\nbroadcaster.sendTransform(translation,rotation,time,\'turtle_b_frame\',\'world\')
\\nif name == \'main\':\\n# 创建node\\nnode_name = \\"turtle_b_control_node\\"\\nrospy.init_node(node_name)\\nturtle_name = \'turtle_b_follow\'\\n# 创建一只小乌龟b\\nclient = rospy.ServiceProxy(\'/spawn\', Spawn)\\nrospy.wait_for_service(\'/spawn\')\\nrequest = SpawnRequest()\\nrequest.x = 1\\nrequest.y = 1\\nrequest.name = turtle_name\\n# 角度转弧度\\nrequest.theta = radians(90)\\nclient.call(request)\\nclient.close()
\\n# 测试代码 控制小乌龟b进行移动\\npublisher = rospy.Publisher(\'/turtle_b_follow/cmd_vel\', Twist, queue_size=1000)\\n# 上面创建乌龟b需要一些时间 这里先睡眠一秒钟 再去发送消息\\nrospy.sleep(1)\\ntwist = Twist()\\n# 线速度为2 角速度为0\\ntwist.linear.x = 2\\ntwist.angular.z = radians(0)\\npublisher.publish(twist)\\n\\n# 获取小乌龟b的位姿\\nrospy.Subscriber(\'/{}/pose\'.format(turtle_name), Pose, pose_callback)\\n\\nrospy.spin()\\n
\\ncopy\\n•重新运行:\\ncd /home/shiyanlou/ws\\nroslaunch demopy demo.launch\\ncopy
\\n保持前面运行的端口不动,新开一个终端,通过命令查看刚才定义的两个坐标系的关系,执行如下命令:\\nrosrun rqt_tf_tree rqt_tf_tree\\ncopy
\\nBroadcaster: /turtle_b 指的是我们在 launch 中定义的乌龟 B 的节点名称,word 和 turtle_b_frame 是我们定义的两个坐标系。此时 TF 工具已经收集到了乌龟 B 与界面坐标系的关系。\\n•获取乌龟 A 与界面坐标系的关系,发布给 TF 工具\\n在 demopy/scripts 目录新建一个 turtle_a.py 文件,用来控制系统小乌龟 A,并赋予该文件可执行权限:\\nchmod +x /home/shiyanlou/ws/src/demopy/scripts/turtle_a.py\\ncopy\\n因为系统自带了一只默认的乌龟 turtle1,我们把它叫做乌龟 A,所以不需要再创建一只新的。也不需要代码去控制移动,通过键盘就可以操控。只需要重新定义子坐标系的名字,把乌龟 A 与界面坐标系的关系发布出去。\\n#! /usr/bin/env python
\\nimport rospy\\nfrom turtlesim.srv import Spawn,SpawnRequest,SpawnResponse\\nfrom math import radians\\nfrom geometry_msgs.msg import Twist\\nfrom turtlesim.msg import Pose\\nfrom tf.broadcaster import TransformBroadcaster\\nfrom tf.transformations import quaternion_from_euler
\\ndef pose_callback(msg):\\nif not isinstance(msg,Pose): return\\nprint msg\\nprint \'-------\'\\n# 展示的是一个2D图,Z轴固定就是0\\ntranslation =(msg.x, msg.y, 0)\\n# 姿态只是Z轴角度的变化,X,Y轴没变化,转成四元素的表达方式\\nrotation = quaternion_from_euler(0,0,msg.theta)\\n# 当前时间戳\\ntime = rospy.Time().now()\\nbroadcaster = TransformBroadcaster()\\n# turtle_a_frame 就是我们定义的子坐标系 名字可以随意取\\n# world 就是我们定义的父坐标系 名字可以随意取\\nbroadcaster.sendTransform(translation,rotation,time,\'turtle_a_frame\',\'world\')
\\nif name == \'main\':\\n# 创建node\\nnode_name = \\"turtle_a_control_node\\"\\nrospy.init_node(node_name)\\n# 系统默认小乌龟的名称\\nturtle_name = \'turtle1\'
\\n# 获取小乌龟a的位姿\\nrospy.Subscriber(\'/{}/pose\'.format(turtle_name), Pose, pose_callback)\\n\\nrospy.spin()\\n
\\ncopy\\n•把刚创建的 turtle_a.py 添加到 demo.launch 文件\\n<launch>\\n<!--小乌龟窗体显示 --\x3e\\n<node pkg=\\"turtlesim\\"\\ntype=\\"turtlesim_node\\"\\nname=\\"turtle_window\\"\\noutput=\\"screen\\"\\n></node>
\\n<!--第一只小乌龟:pkg 是我们的包名,type 是我们刚创建的 py 文件--\x3e\\n<node pkg=\\"demopy\\"\\n type=\\"turtle_a.py\\"\\n name=\\"turtle_a\\"\\n output=\\"screen\\"\\n></node>\\n\\n<!--第二只小乌龟:pkg 是我们的包名,type 是我们刚创建的 py 文件--\x3e\\n<node pkg=\\"demopy\\"\\n type=\\"turtle_b.py\\"\\n name=\\"turtle_b\\"\\n output=\\"screen\\"\\n></node>\\n\\n<!--系统的小乌龟控制--\x3e\\n<node pkg=\\"turtlesim\\"\\n type=\\"turtle_teleop_key\\"\\n name=\\"turtle_control_a\\"\\n output=\\"screen\\"\\n></node>\\n
\\n</launch>\\ncopy\\n•重新运行:\\ncd /home/shiyanlou/ws\\nroslaunch demopy demo.launch\\ncopy
\\n保持前面运行的端口不动,新开一个终端,通过命令查看坐标系间的关系。\\nrosrun rqt_tf_tree rqt_tf_tree\\ncopy
\\n图中可以看到,TF 工具也已经收集到了乌龟 A 与界面坐标系的关系。此时界面坐标和小乌龟 A 有了关系,界面坐标和小乌龟 B 也有了关系,我们就可以通过 Listener 把小乌龟 A 和小乌龟 B 的坐标系关系获取出来,然后通过计算后告知乌龟 B 该如何移动。
\\n•在 turtle_b.py 文件中添加坐标关系的收听者(把控制小乌龟 b 移动的伪代码去掉)。
\\nlistener = TransformListener()
\\ntransform = listener.lookupTransform(target_frame, source_frame,time)\\ncopy\\n传入的参数:\\n•target_frame:目标坐标系,理解成父坐标系。\\n•source_frame:源坐标系,理解成子坐标系。\\n•time:距当前最近的时间。\\n函数返回值:\\n两个坐标系间的位置信息 [t.x, t.y, t.z],两个坐标系间的姿态四元素 [r.x, r.y, r.z, r.w]。\\n完整代码:\\n#! /usr/bin/env python
\\nimport rospy\\nfrom turtlesim.srv import Spawn,SpawnRequest,SpawnResponse\\nfrom math import radians\\nfrom geometry_msgs.msg import Twist\\nfrom turtlesim.msg import Pose\\nfrom tf.broadcaster import TransformBroadcaster\\nfrom tf.transformations import quaternion_from_euler\\nfrom tf.listener import TransformListener
\\ndef pose_callback(msg):\\nif not isinstance(msg,Pose): return\\n# print msg\\n# print \'-------\'\\n# 展示的是一个2D图,Z轴固定就是0\\ntranslation =(msg.x, msg.y, 0)\\n# 姿态只是Z轴角度的变化,X,Y轴没变化,转成四元素的表达方式\\nrotation = quaternion_from_euler(0,0,msg.theta)\\n# 当前时间戳\\ntime = rospy.Time().now()\\nbroadcaster = TransformBroadcaster()\\n# turtle_b_frame 就是我们定义的子坐标系 名字可以随意取\\n# world 就是我们定义的父坐标系 名字可以随意取\\nbroadcaster.sendTransform(translation,rotation,time,\'turtle_b_frame\',\'world\')
\\nif name == \'main\':\\n# 创建node\\nnode_name = \\"turtle_b_control_node\\"\\nrospy.init_node(node_name)\\nturtle_name = \'turtle_b_follow\'\\n# 创建一只小乌龟b\\nclient = rospy.ServiceProxy(\'/spawn\', Spawn)\\nrospy.wait_for_service(\'/spawn\')\\nrequest = SpawnRequest()\\nrequest.x = 1\\nrequest.y = 1\\nrequest.name = turtle_name\\n# 角度转弧度\\nrequest.theta = radians(90)\\nclient.call(request)\\nclient.close()
\\n# 测试代码 控制小乌龟b进行移动\\npublisher = rospy.Publisher(\'/turtle_b_follow/cmd_vel\', Twist, queue_size=1000)\\n\\n# 获取小乌龟b的位姿\\nrospy.Subscriber(\'/{}/pose\'.format(turtle_name), Pose, pose_callback)\\n\\nlistener = TransformListener()\\nrate = rospy.Rate(10)\\n# 循环去从TF中获取坐标关系。\\nwhile not rospy.is_shutdown():\\n # 捕获下异常,因存在时间差,可能TF还没收到发送过去的关系数据,这边就去取,导致两个坐标系的关系构建失败。\\n try:\\n # 这里求解的是子坐标系乌龟A,在父坐标系乌龟B中,它的坐标是如何描述的,并把坐标打印出来。\\n transform = listener.lookupTransform(\'turtle_b_frame\', \'turtle_a_frame\', rospy.Time())\\n print transform\\n except Exception as e:\\n print e\\n rate.sleep()\\n
\\ncopy\\n我们可以这样理解,因为乌龟 B 要追着乌龟 A 跑,我们就以乌龟 B 为父坐标系(轴心),时时获取乌龟 A 的位置,然后通过计算得出线速度和角速度,完成跟随乌龟 A 的操作。
\\nprint msg\\nprint \'-------\'\\ncopy\\n•重新运行:\\ncd /home/shiyanlou/ws\\nroslaunch demopy demo.launch\\ncopy
\\n乌龟 B 为父坐标系,此时坐标轴是以乌龟 B 为轴心,以小乌龟 B 头的朝向为 X 轴,乌龟 A 在乌龟 B 的坐标系中的坐标是[4.5,-4.5]。\\n•根据上面求出的位置关系,计算出乌龟 B 的跟随路线\\n乌龟 A 和乌龟 B 的线性距离,其实就是三角形的边长。乌龟 B 想要跟在乌龟 A 后面,需要旋转一个弧度,根据三角函数可以得知,这个弧度值就是 Y 坐标除以 X 坐标。代码中循环的频率是每秒十次,单位时间片也就是 0.1。有了这些数据我们就可以随着乌龟 A 的移动而跟着移动。\\n•在 turtle_b.py 文件中进行计算,控制小乌龟 b 进行移动\\n#! /usr/bin/env python
\\nimport rospy\\nfrom turtlesim.srv import Spawn,SpawnRequest,SpawnResponse\\nfrom math import radians, sqrt, atan2\\nfrom geometry_msgs.msg import Twist\\nfrom turtlesim.msg import Pose\\nfrom tf.broadcaster import TransformBroadcaster\\nfrom tf.transformations import quaternion_from_euler\\nfrom tf.listener import TransformListener
\\ndef pose_callback(msg):\\nif not isinstance(msg,Pose): return\\n# print msg\\n# print \'-------\'\\n# 展示的是一个2D图,Z轴固定就是0\\ntranslation =(msg.x, msg.y, 0)\\n# 姿态只是Z轴角度的变化,X,Y轴没变化,转成四元素的表达方式\\nrotation = quaternion_from_euler(0,0,msg.theta)\\n# 当前时间戳\\ntime = rospy.Time().now()\\nbroadcaster = TransformBroadcaster()\\n# turtle_b_frame 就是我们定义的子坐标系 名字可以随意取\\n# world 就是我们定义的父坐标系 名字可以随意取\\nbroadcaster.sendTransform(translation,rotation,time,\'turtle_b_frame\',\'world\')
\\nif name == \'main\':\\n# 创建node\\nnode_name = \\"turtle_b_control_node\\"\\nrospy.init_node(node_name)\\nturtle_name = \'turtle_b_follow\'\\n# 创建一只小乌龟b\\nclient = rospy.ServiceProxy(\'/spawn\', Spawn)\\nrospy.wait_for_service(\'/spawn\')\\nrequest = SpawnRequest()\\nrequest.x = 1\\nrequest.y = 1\\nrequest.name = turtle_name\\n# 角度转弧度\\nrequest.theta = radians(90)\\nclient.call(request)\\nclient.close()
\\n# 测试代码 控制小乌龟b进行移动\\npublisher = rospy.Publisher(\'/turtle_b_follow/cmd_vel\', Twist, queue_size=1000)\\n\\n# 获取小乌龟b的位姿\\nrospy.Subscriber(\'/{}/pose\'.format(turtle_name), Pose, pose_callback)\\n\\nlistener = TransformListener()\\nrate = rospy.Rate(10)\\n# 循环去从TF中获取坐标关系。\\nwhile not rospy.is_shutdown():\\n # 捕获下异常,因存在时间差,可能TF还没收到发送过去的关系数据,这边就去取,导致两个坐标系的关系构建失败。\\n try:\\n # 这里求解的是子坐标系乌龟A,在父坐标系乌龟B中,它的坐标是如何描述的,并把坐标打印出来。\\n transform = listener.lookupTransform(\'turtle_b_frame\', \'turtle_a_frame\', rospy.Time())\\n print transform\\n # 接收位置参数\\n x, y, z = transform[0]\\n # 乌龟A和乌龟B的线性距离 = 三角形求边长\\n distance = sqrt(x ** 2 + y ** 2)\\n # 转动的弧度值\\n angular = atan2(y, x)\\n twist = Twist()\\n # 线速度= 距离 / 时间\\n twist.linear.x = distance / 0.1\\n # 角速度= 弧度值 / 时间\\n twist.angular.z = angular / 0.1\\n publisher.publish(twist)\\n except Exception as e:\\n print e\\n rate.sleep()\\n
\\ncopy\\n•重新运行:\\ncd /home/shiyanlou/ws\\nroslaunch demopy demo.launch\\ncopy
\\n运行后发现乌龟 B 速度太快了,我们需要进行 PID 控制器的参数调整(KP KI KD)。通常这种位置操作过程中首先是解决 KP 的操作。(不会用到 KI,KI 属于历史累加数据,是为了做正负抵消,这里的距离是开根号出来的不会有负数。)\\ntwist.linear.x = kp * distance / 0.1 = kp / 0.1 * distance ,我们把 kp / 0.1 整体可以看成是 kp 系数,也就是 twist.linear.x = kp * distance。同理,角速度也可以转换成 twist.angular.z = kp * angular。\\n我们可以自己测试一些 kp 值,看下效果。\\n•完整代码\\n#! /usr/bin/env python
\\nimport rospy\\nfrom turtlesim.srv import Spawn,SpawnRequest,SpawnResponse\\nfrom math import radians, sqrt, atan2\\nfrom geometry_msgs.msg import Twist\\nfrom turtlesim.msg import Pose\\nfrom tf.broadcaster import TransformBroadcaster\\nfrom tf.transformations import quaternion_from_euler\\nfrom tf.listener import TransformListener
\\ndef pose_callback(msg):\\nif not isinstance(msg,Pose): return\\n# print msg\\n# print \'-------\'\\n# 展示的是一个2D图,Z轴固定就是0\\ntranslation =(msg.x, msg.y, 0)\\n# 姿态只是Z轴角度的变化,X,Y轴没变化,转成四元素的表达方式\\nrotation = quaternion_from_euler(0,0,msg.theta)\\n# 当前时间戳\\ntime = rospy.Time().now()\\nbroadcaster = TransformBroadcaster()\\n# turtle_b_frame 就是我们定义的子坐标系 名字可以随意取\\n# world 就是我们定义的父坐标系 名字可以随意取\\nbroadcaster.sendTransform(translation,rotation,time,\'turtle_b_frame\',\'world\')
\\nif name == \'main\':\\n# 创建node\\nnode_name = \\"turtle_b_control_node\\"\\nrospy.init_node(node_name)\\nturtle_name = \'turtle_b_follow\'\\n# 创建一只小乌龟b\\nclient = rospy.ServiceProxy(\'/spawn\', Spawn)\\nrospy.wait_for_service(\'/spawn\')\\nrequest = SpawnRequest()\\nrequest.x = 1\\nrequest.y = 1\\nrequest.name = turtle_name\\n# 角度转弧度\\nrequest.theta = radians(90)\\nclient.call(request)\\nclient.close()
\\n# 测试代码 控制小乌龟b进行移动\\npublisher = rospy.Publisher(\'/turtle_b_follow/cmd_vel\', Twist, queue_size=1000)\\n\\n# 获取小乌龟b的位姿\\nrospy.Subscriber(\'/{}/pose\'.format(turtle_name), Pose, pose_callback)\\n\\nlistener = TransformListener()\\nrate = rospy.Rate(10)\\n# 循环去从TF中获取坐标关系。\\nwhile not rospy.is_shutdown():\\n # 捕获下异常,因存在时间差,可能TF还没收到发送过去的关系数据,这边就去取,导致两个坐标系的关系构建失败。\\n try:\\n # 这里求解的是子坐标系乌龟A,在父坐标系乌龟B中,它的坐标是如何描述的,并把坐标打印出来。\\n transform = listener.lookupTransform(\'turtle_b_frame\', \'turtle_a_frame\', rospy.Time())\\n print transform\\n # 接收位置参数\\n x, y, z = transform[0]\\n # 乌龟A和乌龟B的线性距离 = 三角形求边长\\n distance = sqrt(x ** 2 + y ** 2)\\n # 转动的弧度值\\n angular = atan2(y, x)\\n twist = Twist()\\n # 线速度= 距离 / 时间,添加kp系数\\n twist.linear.x = 1.0 * distance\\n # 角速度= 弧度值 / 时间,添加kp系数\\n twist.angular.z = 3.0 * angular\\n publisher.publish(twist)\\n except Exception as e:\\n print e\\n rate.sleep()\\n
\\ncopy\\n下一步\\n点击下方环境窗口,开启实战\\n剩余实验次数: 3\\n默认环境
\\n保存的环境1
\\n保存于《ROS 机器人操作系统初级教程-编写简单的消息发布器和订阅器 (C++)》\\n(有效期剩余19天)\\n删除 >\\n注意:不同课程要求的实验环境不同,您保存的环境不一定适配当前课程
\\n","description":"TF 坐标转换 章节 步骤 报告 讨论 代码实现乌龟跟随效果 •首先初始化一个工作空间: mkdir -p /home/shiyanlou/ws/src cd /home/shiyanlou/ws catkin_make copy •进入 ws/src 目录下,执行如下命令创建名为 demopy 的 Package 以及包下面的 scripts 文件夹: cd /home/shiyanlou/ws/src catkin_create_pkg demopy roscpp rospy rosmsg mkdir /home/shiyanlou/ws/src…","guid":"730252","author":"qwq","authorUrl":null,"authorAvatar":null,"publishedAt":"2024-11-05T01:17:48.463Z","media":null,"categories":null,"attachments":null,"extra":null,"language":null},{"title":"pjx33","url":"https://www.lanqiao.cn/questions/730251/","content":"TF 坐标转换\\n章节\\n步骤\\n报告\\n讨论\\n代码实现乌龟跟随效果\\n•首先初始化一个工作空间:\\nmkdir -p /home/shiyanlou/ws/src\\ncd /home/shiyanlou/ws
\\ncatkin_make\\ncopy\\n•进入 ws/src 目录下,执行如下命令创建名为 demopy 的 Package 以及包下面的 scripts 文件夹:\\ncd /home/shiyanlou/ws/src\\ncatkin_create_pkg demopy roscpp rospy rosmsg\\nmkdir /home/shiyanlou/ws/src/demopy/scripts\\ncopy\\n在 demopy/scripts 目录新建一个 turtle_b.py 文件,用来创建小乌龟 b,并赋予该文件可执行权限:\\nchmod +x /home/shiyanlou/ws/src/demopy/scripts/turtle_b.py\\ncopy\\n#! /usr/bin/env python
\\nimport rospy\\nfrom turtlesim.srv import Spawn,SpawnRequest,SpawnResponse\\nfrom math import radians
\\nif name == \'main\':\\n# 创建node\\nnode_name = \\"turtle_b_control_node\\"\\nrospy.init_node(node_name)\\nturtle_name = \'turtle_b_follow\'\\n# 创建一只小乌龟 设置姿态和名字\\nclient = rospy.ServiceProxy(\'/spawn\', Spawn)\\nrospy.wait_for_service(\'/spawn\')\\nrequest = SpawnRequest()\\nrequest.x = 1\\nrequest.y = 1\\nrequest.name = turtle_name\\n# 角度转弧度\\nrequest.theta = radians(90)\\nclient.call(request)\\nclient.close()\\nrospy.spin()\\ncopy\\n•创建 launch 文件。\\n在 src/demopy 目录下新建 launch 文件夹,并在该文件夹下新建 demo.launch 文件:\\nmkdir /home/shiyanlou/ws/src/demopy/launch\\ntouch /home/shiyanlou/ws/src/demopy/launch/demo.launch\\ncopy\\n之前我们一直说的是开启小乌龟节点,其实开启的是一个窗体节点,里面自带了一只系统的小乌龟。这个窗体节点可以显示多个小乌龟。\\n<launch>\\n<!--小乌龟窗体节点--\x3e\\n<node pkg=\\"turtlesim\\" type=\\"turtlesim_node\\" name=\\"turtle_window\\" output=\\"screen\\"></node>
\\n<!--第二只小乌龟b。pkg 是我们的包名,type 是我们刚创建的 py 文件--\x3e\\n<node pkg=\\"demopy\\" type=\\"turtle_b.py\\" name=\\"turtle_b\\" output=\\"screen\\"></node>\\n\\n<!--系统小乌龟的控制节点--\x3e\\n<node pkg=\\"turtlesim\\"\\n type=\\"turtle_teleop_key\\"\\n name=\\"turtle_control_a\\"\\n output=\\"screen\\"\\n></node>\\n
\\n</launch>\\ncopy\\n•编译运行:
\\nroscore\\ncd /home/shiyanlou/ws\\nsource devel/setup.zsh
\\nroslaunch demopy demo.launch\\ncopy
\\n","description":"TF 坐标转换 章节 步骤 报告 讨论 代码实现乌龟跟随效果 •首先初始化一个工作空间: mkdir -p /home/shiyanlou/ws/src cd /home/shiyanlou/ws catkin_make copy •进入 ws/src 目录下,执行如下命令创建名为 demopy 的 Package 以及包下面的 scripts 文件夹: cd /home/shiyanlou/ws/src catkin_create_pkg demopy roscpp rospy rosmsg mkdir /home/shiyanlou/ws/src…","guid":"730251","author":"lanqiao33","authorUrl":null,"authorAvatar":null,"publishedAt":"2024-11-05T01:17:03.825Z","media":null,"categories":null,"attachments":null,"extra":null,"language":null},{"title":"dffff","url":"https://www.lanqiao.cn/questions/730250/","content":"TF 坐标转换\\n章节\\n步骤\\n报告\\n讨论\\n代码实现乌龟跟随效果\\n•首先初始化一个工作空间:\\nmkdir -p /home/shiyanlou/ws/src\\ncd /home/shiyanlou/ws
\\ncatkin_make\\ncopy\\n•进入 ws/src 目录下,执行如下命令创建名为 demopy 的 Package 以及包下面的 scripts 文件夹:\\ncd /home/shiyanlou/ws/src\\ncatkin_create_pkg demopy roscpp rospy rosmsg\\nmkdir /home/shiyanlou/ws/src/demopy/scripts\\ncopy\\n在 demopy/scripts 目录新建一个 turtle_b.py 文件,用来创建小乌龟 b,并赋予该文件可执行权限:\\nchmod +x /home/shiyanlou/ws/src/demopy/scripts/turtle_b.py\\ncopy\\n#! /usr/bin/env python
\\nimport rospy\\nfrom turtlesim.srv import Spawn,SpawnRequest,SpawnResponse\\nfrom math import radians
\\nif name == \'main\':\\n# 创建node\\nnode_name = \\"turtle_b_control_node\\"\\nrospy.init_node(node_name)\\nturtle_name = \'turtle_b_follow\'\\n# 创建一只小乌龟 设置姿态和名字\\nclient = rospy.ServiceProxy(\'/spawn\', Spawn)\\nrospy.wait_for_service(\'/spawn\')\\nrequest = SpawnRequest()\\nrequest.x = 1\\nrequest.y = 1\\nrequest.name = turtle_name\\n# 角度转弧度\\nrequest.theta = radians(90)\\nclient.call(request)\\nclient.close()\\nrospy.spin()\\ncopy\\n•创建 launch 文件。\\n在 src/demopy 目录下新建 launch 文件夹,并在该文件夹下新建 demo.launch 文件:\\nmkdir /home/shiyanlou/ws/src/demopy/launch\\ntouch /home/shiyanlou/ws/src/demopy/launch/demo.launch\\ncopy\\n之前我们一直说的是开启小乌龟节点,其实开启的是一个窗体节点,里面自带了一只系统的小乌龟。这个窗体节点可以显示多个小乌龟。\\n<launch>\\n<!--小乌龟窗体节点--\x3e\\n<node pkg=\\"turtlesim\\" type=\\"turtlesim_node\\" name=\\"turtle_window\\" output=\\"screen\\"></node>
\\n<!--第二只小乌龟b。pkg 是我们的包名,type 是我们刚创建的 py 文件--\x3e\\n<node pkg=\\"demopy\\" type=\\"turtle_b.py\\" name=\\"turtle_b\\" output=\\"screen\\"></node>\\n\\n<!--系统小乌龟的控制节点--\x3e\\n<node pkg=\\"turtlesim\\"\\n type=\\"turtle_teleop_key\\"\\n name=\\"turtle_control_a\\"\\n output=\\"screen\\"\\n></node>\\n
\\n</launch>\\ncopy\\n•编译运行:
\\nroscore\\ncd /home/shiyanlou/ws\\nsource devel/setup.zsh
\\nroslaunch demopy demo.launch\\ncopy
\\n•控制乌龟 B 并获取它的位姿\\n保持前面运行的端口不动,新开一个终端,通过命令查看当前窗体中两只小乌龟的节点信息,执行如下命令:\\nrosnode info /turtle_window\\ncopy
\\n之前我们做过下面的两个实验:\\n往 /turtle1/cmd_vel 的主题中去发布消息,控制系统小乌龟。\\n去 /turtle1/pose 主题中去订阅消息,获取系统小乌龟在界面坐标系中的位姿。\\n现在我们需要在 turtle_b.py 文件中创建一个发布者,往 /turtle_b_follow/cmd_vel 中发布消息,控制乌龟 B。在 turtleb.py 文件中创建一个订阅者,去 /turtle_b_follow/pose 主题中订阅消息,获取小乌龟 B 在界面坐标系中的位姿。\\n#! /usr/bin/env python
\\nimport rospy\\nfrom turtlesim.srv import Spawn,SpawnRequest,SpawnResponse\\nfrom math import radians\\nfrom geometry_msgs.msg import Twist\\nfrom turtlesim.msg import Pose
\\ndef pose_callback(msg):\\nif not isinstance(msg,Pose): return\\nprint msg\\nprint \'-------\'
\\nif name == \'main\':\\n# 创建 node\\nnode_name = \\"turtle_b_control_node\\"\\nrospy.init_node(node_name)\\nturtle_name = \'turtle_b_follow\'\\n# 创建一只小乌龟 b\\nclient = rospy.ServiceProxy(\'/spawn\', Spawn)\\nrospy.wait_for_service(\'/spawn\')\\nrequest = SpawnRequest()\\nrequest.x = 1\\nrequest.y = 1\\nrequest.name = turtle_name\\n# 角度转弧度\\nrequest.theta = radians(90)\\nclient.call(request)\\nclient.close()
\\n# 测试代码:控制小乌龟 b 进行移动\\npublisher = rospy.Publisher(\'/turtle_b_follow/cmd_vel\', Twist, queue_size=1000)\\n# 上面创建乌龟 b 需要一些时间,这里先睡眠一秒钟,再去发送消息\\nrospy.sleep(1)\\ntwist = Twist()\\n# 线速度为 2,角速度为 0\\ntwist.linear.x = 2\\ntwist.angular.z = radians(0)\\npublisher.publish(twist)\\n\\n# 获取小乌龟 B 在界面坐标系中的位姿。\\nrospy.Subscriber(\'/{}/pose\'.format(turtle_name), Pose, pose_callback)\\n\\nrospy.spin()\\n
\\ncopy\\n•重新运行:\\ncd /home/shiyanlou/ws\\nroslaunch demopy demo.launch\\ncopy
\\n•上面已经获取了小乌龟 B 在界面坐标的位姿,现在需要在 turtle_b.py 文件中创建一个广播者,把它们的关系发布给 TF 工具。
\\nbroadcaster = TransformBroadcaster()
\\nbroadcaster.sendTransform(translation,rotation,time,child,parent)\\ncopy\\n•translation:描述的是位置。\\n•rotation:描述的是姿态。姿态可以通过欧拉角、旋转矩阵、四元素的方式来描述,但真实操作的时候我们都会采用四元素的方式。\\n•time:时间戳。在某一个具体时间是什么位姿。\\n•child:子坐标系。比如小乌龟在界面坐标系中的位置是(2,3),那小乌龟就是子,界面坐标系是父。\\n•parent:父坐标系。\\n完整代码:\\n#! /usr/bin/env python
\\nimport rospy\\nfrom turtlesim.srv import Spawn,SpawnRequest,SpawnResponse\\nfrom math import radians\\nfrom geometry_msgs.msg import Twist\\nfrom turtlesim.msg import Pose\\nfrom tf.broadcaster import TransformBroadcaster\\nfrom tf.transformations import quaternion_from_euler
\\ndef pose_callback(msg):\\nif not isinstance(msg,Pose): return\\nprint msg\\nprint \'-------\'\\n# 展示的是一个2D图,Z轴固定就是0\\ntranslation =(msg.x, msg.y, 0)\\n# 姿态只是Z轴角度的变化,X,Y轴没变化,转成四元素的表达方式\\nrotation = quaternion_from_euler(0,0,msg.theta)\\n# 当前时间戳\\ntime = rospy.Time().now()\\nbroadcaster = TransformBroadcaster()\\n# turtle_b 就是我们定义的子坐标系 名字可以随意取\\n# world 就是我们定义的父坐标系 名字可以随意取\\nbroadcaster.sendTransform(translation,rotation,time,\'turtle_b_frame\',\'world\')
\\nif name == \'main\':\\n# 创建node\\nnode_name = \\"turtle_b_control_node\\"\\nrospy.init_node(node_name)\\nturtle_name = \'turtle_b_follow\'\\n# 创建一只小乌龟b\\nclient = rospy.ServiceProxy(\'/spawn\', Spawn)\\nrospy.wait_for_service(\'/spawn\')\\nrequest = SpawnRequest()\\nrequest.x = 1\\nrequest.y = 1\\nrequest.name = turtle_name\\n# 角度转弧度\\nrequest.theta = radians(90)\\nclient.call(request)\\nclient.close()
\\n# 测试代码 控制小乌龟b进行移动\\npublisher = rospy.Publisher(\'/turtle_b_follow/cmd_vel\', Twist, queue_size=1000)\\n# 上面创建乌龟b需要一些时间 这里先睡眠一秒钟 再去发送消息\\nrospy.sleep(1)\\ntwist = Twist()\\n# 线速度为2 角速度为0\\ntwist.linear.x = 2\\ntwist.angular.z = radians(0)\\npublisher.publish(twist)\\n\\n# 获取小乌龟b的位姿\\nrospy.Subscriber(\'/{}/pose\'.format(turtle_name), Pose, pose_callback)\\n\\nrospy.spin()\\n
\\ncopy\\n•重新运行:\\ncd /home/shiyanlou/ws\\nroslaunch demopy demo.launch\\ncopy
\\n保持前面运行的端口不动,新开一个终端,通过命令查看刚才定义的两个坐标系的关系,执行如下命令:\\nrosrun rqt_tf_tree rqt_tf_tree\\ncopy
\\nBroadcaster: /turtle_b 指的是我们在 launch 中定义的乌龟 B 的节点名称,word 和 turtle_b_frame 是我们定义的两个坐标系。此时 TF 工具已经收集到了乌龟 B 与界面坐标系的关系。\\n•获取乌龟 A 与界面坐标系的关系,发布给 TF 工具\\n在 demopy/scripts 目录新建一个 turtle_a.py 文件,用来控制系统小乌龟 A,并赋予该文件可执行权限:\\nchmod +x /home/shiyanlou/ws/src/demopy/scripts/turtle_a.py\\ncopy\\n因为系统自带了一只默认的乌龟 turtle1,我们把它叫做乌龟 A,所以不需要再创建一只新的。也不需要代码去控制移动,通过键盘就可以操控。只需要重新定义子坐标系的名字,把乌龟 A 与界面坐标系的关系发布出去。\\n#! /usr/bin/env python
\\nimport rospy\\nfrom turtlesim.srv import Spawn,SpawnRequest,SpawnResponse\\nfrom math import radians\\nfrom geometry_msgs.msg import Twist\\nfrom turtlesim.msg import Pose\\nfrom tf.broadcaster import TransformBroadcaster\\nfrom tf.transformations import quaternion_from_euler
\\ndef pose_callback(msg):\\nif not isinstance(msg,Pose): return\\nprint msg\\nprint \'-------\'\\n# 展示的是一个2D图,Z轴固定就是0\\ntranslation =(msg.x, msg.y, 0)\\n# 姿态只是Z轴角度的变化,X,Y轴没变化,转成四元素的表达方式\\nrotation = quaternion_from_euler(0,0,msg.theta)\\n# 当前时间戳\\ntime = rospy.Time().now()\\nbroadcaster = TransformBroadcaster()\\n# turtle_a_frame 就是我们定义的子坐标系 名字可以随意取\\n# world 就是我们定义的父坐标系 名字可以随意取\\nbroadcaster.sendTransform(translation,rotation,time,\'turtle_a_frame\',\'world\')
\\nif name == \'main\':\\n# 创建node\\nnode_name = \\"turtle_a_control_node\\"\\nrospy.init_node(node_name)\\n# 系统默认小乌龟的名称\\nturtle_name = \'turtle1\'
\\n# 获取小乌龟a的位姿\\nrospy.Subscriber(\'/{}/pose\'.format(turtle_name), Pose, pose_callback)\\n\\nrospy.spin()\\n
\\ncopy\\n•把刚创建的 turtle_a.py 添加到 demo.launch 文件\\n<launch>\\n<!--小乌龟窗体显示 --\x3e\\n<node pkg=\\"turtlesim\\"\\ntype=\\"turtlesim_node\\"\\nname=\\"turtle_window\\"\\noutput=\\"screen\\"\\n></node>
\\n<!--第一只小乌龟:pkg 是我们的包名,type 是我们刚创建的 py 文件--\x3e\\n<node pkg=\\"demopy\\"\\n type=\\"turtle_a.py\\"\\n name=\\"turtle_a\\"\\n output=\\"screen\\"\\n></node>\\n\\n<!--第二只小乌龟:pkg 是我们的包名,type 是我们刚创建的 py 文件--\x3e\\n<node pkg=\\"demopy\\"\\n type=\\"turtle_b.py\\"\\n name=\\"turtle_b\\"\\n output=\\"screen\\"\\n></node>\\n\\n<!--系统的小乌龟控制--\x3e\\n<node pkg=\\"turtlesim\\"\\n type=\\"turtle_teleop_key\\"\\n name=\\"turtle_control_a\\"\\n output=\\"screen\\"\\n></node>\\n
\\n</launch>\\ncopy\\n•重新运行:\\ncd /home/shiyanlou/ws\\nroslaunch demopy demo.launch\\ncopy
\\n保持前面运行的端口不动,新开一个终端,通过命令查看坐标系间的关系。\\nrosrun rqt_tf_tree rqt_tf_tree\\ncopy
\\n图中可以看到,TF 工具也已经收集到了乌龟 A 与界面坐标系的关系。此时界面坐标和小乌龟 A 有了关系,界面坐标和小乌龟 B 也有了关系,我们就可以通过 Listener 把小乌龟 A 和小乌龟 B 的坐标系关系获取出来,然后通过计算后告知乌龟 B 该如何移动。
\\n•在 turtle_b.py 文件中添加坐标关系的收听者(把控制小乌龟 b 移动的伪代码去掉)。
\\nlistener = TransformListener()
\\ntransform = listener.lookupTransform(target_frame, source_frame,time)\\ncopy\\n传入的参数:\\n•target_frame:目标坐标系,理解成父坐标系。\\n•source_frame:源坐标系,理解成子坐标系。\\n•time:距当前最近的时间。\\n函数返回值:\\n两个坐标系间的位置信息 [t.x, t.y, t.z],两个坐标系间的姿态四元素 [r.x, r.y, r.z, r.w]。\\n完整代码:\\n#! /usr/bin/env python
\\nimport rospy\\nfrom turtlesim.srv import Spawn,SpawnRequest,SpawnResponse\\nfrom math import radians\\nfrom geometry_msgs.msg import Twist\\nfrom turtlesim.msg import Pose\\nfrom tf.broadcaster import TransformBroadcaster\\nfrom tf.transformations import quaternion_from_euler\\nfrom tf.listener import TransformListener
\\ndef pose_callback(msg):\\nif not isinstance(msg,Pose): return\\n# print msg\\n# print \'-------\'\\n# 展示的是一个2D图,Z轴固定就是0\\ntranslation =(msg.x, msg.y, 0)\\n# 姿态只是Z轴角度的变化,X,Y轴没变化,转成四元素的表达方式\\nrotation = quaternion_from_euler(0,0,msg.theta)\\n# 当前时间戳\\ntime = rospy.Time().now()\\nbroadcaster = TransformBroadcaster()\\n# turtle_b_frame 就是我们定义的子坐标系 名字可以随意取\\n# world 就是我们定义的父坐标系 名字可以随意取\\nbroadcaster.sendTransform(translation,rotation,time,\'turtle_b_frame\',\'world\')
\\nif name == \'main\':\\n# 创建node\\nnode_name = \\"turtle_b_control_node\\"\\nrospy.init_node(node_name)\\nturtle_name = \'turtle_b_follow\'\\n# 创建一只小乌龟b\\nclient = rospy.ServiceProxy(\'/spawn\', Spawn)\\nrospy.wait_for_service(\'/spawn\')\\nrequest = SpawnRequest()\\nrequest.x = 1\\nrequest.y = 1\\nrequest.name = turtle_name\\n# 角度转弧度\\nrequest.theta = radians(90)\\nclient.call(request)\\nclient.close()
\\n# 测试代码 控制小乌龟b进行移动\\npublisher = rospy.Publisher(\'/turtle_b_follow/cmd_vel\', Twist, queue_size=1000)\\n\\n# 获取小乌龟b的位姿\\nrospy.Subscriber(\'/{}/pose\'.format(turtle_name), Pose, pose_callback)\\n\\nlistener = TransformListener()\\nrate = rospy.Rate(10)\\n# 循环去从TF中获取坐标关系。\\nwhile not rospy.is_shutdown():\\n # 捕获下异常,因存在时间差,可能TF还没收到发送过去的关系数据,这边就去取,导致两个坐标系的关系构建失败。\\n try:\\n # 这里求解的是子坐标系乌龟A,在父坐标系乌龟B中,它的坐标是如何描述的,并把坐标打印出来。\\n transform = listener.lookupTransform(\'turtle_b_frame\', \'turtle_a_frame\', rospy.Time())\\n print transform\\n except Exception as e:\\n print e\\n rate.sleep()\\n
\\ncopy\\n我们可以这样理解,因为乌龟 B 要追着乌龟 A 跑,我们就以乌龟 B 为父坐标系(轴心),时时获取乌龟 A 的位置,然后通过计算得出线速度和角速度,完成跟随乌龟 A 的操作。
\\nprint msg\\nprint \'-------\'\\ncopy\\n•重新运行:\\ncd /home/shiyanlou/ws\\nroslaunch demopy demo.launch\\ncopy
\\n乌龟 B 为父坐标系,此时坐标轴是以乌龟 B 为轴心,以小乌龟 B 头的朝向为 X 轴,乌龟 A 在乌龟 B 的坐标系中的坐标是[4.5,-4.5]。\\n•根据上面求出的位置关系,计算出乌龟 B 的跟随路线\\n乌龟 A 和乌龟 B 的线性距离,其实就是三角形的边长。乌龟 B 想要跟在乌龟 A 后面,需要旋转一个弧度,根据三角函数可以得知,这个弧度值就是 Y 坐标除以 X 坐标。代码中循环的频率是每秒十次,单位时间片也就是 0.1。有了这些数据我们就可以随着乌龟 A 的移动而跟着移动。\\n•在 turtle_b.py 文件中进行计算,控制小乌龟 b 进行移动\\n#! /usr/bin/env python
\\nimport rospy\\nfrom turtlesim.srv import Spawn,SpawnRequest,SpawnResponse\\nfrom math import radians, sqrt, atan2\\nfrom geometry_msgs.msg import Twist\\nfrom turtlesim.msg import Pose\\nfrom tf.broadcaster import TransformBroadcaster\\nfrom tf.transformations import quaternion_from_euler\\nfrom tf.listener import TransformListener
\\ndef pose_callback(msg):\\nif not isinstance(msg,Pose): return\\n# print msg\\n# print \'-------\'\\n# 展示的是一个2D图,Z轴固定就是0\\ntranslation =(msg.x, msg.y, 0)\\n# 姿态只是Z轴角度的变化,X,Y轴没变化,转成四元素的表达方式\\nrotation = quaternion_from_euler(0,0,msg.theta)\\n# 当前时间戳\\ntime = rospy.Time().now()\\nbroadcaster = TransformBroadcaster()\\n# turtle_b_frame 就是我们定义的子坐标系 名字可以随意取\\n# world 就是我们定义的父坐标系 名字可以随意取\\nbroadcaster.sendTransform(translation,rotation,time,\'turtle_b_frame\',\'world\')
\\nif name == \'main\':\\n# 创建node\\nnode_name = \\"turtle_b_control_node\\"\\nrospy.init_node(node_name)\\nturtle_name = \'turtle_b_follow\'\\n# 创建一只小乌龟b\\nclient = rospy.ServiceProxy(\'/spawn\', Spawn)\\nrospy.wait_for_service(\'/spawn\')\\nrequest = SpawnRequest()\\nrequest.x = 1\\nrequest.y = 1\\nrequest.name = turtle_name\\n# 角度转弧度\\nrequest.theta = radians(90)\\nclient.call(request)\\nclient.close()
\\n# 测试代码 控制小乌龟b进行移动\\npublisher = rospy.Publisher(\'/turtle_b_follow/cmd_vel\', Twist, queue_size=1000)\\n\\n# 获取小乌龟b的位姿\\nrospy.Subscriber(\'/{}/pose\'.format(turtle_name), Pose, pose_callback)\\n\\nlistener = TransformListener()\\nrate = rospy.Rate(10)\\n# 循环去从TF中获取坐标关系。\\nwhile not rospy.is_shutdown():\\n # 捕获下异常,因存在时间差,可能TF还没收到发送过去的关系数据,这边就去取,导致两个坐标系的关系构建失败。\\n try:\\n # 这里求解的是子坐标系乌龟A,在父坐标系乌龟B中,它的坐标是如何描述的,并把坐标打印出来。\\n transform = listener.lookupTransform(\'turtle_b_frame\', \'turtle_a_frame\', rospy.Time())\\n print transform\\n # 接收位置参数\\n x, y, z = transform[0]\\n # 乌龟A和乌龟B的线性距离 = 三角形求边长\\n distance = sqrt(x ** 2 + y ** 2)\\n # 转动的弧度值\\n angular = atan2(y, x)\\n twist = Twist()\\n # 线速度= 距离 / 时间\\n twist.linear.x = distance / 0.1\\n # 角速度= 弧度值 / 时间\\n twist.angular.z = angular / 0.1\\n publisher.publish(twist)\\n except Exception as e:\\n print e\\n rate.sleep()\\n
\\ncopy\\n•重新运行:\\ncd /home/shiyanlou/ws\\nroslaunch demopy demo.launch\\ncopy
\\n运行后发现乌龟 B 速度太快了,我们需要进行 PID 控制器的参数调整(KP KI KD)。通常这种位置操作过程中首先是解决 KP 的操作。(不会用到 KI,KI 属于历史累加数据,是为了做正负抵消,这里的距离是开根号出来的不会有负数。)\\ntwist.linear.x = kp * distance / 0.1 = kp / 0.1 * distance ,我们把 kp / 0.1 整体可以看成是 kp 系数,也就是 twist.linear.x = kp * distance。同理,角速度也可以转换成 twist.angular.z = kp * angular。\\n我们可以自己测试一些 kp 值,看下效果。\\n•完整代码\\n#! /usr/bin/env python
\\nimport rospy\\nfrom turtlesim.srv import Spawn,SpawnRequest,SpawnResponse\\nfrom math import radians, sqrt, atan2\\nfrom geometry_msgs.msg import Twist\\nfrom turtlesim.msg import Pose\\nfrom tf.broadcaster import TransformBroadcaster\\nfrom tf.transformations import quaternion_from_euler\\nfrom tf.listener import TransformListener
\\ndef pose_callback(msg):\\nif not isinstance(msg,Pose): return\\n# print msg\\n# print \'-------\'\\n# 展示的是一个2D图,Z轴固定就是0\\ntranslation =(msg.x, msg.y, 0)\\n# 姿态只是Z轴角度的变化,X,Y轴没变化,转成四元素的表达方式\\nrotation = quaternion_from_euler(0,0,msg.theta)\\n# 当前时间戳\\ntime = rospy.Time().now()\\nbroadcaster = TransformBroadcaster()\\n# turtle_b_frame 就是我们定义的子坐标系 名字可以随意取\\n# world 就是我们定义的父坐标系 名字可以随意取\\nbroadcaster.sendTransform(translation,rotation,time,\'turtle_b_frame\',\'world\')
\\nif name == \'main\':\\n# 创建node\\nnode_name = \\"turtle_b_control_node\\"\\nrospy.init_node(node_name)\\nturtle_name = \'turtle_b_follow\'\\n# 创建一只小乌龟b\\nclient = rospy.ServiceProxy(\'/spawn\', Spawn)\\nrospy.wait_for_service(\'/spawn\')\\nrequest = SpawnRequest()\\nrequest.x = 1\\nrequest.y = 1\\nrequest.name = turtle_name\\n# 角度转弧度\\nrequest.theta = radians(90)\\nclient.call(request)\\nclient.close()
\\n# 测试代码 控制小乌龟b进行移动\\npublisher = rospy.Publisher(\'/turtle_b_follow/cmd_vel\', Twist, queue_size=1000)\\n\\n# 获取小乌龟b的位姿\\nrospy.Subscriber(\'/{}/pose\'.format(turtle_name), Pose, pose_callback)\\n\\nlistener = TransformListener()\\nrate = rospy.Rate(10)\\n# 循环去从TF中获取坐标关系。\\nwhile not rospy.is_shutdown():\\n # 捕获下异常,因存在时间差,可能TF还没收到发送过去的关系数据,这边就去取,导致两个坐标系的关系构建失败。\\n try:\\n # 这里求解的是子坐标系乌龟A,在父坐标系乌龟B中,它的坐标是如何描述的,并把坐标打印出来。\\n transform = listener.lookupTransform(\'turtle_b_frame\', \'turtle_a_frame\', rospy.Time())\\n print transform\\n # 接收位置参数\\n x, y, z = transform[0]\\n # 乌龟A和乌龟B的线性距离 = 三角形求边长\\n distance = sqrt(x ** 2 + y ** 2)\\n # 转动的弧度值\\n angular = atan2(y, x)\\n twist = Twist()\\n # 线速度= 距离 / 时间,添加kp系数\\n twist.linear.x = 1.0 * distance\\n # 角速度= 弧度值 / 时间,添加kp系数\\n twist.angular.z = 3.0 * angular\\n publisher.publish(twist)\\n except Exception as e:\\n print e\\n rate.sleep()\\n
\\ncopy\\n下一步\\n点击下方环境窗口,开启实战\\n剩余实验次数: 3\\n默认环境
\\n保存的环境1
\\n保存于《ROS 机器人操作系统初级教程-编写简单的消息发布器和订阅器 (C++)》\\n(有效期剩余19天)\\n删除 >\\n注意:不同课程要求的实验环境不同,您保存的环境不一定适配当前课程
\\n","description":"TF 坐标转换 章节 步骤 报告 讨论 代码实现乌龟跟随效果 •首先初始化一个工作空间: mkdir -p /home/shiyanlou/ws/src cd /home/shiyanlou/ws catkin_make copy •进入 ws/src 目录下,执行如下命令创建名为 demopy 的 Package 以及包下面的 scripts 文件夹: cd /home/shiyanlou/ws/src catkin_create_pkg demopy roscpp rospy rosmsg mkdir /home/shiyanlou/ws/src…","guid":"730250","author":"lanqiao7948419120","authorUrl":null,"authorAvatar":null,"publishedAt":"2024-11-05T01:16:46.573Z","media":null,"categories":null,"attachments":null,"extra":null,"language":null},{"title":"C语言软件","url":"https://www.lanqiao.cn/questions/729511/","content":"c语言用什么软件
\\n","description":"c语言用什么软件","guid":"729511","author":"lanqiao1099588746","authorUrl":null,"authorAvatar":null,"publishedAt":"2024-11-03T16:03:47.265Z","media":null,"categories":null,"attachments":null,"extra":null,"language":null},{"title":"c++链接","url":"https://www.lanqiao.cn/questions/727809/","content":"老师能不能发一下C++11的下载链接,谢谢老师
\\n","description":"老师能不能发一下C++11的下载链接,谢谢老师","guid":"727809","author":"Lucas","authorUrl":null,"authorAvatar":null,"publishedAt":"2024-11-01T16:15:31.677Z","media":null,"categories":null,"attachments":null,"extra":null,"language":null},{"title":"萌新前来求教","url":"https://www.lanqiao.cn/questions/727806/","content":"#include<bits/stdc++.h>\\nusing namespace std;\\nstruct cq{\\nint d,h;\\n}a[100005];\\nbool func(cq a,cq b){\\nif(a.d==b.d){\\nreturn a.h<b.h;\\n}\\nreturn a.d>b.d;\\n}\\nint main(void){\\nint n=0,cnt=0,m=0\\n ;\\ncin>>n;\\nfor(int i=0;i<n;i++){\\ncin>>a[i].d>>a[i].h;\\n}\\nstable_sort(a,a+n,func);\\n//for(int i=0;i<n;i++){\\n//cout<<a[i].d<<\\" \\"<<a[i].h<<endl;\\n//}\\nfor(int i=0,j=0;i<n;i++){\\nif(a[i].d==a[i+1].d){\\ncontinue;\\n}\\nm=max(a[i].h,m);\\n//for(j=0;j<i;j++){\\n//m=max(m,a[j].h);\\n//}\\nif(m==a[i].h){\\ncnt++;\\n}\\n//for(j=i+1;j<n;j++){\\n//if(a[j].h>=a[i].h){\\n//break;\\n//}\\n//}\\n//if(j==n){\\n//cnt++;\\n//}\\n//j=0;\\n}\\ncout<<cnt;\\nreturn 0;\\n}\\n
\\n","description":"问题1:为什么每个瓷器重新循环遍历之前瓷器的高度反而会有问题? 问题2:现在这个是九十分的版本,还有哪些不足?\\n代码思路:按照降序排d,升序排h,然后遍历之前所有瓷器的最大值来检验是否独特\\n#include如题,为何呢
\\n","description":"如题,为何呢","guid":"727505","author":"xiaoying236","authorUrl":null,"authorAvatar":null,"publishedAt":"2024-11-01T09:19:24.404Z","media":[{"url":"https://dn-simplecloud.shiyanlou.com/courses/uid401587-20241101-1730452751549","type":"photo","width":847,"height":164,"blurhash":"L36RT0xuM{t8$vWBofof4;oft7WV"}],"categories":null,"attachments":null,"extra":null,"language":null},{"title":"后端好像没连上","url":"https://www.lanqiao.cn/questions/727351/","content":"大哥,脚本也运行了,数据库里面也有用户,但是前端显示不出来,登陆注册功能也用不了,编译也没问题,这是为啥呢
保存环境后重新打开,run一下,提示编译完成(编译,未运行),再次run,便报错,每次不是编译完成就是报错\\n\\n看了也没发生端口占用的情况,难道后台的依赖更新了?
大哥这个报错是为什么!
为什么ll /var/spool/cron/crontabs报错无法打开目录/var/spool/cron/crontabs:权限不够
\\n","description":"为什么ll /var/spool/cron/crontabs报错无法打开目录/var/spool/cron/crontabs:权限不够","guid":"726626","author":"lanqiao5621636665","authorUrl":null,"authorAvatar":null,"publishedAt":"2024-10-31T03:00:26.639Z","media":null,"categories":null,"attachments":null,"extra":null,"language":null},{"title":"判断一直超时,为啥?","url":"https://www.lanqiao.cn/questions/725798/","content":"createWork.sql文件:\\nCREATE database demo;\\nuse demo;\\nCREATE TABLE work(\\nID INT(10) NOT NULL PRIMARY KEY,\\nName VARCHAR(20) NOT NULL,\\nAge INT(3),\\nSalary INT(7)\\n);\\n\\nINSERT INTO work values\\n(1, \\"zhangsan\\", 30, 11000),\\n(2,\\"Rong\\",29,11000);\\n\\n\\ncheckout文件:\\nmysqldump -u root -p --lock-all-tables --databases demo > demo.sql \\n\\n打开数据库运行了:SOURCE /home/project/createWork.sql\\n关闭数据库,在终端运行了:cat /home/project/checkout | bash\\n\\n提交一直显示超时??真卡住了\\n
\\n","description":"createWork.sql文件: CREATE database demo;\\nuse demo;\\nCREATE TABLE work(\\nID INT(10) NOT NULL PRIMARY KEY,\\nName VARCHAR(20) NOT NULL,\\nAge INT(3),\\nSalary INT(7)\\n);\\n\\nINSERT INTO work values\\n(1, \\"zhangsan\\", 30, 11000),\\n(2,\\"Rong\\",29,11000);\\n\\n\\ncheckout文件:\\nmysqldump -u root -p --lock-all…","guid":"725798","author":"Bhaizeix","authorUrl":null,"authorAvatar":null,"publishedAt":"2024-10-29T14:40:17.180Z","media":null,"categories":null,"attachments":null,"extra":null,"language":null},{"title":"??卡了有点久,晚于****-**-**的录入","url":"https://www.lanqiao.cn/questions/725710/","content":"# 使用检查约束限制 emp 表中入职日期 hiredate 晚 于2022 年 2 月 28 日 的信息录入\\n# hiredate > \'2022-02-28\' 会报错:\\n# ERROR 3819 (HY000): Check constraint \'cik_hirdate\' is violated.已有数据不满足条件无法增加检查约束\\n\\n已通关\\nALter TAble emp ADD CONSTRAINT cik_hirdate CHECK (hiredate <= \'2022-02-28\');\\n\\n
\\n","description":"# 使用检查约束限制 emp 表中入职日期 hiredate 晚 于2022 年 2 月 28 日 的信息录入 # hiredate > \'2022-02-28\' 会报错:\\n# ERROR 3819 (HY000): Check constraint \'cik_hirdate\' is violated.已有数据不满足条件无法增加检查约束\\n\\n已通关\\nALter TAble emp ADD CONSTRAINT cik_hirdate CHECK (hiredate <= \'2022-02-28\');","guid":"725710","author":"Bhaizeix","authorUrl":null,"authorAvatar":null,"publishedAt":"2024-10-29T13:18:15.372Z","media":null,"categories":null,"attachments":null,"extra":null,"language":null},{"title":"这里应该是笔误吧?","url":"https://www.lanqiao.cn/questions/725453/","content":"\\n应该是price1不是price2
为啥章节学习过了,它那里显示还是未完成的状态?
\\n","description":"为啥章节学习过了,它那里显示还是未完成的状态?","guid":"725431","author":"LOU254729063","authorUrl":null,"authorAvatar":null,"publishedAt":"2024-10-29T06:56:17.271Z","media":null,"categories":null,"attachments":null,"extra":null,"language":null},{"title":"上节课貌似没有看到下图提到的内容呢?","url":"https://www.lanqiao.cn/questions/725234/","content":"function getType (target) {\\nif (target === null) {\\nreturn \'null\';\\n}\\nif (target === undefined) {\\nreturn \'undefined\';\\n}\\nreturn Object.prototype.toString.call(target).slice(8, -1).toLowerCase();\\n//首先拿到原型上的tostring这个方法 这个方法默认指向是 Object.prototype 返回一个对象类型 我们使用call改变指向 把指向换成传入进来的参数 如果这个参数是数组 他就会检索这个数组是什么类型而不是检索 Object.prototype这个对象 指向完后 返回object array 直接切片到最后一个最好把所有大写返回即可\\n}
\\nmodule.exports = getType
\\n","description":"function getType (target) { if (target === null) { return \'null\'; } if (target === undefined) { return \'undefined\'; } return Object.prototype.toString.call(target).slice(8, -1).toLowerCase(); //首先拿到原型上的tostring这个方法 这个方法默认指向是 Object.prototype 返回一个对象类型 我们使用call改变指向 把指向换成传入进来的参数…","guid":"724776","author":"lanqiao2017046493","authorUrl":null,"authorAvatar":null,"publishedAt":"2024-10-28T06:07:52.185Z","media":null,"categories":null,"attachments":null,"extra":null,"language":null},{"title":"无法访问test,没有那个文件或目录","url":"https://www.lanqiao.cn/questions/723621/","content":"python 3 游乐场怎么从剪切板上黏贴呀,卡住了
\\n","description":"python 3 游乐场怎么从剪切板上黏贴呀,卡住了","guid":"723464","author":"lanqiao9594033938","authorUrl":null,"authorAvatar":null,"publishedAt":"2024-10-25T15:09:24.187Z","media":null,"categories":null,"attachments":null,"extra":null,"language":null},{"title":"连接超时....","url":"https://www.lanqiao.cn/questions/723434/","content":"请教各位大佬,为什么总提示type\\"gender\\" does not exist呢
\\n","description":"请教各位大佬,为什么总提示type\\"gender\\" does not exist呢","guid":"722440","author":"王雪","authorUrl":null,"authorAvatar":null,"publishedAt":"2024-10-24T07:56:20.422Z","media":null,"categories":null,"attachments":null,"extra":null,"language":null},{"title":"请问这个界面在哪呀?","url":"https://www.lanqiao.cn/questions/722107/","content":"太卡了\\n启动后的界面完全和教程不一样
\\n","description":"太卡了 启动后的界面完全和教程不一样","guid":"721776","author":"lanqiao6100953406","authorUrl":null,"authorAvatar":null,"publishedAt":"2024-10-23T04:18:01.979Z","media":null,"categories":null,"attachments":null,"extra":null,"language":null},{"title":"小疑问提问","url":"https://www.lanqiao.cn/questions/721622/","content":"这个没说传参吧,还是我没仔细听
\\n","description":"这个没说传参吧,还是我没仔细听","guid":"721622","author":"lanqiao1664111713","authorUrl":null,"authorAvatar":null,"publishedAt":"2024-10-22T14:57:05.849Z","media":null,"categories":null,"attachments":null,"extra":null,"language":null},{"title":"为什么输出结果是空list呢?","url":"https://www.lanqiao.cn/questions/721288/","content":"下图这两个地方应该是 l 吧,不然第5行就没意义了\\n
另外不太理解为什么改成 l 后,输出的结果是空list
\\n改成 l :\\n
输出结果是空list:\\n
单独运行以下代码时:\\n
输出结果却是正常的:\\n
大哥,这为啥没有连接呢!
问题1:\\n按图文教程里的代码,总是报错:\\n原文:
\\n实际输入代码:\\n
结果报错:\\n
问题2:\\n原文中的以下两个图的代码也不一致:\\n一个是0×开头的,还有小写存在一个是U+开头的,都是大写的
\\n图一:
\\n图二:\\n
问题3:\\n我把问题1的代码改成问题2里的图二如下,也还是报错:
\\n实际输入代码:\\n
结果报错:\\n
请问这个图片怎么来的呢?\\n
没有出现紫色那几个界面,后面步骤卡在root要输入密码。\\n已经重启了好几遍环境,按步骤输入指令,数据库版本也是对的,但走不通:\\n\\n
\\n各位朋友,大师,有人能知道这个是为什么吗?孩子要碎了,求救
大哥,终端输入这段代码后就变这样了是为什么
看了前面关于成员方法和函数的区别,觉得下面这两个应该改成“成员方法”:\\n
不确定是不是我个人电脑设置的问题,如下图:\\n\\n
新旧对比,不需要newNode吗\\n
谁能说说蓝桥杯自带的实验台怎么打开
\\n","description":"谁能说说蓝桥杯自带的实验台怎么打开","guid":"719805","author":"不获奖不改名","authorUrl":null,"authorAvatar":null,"publishedAt":"2024-10-19T13:52:09.218Z","media":null,"categories":null,"attachments":null,"extra":null,"language":null},{"title":"求大佬解惑","url":"https://www.lanqiao.cn/questions/719415/","content":"思路:给h排序,随后找到后方所有d中的最大值,与其进行比较,flag用于排除相等\\n一开始是和后方的一个个比较,一有比它大的就跳出,两种都是50分\\n#include <bits/stdc++.h>\\nusing namespace std;\\nstruct cq{\\nint h,d;\\n}A[10005];\\nbool func(cq a,cq b){//给h排序\\nif(a.h!=b.h)\\nreturn a.h<b.h;\\nreturn a.d<b.d;\\n}\\nint main(){\\nbool flag=true;\\nint N=0,cnt=0;\\ncin>>N;\\nfor(int i=0;i<N;i++){\\ncin>>A[i].d>>A[i].h;\\n}\\nsort(A,A+N,func);\\n// for(int i=0;i<N;i++){\\n// cout<<\\"I:\\"<<i<<\\" \\"<<A[i].d<<\\" \\"<<A[i].h<<endl;\\n// }\\nfor(int i=0;i<N;i++){\\nint maxd=A[i].d;//初始化得到一个比较值\\nfor(int j=i+1;j<N;j++){\\nif(maxd==A[j].d){//鉴定有无等值\\nflag=false;\\nbreak;\\n}else{\\nmaxd=max(maxd,A[j].d);\\n}\\n}\\nif(maxd==A[i].d&&flag){//等值且未被修改即为独特\\ncnt++;\\n}\\nflag=true;//及时初始化\\n}\\ncout<<cnt;\\nreturn 0;\\n}
\\n","description":"思路:给h排序,随后找到后方所有d中的最大值,与其进行比较,flag用于排除相等 一开始是和后方的一个个比较,一有比它大的就跳出,两种都是50分 #include实际工作中,外企通常把“战略上的”翻译成strategic,表示长期的策略,把“战术上的”翻译成tactical,表示短期的策略,所以下图的”战略“改成”战术“应该会比较合适吧\\n
我在编译器上运行的也是正确的,为啥这上边显示答案错误呢
\\n#include <stdio.h>\\nint main()\\n{\\nint x,y,N,i;\\nscanf(\\"%d\\",&N);\\nfor(i=0;i<N;i++);\\n{\\nscanf(\\"%d %d\\",&x,&y);\\nint Num;\\nif(y!=x&&y!=x-2) Num=-1;\\nelse{\\nif(y==x&&x%2==0) Num=2x;\\nelse if(y==x&&x%2!=0) Num=2x-1;\\nelse if(y==x-2&&x%2==0) Num=2x-2;\\nelse Num=2x-3;\\n}\\nif(Num==-1) printf(\\"No Number\\\\n\\");\\nelse printf(\\"%d\\\\n\\",Num);\\n}\\nreturn 0;\\n}
\\n","description":"我在编译器上运行的也是正确的,为啥这上边显示答案错误呢 #include两种方法都试了,依然报错。\\n
源码\\nimport mysql.connector
\\nconfig = {\\n\'user\': \'root\',\\n\'password\': \'\', # 如果有密码,请确保这里填写正确\\n\'host\': \'localhost\',\\n\'database\': \'lanqiao\' # 确保这是你的数据库名\\n}
\\ncnx = mysql.connector.connect(**config)\\ncursor = cnx.cursor()
\\ntable_names = [\\n\'lanqiao28d40778\', \'lanqiao2bfc68ab\', \'lanqiao67f9f294\',\\n\'lanqiao69edd7d4\', \'lanqiao84492872\', \'lanqiao86340873\',\\n\'lanqiao97420bd8\', \'lanqiaoc2d12629\', \'lanqiaoc660bdbf\',\\n\'lanqiaof7487ba1\'\\n]\\nfield_name = \\"lanqiao_key\\"
\\nfor table_name in table_names:\\n# 构建查询语句,查询特定字段的所有不同值\\nquery = f\\"\\"\\"\\nSELECT DISTINCT {field_name}
\\nFROM {table_name}
;\\n\\"\\"\\"\\ntry:\\ncursor.execute(query)\\n# 获取查询结果\\nresults = cursor.fetchall()\\n# 打印表名和查询到的值\\nprint(f\\"Table: {table_name}, Values: {[r[0] for r in results]}\\")\\nexcept mysql.connector.Error as err:\\nprint(f\\"Something went wrong: {err}\\")
cursor.close()\\ncnx.close()
\\n","description":"源码 import mysql.connector config = { \'user\': \'root\', \'password\': \'\', # 如果有密码,请确保这里填写正确 \'host\': \'localhost\', \'database\': \'lanqiao\' # 确保这是你的数据库名 }\\n\\ncnx = mysql.connector.connect(**config) cursor = cnx.cursor()\\n\\ntable_names = [ \'lanqiao28d40778\', \'lanqiao2bfc68ab…","guid":"717913","author":"consultant","authorUrl":null,"authorAvatar":null,"publishedAt":"2024-10-16T04:11:20.913Z","media":null,"categories":null,"attachments":null,"extra":null,"language":null},{"title":"能帮我看下为什么一直warning吗","url":"https://www.lanqiao.cn/questions/717619/","content":"粗体文本
粗体文本
111111
\\n","description":"111111","guid":"717511","author":"李振宇","authorUrl":null,"authorAvatar":null,"publishedAt":"2024-10-15T06:09:14.845Z","media":null,"categories":null,"attachments":null,"extra":null,"language":null},{"title":"图文教程这里的s应该是o吧?","url":"https://www.lanqiao.cn/questions/716547/","content":"如下图,和前文对应应该是o:\\n\\n前文:\\n
\\n试了很多遍了 为什么还是打不开啊
刚输入替换1-6行的命令时,选中的确实是1-6行:\\n\\n按完回车后,选了所有的行:\\n
main.py和get_fruits.py的代码未列出:\\n
是否如下:\\nmain.py\\n
get_fruits.py (删掉了total那一部分的计算代码)\\n
题目不是说超过人数的一半吗,为啥答案是大于等于啊
\\n","description":"题目不是说超过人数的一半吗,为啥答案是大于等于啊","guid":"715184","author":"lanqiao5185752755","authorUrl":null,"authorAvatar":null,"publishedAt":"2024-10-09T15:20:14.159Z","media":null,"categories":null,"attachments":null,"extra":null,"language":null},{"title":"add_requires, add_packages 接口配置后,执行出现报错","url":"https://www.lanqiao.cn/questions/714975/","content":"在xmake.lua代码更新成课件同步后,\\nxmake f -c 和 xmake -y 都会报错,请问这是什么原因。
\\n报错如下:
\\n如下图:\\n
按照课件,回到vim,自己新建了一个.py文件,粘贴了下面的语句:\\n\\n但执行时却报错:\\n
\\n反而是在shell里面可以运行成功,但却没有课件截图前面的序号出现。想知道怎么在vim里可以运行成功呢?\\n课件里运行的结果:
shell里运行的结果:\\n
按照以下课件的操作说明:\\n\\n执行后却报错了,如下:\\n
\\n去掉参数后就可以了\\n
如题。\\n我的输入输出:\\n\\n老师的输入输出:\\n
#include<bits/stdc++.h>\\nusing namespace std;\\nconst long long N = 1e5;
\\nint main() {\\nint n; cin >> n;//数字序列个数\\nint a[N] = { 0 };//各数字的个数\\nvector<int>b;//有哪些数字\\nint num;\\nfor (int i = 0; i < n; i++) {\\ncin >> num;\\nb.push_back(num);\\na[num]+=1;\\n}
\\n/* for (int i = 0; i < 20; i++) {\\nif (a[i] != 0) {\\nprintf(\\"a[%d]=%d\\\\n\\", i, a[i]);\\n}\\n}*/
\\nsort(b.begin(), b.end());\\nauto it = unique(b.begin(), b.end());\\nb.erase(it, b.end());\\n
\\n/* for (int i = 0; i < b.size(); i++) {\\ncout << b[i] << \' \';\\n}*/
\\nint delete_num = 0;\\nfor (int i = 0; i < b.size(); i++) {\\n if (a[b[i]] < b[i]) {\\n delete_num += a[b[i]];\\n }\\n if (a[b[i]] > b[i]) {\\n delete_num += a[b[i]] - b[i];\\n }\\n}\\n\\ncout << delete_num;\\n
\\n}\\n这份代码为什么只能过两个用例,是有什么特殊情况没考虑吗
\\n","description":"#include如题,在main方法中for(Student s:st.students){这句代码,你们的不报错吗?报错
\\n","description":"如题,在main方法中for(Student s:st.students){这句代码,你们的不报错吗?报错","guid":"712928","author":"xiaoying236","authorUrl":null,"authorAvatar":null,"publishedAt":"2024-09-30T07:25:45.880Z","media":null,"categories":null,"attachments":null,"extra":null,"language":null},{"title":"jenkins pipeline中登录私有harbo报错","url":"https://www.lanqiao.cn/questions/712739/","content":"